lexgui 8.3.0 → 8.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"CodeEditor.js","sources":["../../src/extensions/CodeEditor.ts"],"sourcesContent":["// CodeEditor.ts @jxarco\r\n\r\nimport { LX } from '../core/Namespace';\r\n\r\nif ( !LX )\r\n{\r\n throw ( 'Missing LX namespace!' );\r\n}\r\n\r\nLX.extensions.push( 'CodeEditor' );\r\n\r\n// _____ \r\n// |_ _|_ _ ___ ___ ___ \r\n// | | | | | . | -_|_ -|\r\n// |_| |_ | _|___|___|\r\n// |___|_|\r\n\r\ninterface Token\r\n{\r\n type: string; // 'keyword', 'string', 'comment', 'number', 'method', 'type', 'symbol', 'builtin', 'statement', 'preprocessor', 'text'\r\n value: string;\r\n}\r\n\r\ninterface TokenRule\r\n{\r\n match: RegExp;\r\n type: string;\r\n next?: string; // push this state\r\n pop?: boolean | number; // pop back to previous state (true = 1, or specify number of pops)\r\n}\r\n\r\ninterface LanguageDef\r\n{\r\n name: string;\r\n extensions: string[];\r\n states: Record<string, TokenRule[]>;\r\n lineComment?: string;\r\n icon?: string | Record<string, string>;\r\n reservedWords: string[];\r\n}\r\n\r\ninterface TokenizerState\r\n{\r\n stack: string[]; // state stack, e.g. ['root'] or ['root', 'blockComment']\r\n}\r\n\r\ninterface TokenizeResult\r\n{\r\n tokens: Token[];\r\n state: TokenizerState;\r\n}\r\n\r\n// _____ _ _ _ _ _ _ \r\n// | | | |_|_| |_| |_|_|___ ___ \r\n// | | | _| | | | _| | -_|_ -|\r\n// |_____|_| |_|_|_|_| |_|___|___|\r\n\r\nfunction firstNonspaceIndex( str: string ): number\r\n{\r\n const index = str.search( /\\S|$/ );\r\n return index < str.length ? index : -1;\r\n}\r\n\r\nfunction isSymbol( str: string ): boolean\r\n{\r\n return /[^\\w\\s]/.test( str );\r\n}\r\n\r\nfunction isWord( str: string ): boolean\r\n{\r\n return /\\w/.test( str );\r\n}\r\n\r\nfunction getLanguageIcon( langDef: LanguageDef | undefined, extension?: string ): string\r\n{\r\n if ( !langDef?.icon )\r\n {\r\n return 'FileCode text-neutral-500'; // default icon\r\n }\r\n\r\n if ( typeof langDef.icon === 'string' )\r\n {\r\n return langDef.icon;\r\n }\r\n\r\n if ( extension && langDef.icon[ extension ] )\r\n {\r\n return langDef.icon[ extension ];\r\n }\r\n\r\n const firstIcon = Object.values( langDef.icon )[0];\r\n return firstIcon || 'FileCode text-neutral-500';\r\n}\r\n\r\n// _____ _ _ \r\n// |_ _|___| |_ ___ ___|_|___ ___ ___ \r\n// | | | . | '_| -_| | |- _| -_| _|\r\n// |_| |___|_,_|___|_|_|_|___|___|_|\r\n\r\nexport class Tokenizer\r\n{\r\n private static languages: Map<string, LanguageDef> = new Map();\r\n private static extensionMap: Map<string, string> = new Map(); // ext -> language name\r\n\r\n static registerLanguage( def: LanguageDef ): void\r\n {\r\n Tokenizer.languages.set( def.name, def );\r\n for ( const ext of def.extensions )\r\n {\r\n Tokenizer.extensionMap.set( ext, def.name );\r\n }\r\n }\r\n\r\n static getLanguage( name: string ): LanguageDef | undefined\r\n {\r\n return Tokenizer.languages.get( name );\r\n }\r\n\r\n static getLanguageByExtension( ext: string ): LanguageDef | undefined\r\n {\r\n const name = Tokenizer.extensionMap.get( ext );\r\n return name ? Tokenizer.languages.get( name ) : undefined;\r\n }\r\n\r\n static getRegisteredLanguages(): string[]\r\n {\r\n return Array.from( Tokenizer.languages.keys() );\r\n }\r\n\r\n static initialState(): TokenizerState\r\n {\r\n return { stack: [ 'root' ] };\r\n }\r\n\r\n /**\r\n * Tokenize a single line given a language and the state from the previous line.\r\n * Returns the tokens and the updated state for the next line.\r\n */\r\n static tokenizeLine( line: string, language: LanguageDef, state: TokenizerState ): TokenizeResult\r\n {\r\n const tokens: Token[] = [];\r\n const stack = [ ...state.stack ]; // clone\r\n\r\n let pos = 0;\r\n\r\n while ( pos < line.length )\r\n {\r\n const currentState = stack[ stack.length - 1 ];\r\n const rules = language.states[ currentState ];\r\n\r\n if ( !rules )\r\n {\r\n // No rules for this state, so emit rest as text\r\n tokens.push( { type: 'text', value: line.slice( pos ) } );\r\n pos = line.length;\r\n break;\r\n }\r\n\r\n let matched = false;\r\n\r\n for ( const rule of rules )\r\n {\r\n // Anchor regex at current position\r\n const regex = new RegExp( rule.match.source, 'y' + ( rule.match.flags.replace( /[gy]/g, '' ) ) );\r\n regex.lastIndex = pos;\r\n const m = regex.exec( line );\r\n\r\n if ( m )\r\n {\r\n if ( m[0].length === 0 )\r\n {\r\n // Zero-length match, skipping to avoid infinite loop...\r\n continue;\r\n }\r\n\r\n tokens.push( { type: rule.type, value: m[0] } );\r\n pos += m[0].length;\r\n\r\n // State transitions\r\n if ( rule.next )\r\n {\r\n stack.push( rule.next );\r\n }\r\n else if ( rule.pop )\r\n {\r\n const popCount = typeof rule.pop === 'number' ? rule.pop : 1;\r\n for ( let i = 0; i < popCount && stack.length > 1; i++ )\r\n {\r\n stack.pop();\r\n }\r\n }\r\n\r\n matched = true;\r\n break;\r\n }\r\n }\r\n\r\n if ( !matched )\r\n {\r\n // No rule matched, consume one character as text either merged or as a new token\r\n const lastToken = tokens[ tokens.length - 1 ];\r\n if ( lastToken && lastToken.type === 'text' )\r\n {\r\n lastToken.value += line[ pos ];\r\n }\r\n else\r\n {\r\n tokens.push( { type: 'text', value: line[ pos ] } );\r\n }\r\n pos++;\r\n }\r\n }\r\n\r\n const merged = Tokenizer._mergeTokens( tokens );\r\n\r\n return { tokens: merged, state: { stack } };\r\n }\r\n\r\n /**\r\n * Merge consecutive tokens with the same type into one.\r\n */\r\n private static _mergeTokens( tokens: Token[] ): Token[]\r\n {\r\n if ( tokens.length === 0 ) return tokens;\r\n\r\n const result: Token[] = [ tokens[0] ];\r\n\r\n for ( let i = 1; i < tokens.length; i++ )\r\n {\r\n const prev = result[ result.length - 1 ];\r\n if ( tokens[i].type === prev.type )\r\n {\r\n prev.value += tokens[i].value;\r\n }\r\n else\r\n {\r\n result.push( tokens[i] );\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n}\r\n\r\nLX.Tokenizer = Tokenizer;\r\n\r\n// __ _____ _ \r\n// | | ___ ___ ___ _ _ ___ ___ ___ | | |___| |___ ___ ___ ___ \r\n// | |__| .'| | . | | | .'| . | -_| | | -_| | . | -_| _|_ -|\r\n// |_____|__,|_|_|_ |___|__,|_ |___| |__|__|___|_| _|___|_| |___|\r\n// |___| |___| |_|\r\n\r\n/**\r\n * Build a word-boundary regex from a list of words to use as a language rule \"match\".\r\n * e.g. words(['const', 'let', 'var']) → /\\b(?:const|let|var)\\b/\r\n */\r\nfunction words( list: string[] ): RegExp\r\n{\r\n return new RegExp( '\\\\b(?:' + list.join( '|' ) + ')\\\\b' );\r\n}\r\n\r\n/**\r\n * Common state rules reusable across C-like languages.\r\n */\r\nconst CommonStates: Record<string, TokenRule[]> = {\r\n blockComment: [\r\n { match: /\\*\\//, type: 'comment', pop: true },\r\n { match: /[^*]+/, type: 'comment' },\r\n { match: /\\*/, type: 'comment' },\r\n ],\r\n doubleString: [\r\n { match: /\\\\./, type: 'string' },\r\n { match: /\"/, type: 'string', pop: true },\r\n { match: /[^\"\\\\]+/, type: 'string' },\r\n ],\r\n singleString: [\r\n { match: /\\\\./, type: 'string' },\r\n { match: /'/, type: 'string', pop: true },\r\n { match: /[^'\\\\]+/, type: 'string' },\r\n ],\r\n};\r\n\r\n/** Common number rules for C-like languages. */\r\nconst NumberRules: TokenRule[] = [\r\n // Binary: 0b1010, 0B1010\r\n { match: /0[bB][01]+(?:[uU][lL]{0,2}|[lL]{1,2}[uU]?)?\\b/, type: 'number' },\r\n // Hex: 0xFF, 0xDEADBEEF, 0xFFu, 0xFFul, 0xFFull\r\n { match: /0[xX][0-9a-fA-F]+(?:[uU][lL]{0,2}|[lL]{1,2}[uU]?)?\\b/, type: 'number' },\r\n // Octal: 0o77, 0O77\r\n { match: /0[oO][0-7]+(?:[uU][lL]{0,2}|[lL]{1,2}[uU]?)?\\b/, type: 'number' },\r\n // Decimal with optional suffix: 123, 123.456, 1.23e10, 0.5f, 16u, 100L, 42ul, 3.14d, 100m\r\n { match: /\\d+\\.?\\d*(?:[eE][+-]?\\d+)?(?:[fFdDmMlLuUiI]|[uU][lL]{0,2}|[lL]{1,2}[uU]?)?\\b/, type: 'number' },\r\n // Decimal starting with dot: .123, .5f\r\n { match: /\\.\\d+(?:[eE][+-]?\\d+)?(?:[fFdDmM])?\\b/, type: 'number' },\r\n];\r\n\r\n/** Common tail rules: method detection, identifiers, symbols, whitespace. */\r\nconst TailRules: TokenRule[] = [\r\n { match: /[a-zA-Z_$]\\w*(?=\\s*[<(])/, type: 'method' }, // function/method names (followed by < or ()\r\n { match: /[a-zA-Z_$]\\w*/, type: 'text' },\r\n { match: /[{}()\\[\\];,.:?!&|<>=+\\-*/%^~@#]/, type: 'symbol' },\r\n { match: /\\s+/, type: 'text' },\r\n];\r\n\r\n/** Template string states for JS/TS. */\r\nfunction templateStringStates( exprKeywords: string[] ): Record<string, TokenRule[]>\r\n{\r\n return {\r\n templateString: [\r\n { match: /\\\\./, type: 'string' },\r\n { match: /`/, type: 'string', pop: true },\r\n { match: /\\$\\{/, type: 'symbol', next: 'templateExpr' },\r\n { match: /[^`\\\\$]+/, type: 'string' },\r\n { match: /\\$/, type: 'string' },\r\n ],\r\n templateExpr: [\r\n { match: /\\}/, type: 'symbol', pop: true },\r\n { match: /\\/\\*/, type: 'comment', next: 'blockComment' },\r\n { match: /\\/\\/.*/, type: 'comment' },\r\n { match: /\"/, type: 'string', next: 'doubleString' },\r\n { match: /'/, type: 'string', next: 'singleString' },\r\n { match: /`/, type: 'string', next: 'templateString' },\r\n ...NumberRules,\r\n { match: words( exprKeywords ), type: 'keyword' },\r\n ...TailRules,\r\n ],\r\n };\r\n}\r\n\r\n// __ ____ ___ _ _ _ _ \r\n// | | ___ ___ ___ _ _ ___ ___ ___ | \\ ___| _|_|___|_| |_|_|___ ___ ___ \r\n// | |__| .'| | . | | | .'| . | -_| | | | -_| _| | | | _| | . | |_ -|\r\n// |_____|__,|_|_|_ |___|__,|_ |___| |____/|___|_| |_|_|_|_|_| |_|___|_|_|___|\r\n// |___| |___|\r\n\r\nTokenizer.registerLanguage( {\r\n name: 'Plain Text',\r\n extensions: [ 'txt' ],\r\n states: {\r\n root: [\r\n { match: /.+/, type: 'text' }\r\n ]\r\n },\r\n reservedWords: [],\r\n icon: 'FileText text-neutral-500'\r\n} );\r\n\r\n// JavaScript\r\n\r\nconst jsKeywords = [\r\n 'var', 'let', 'const', 'this', 'in', 'of', 'true', 'false', 'null', 'undefined',\r\n 'new', 'function', 'class', 'extends', 'super', 'import', 'export', 'from',\r\n 'default', 'async', 'typeof', 'instanceof', 'void', 'delete', 'debugger', 'NaN',\r\n 'static', 'constructor', 'Infinity', 'abstract'\r\n];\r\n\r\nconst jsStatements = [\r\n 'for', 'if', 'else', 'switch', 'case', 'return', 'while', 'do', 'continue', 'break',\r\n 'await', 'yield', 'throw', 'try', 'catch', 'finally', 'with'\r\n];\r\n\r\nconst jsBuiltins = [\r\n 'document', 'console', 'window', 'navigator', 'performance',\r\n 'Math', 'JSON', 'Promise', 'Array', 'Object', 'String', 'Number', 'Boolean',\r\n 'RegExp', 'Error', 'Map', 'Set', 'WeakMap', 'WeakSet', 'Symbol', 'Proxy', 'Reflect'\r\n];\r\n\r\nTokenizer.registerLanguage( {\r\n name: 'JavaScript',\r\n extensions: [ 'js', 'mjs', 'cjs' ],\r\n lineComment: '//',\r\n states: {\r\n root: [\r\n { match: /\\/\\*/, type: 'comment', next: 'blockComment' },\r\n { match: /\\/\\/.*/, type: 'comment' },\r\n { match: /`/, type: 'string', next: 'templateString' },\r\n { match: /\"/, type: 'string', next: 'doubleString' },\r\n { match: /'/, type: 'string', next: 'singleString' },\r\n ...NumberRules,\r\n { match: words( jsKeywords ), type: 'keyword' },\r\n { match: words( jsBuiltins ), type: 'builtin' },\r\n { match: words( jsStatements ), type: 'statement' },\r\n { match: /(?<=\\b(?:class|enum)\\s+)[A-Z][a-zA-Z0-9_]*/, type: 'type' }, // class/enum names\r\n ...TailRules,\r\n ],\r\n ...CommonStates,\r\n ...templateStringStates( [ 'var', 'let', 'const', 'this', 'true', 'false', 'null', 'undefined', 'new', 'typeof', 'instanceof', 'void' ] ),\r\n },\r\n reservedWords: [ ...jsKeywords, ...jsStatements, ...jsBuiltins ],\r\n icon: 'Js text-yellow-500'\r\n} );\r\n\r\n// TypeScript\r\n\r\nconst tsKeywords = [\r\n ...jsKeywords,\r\n 'as', 'interface', 'type', 'enum', 'namespace', 'declare', 'private', 'protected',\r\n 'implements', 'readonly', 'keyof', 'infer', 'is', 'asserts', 'override', 'satisfies'\r\n];\r\n\r\nconst tsTypes = [\r\n 'string', 'number', 'boolean', 'any', 'unknown', 'never', 'void', 'null',\r\n 'undefined', 'object', 'symbol', 'bigint', 'Promise',\r\n 'Record', 'Partial', 'Required', 'Readonly', 'Pick', 'Omit', 'Exclude',\r\n 'Extract', 'NonNullable', 'ReturnType', 'Parameters', 'ConstructorParameters',\r\n 'InstanceType', 'Awaited'\r\n];\r\n\r\nTokenizer.registerLanguage( {\r\n name: 'TypeScript',\r\n extensions: [ 'ts', 'tsx' ],\r\n lineComment: '//',\r\n states: {\r\n root: [\r\n { match: /\\/\\*/, type: 'comment', next: 'blockComment' },\r\n { match: /\\/\\/.*/, type: 'comment' },\r\n { match: /`/, type: 'string', next: 'templateString' },\r\n { match: /\"/, type: 'string', next: 'doubleString' },\r\n { match: /'/, type: 'string', next: 'singleString' },\r\n ...NumberRules,\r\n { match: words( tsKeywords ), type: 'keyword' },\r\n { match: words( tsTypes ), type: 'type' },\r\n { match: words( jsBuiltins ), type: 'builtin' },\r\n { match: words( jsStatements ), type: 'statement' },\r\n { match: /(?<=\\b(?:class|enum|interface|type|extends|implements)\\s+)[A-Z][a-zA-Z0-9_]*/, type: 'type' }, // class/enum/interface/type names\r\n { match: /(?<=<\\s*)[A-Z][a-zA-Z0-9_]*(?=\\s*(?:[,>]|extends|=))/, type: 'type' }, // type parameters in generics <T>\r\n { match: /(?<=,\\s*)[A-Z][a-zA-Z0-9_]*(?=\\s*(?:[,>]|extends|=))/, type: 'type' }, // type parameters after comma <T, K>\r\n { match: /(?<=:\\s*)[A-Z][a-zA-Z0-9_]*/, type: 'type' }, // type annotations after colon\r\n ...TailRules,\r\n ],\r\n ...CommonStates,\r\n ...templateStringStates( [ 'var', 'let', 'const', 'this', 'true', 'false', 'null', 'undefined', 'new', 'typeof', 'instanceof', 'void' ] ),\r\n },\r\n reservedWords: [ ...tsKeywords, ...tsTypes, ...jsBuiltins, ...jsStatements ],\r\n icon: 'Ts text-blue-600'\r\n} );\r\n\r\n// WGSL (WebGPU Shading Language)\r\n\r\nconst wgslKeywords = [\r\n 'bool', 'i32', 'u32', 'f16', 'f32', 'vec2', 'vec3', 'vec4', 'vec2i', 'vec3i', 'vec4i',\r\n 'vec2u', 'vec3u', 'vec4u', 'vec2f', 'vec3f', 'vec4f', 'mat2x2f', 'mat2x3f', 'mat2x4f', 'mat3x2f', 'mat3x3f',\r\n 'mat3x4f', 'mat4x2f', 'mat4x3f', 'mat4x4f', 'array', 'struct', 'ptr', 'atomic', 'sampler', 'sampler_comparison',\r\n 'texture_1d', 'texture_2d', 'texture_2d_array', 'texture_3d', 'texture_cube', 'texture_cube_array', 'texture_multisampled_2d',\r\n 'texture_depth_2d', 'texture_depth_2d_array', 'texture_depth_cube', 'texture_depth_cube_array',\r\n 'texture_depth_multisampled_2d', 'texture_storage_1d', 'texture_storage_2d', 'texture_storage_2d_array',\r\n 'texture_storage_3d', 'texture_external', 'var', 'let', 'const', 'override', 'fn', 'type', 'alias',\r\n 'true', 'false'\r\n];\r\n\r\nconst wgslStatements = [\r\n 'if', 'else', 'switch', 'case', 'default', 'for', 'loop', 'while', 'break', 'continue', 'discard',\r\n 'return', 'function', 'private', 'workgroup', 'uniform', 'storage', 'read', 'write', 'read_write', 'bitcast'\r\n];\r\n\r\nconst wgslBuiltins = [\r\n 'position', 'vertex_index', 'instance_index', 'front_facing', 'frag_depth',\r\n 'local_invocation_id', 'local_invocation_index', 'global_invocation_id', 'workgroup_id', 'num_workgroups',\r\n 'abs', 'acos', 'acosh', 'asin', 'asinh', 'atan', 'atanh', 'atan2', 'ceil', 'clamp', 'cos', 'cosh',\r\n 'cross', 'degrees', 'determinant', 'distance', 'dot', 'exp', 'exp2', 'floor', 'fma', 'fract', 'inverseSqrt',\r\n 'length', 'log', 'log2', 'max', 'min', 'mix', 'normalize', 'pow', 'radians', 'reflect', 'refract', 'round',\r\n 'saturate', 'sign', 'sin', 'sinh', 'smoothstep', 'sqrt', 'step', 'tan', 'tanh', 'transpose', 'trunc',\r\n 'textureSample', 'textureSampleBias', 'textureSampleLevel', 'textureSampleGrad',\r\n 'textureSampleCompare', 'textureSampleCompareLevel', 'textureSampleBaseClampToEdge',\r\n 'textureLoad', 'textureStore', 'textureGather', 'textureGatherCompare',\r\n 'textureDimensions', 'textureNumLayers', 'textureNumLevels', 'textureNumSamples',\r\n 'pack4x8snorm', 'pack4x8unorm', 'pack2x16snorm', 'pack2x16unorm', 'pack2x16float',\r\n 'unpack4x8snorm', 'unpack4x8unorm', 'unpack2x16snorm', 'unpack2x16unorm', 'unpack2x16float',\r\n 'atomicLoad', 'atomicStore', 'atomicAdd', 'atomicSub', 'atomicMax', 'atomicMin',\r\n 'atomicAnd', 'atomicOr', 'atomicXor', 'atomicExchange', 'atomicCompareExchangeWeak',\r\n 'dpdx', 'dpdxCoarse', 'dpdxFine', 'dpdy', 'dpdyCoarse', 'dpdyFine', 'fwidth', 'fwidthCoarse', 'fwidthFine',\r\n 'select', 'arrayLength', 'countLeadingZeros', 'countOneBits', 'countTrailingZeros',\r\n 'extractBits', 'firstLeadingBit', 'firstTrailingBit', 'insertBits', 'reverseBits',\r\n 'storageBarrier', 'workgroupBarrier', 'workgroupUniformLoad'\r\n];\r\n\r\nTokenizer.registerLanguage( {\r\n name: 'WGSL',\r\n extensions: [ 'wgsl' ],\r\n lineComment: '//',\r\n states: {\r\n root: [\r\n { match: /\\/\\*/, type: 'comment', next: 'blockComment' },\r\n { match: /\\/\\/.*/, type: 'comment' },\r\n { match: /#\\w+/, type: 'preprocessor' },\r\n ...NumberRules,\r\n { match: words( wgslKeywords ), type: 'keyword' },\r\n { match: words( wgslBuiltins ), type: 'builtin' },\r\n { match: words( wgslStatements ), type: 'statement' },\r\n { match: /@\\w+/, type: 'text' },\r\n ...TailRules,\r\n ],\r\n ...CommonStates\r\n },\r\n reservedWords: [ ...wgslKeywords, ...wgslBuiltins, ...wgslStatements ],\r\n icon: 'AlignLeft text-orange-500'\r\n} );\r\n\r\n// GLSL (OpenGL/WebGL Shading Language)\r\n\r\nconst glslKeywords = [\r\n 'true', 'false', 'int', 'float', 'double', 'bool', 'void', 'uint', 'struct', 'mat2', 'mat3',\r\n 'mat4', 'mat2x2', 'mat2x3', 'mat2x4', 'mat3x2', 'mat3x3', 'mat3x4', 'mat4x2', 'mat4x3', 'mat4x4',\r\n 'vec2', 'vec3', 'vec4', 'ivec2', 'ivec3', 'ivec4', 'uvec2', 'uvec3', 'uvec4', 'dvec2', 'dvec3',\r\n 'dvec4', 'bvec2', 'bvec3', 'bvec4', 'sampler1D', 'sampler2D', 'sampler3D', 'samplerCube',\r\n 'sampler2DShadow', 'samplerCubeShadow', 'sampler2DArray', 'sampler2DArrayShadow',\r\n 'samplerCubeArray', 'samplerCubeArrayShadow', 'isampler2D', 'usampler2D', 'isampler3D',\r\n 'usampler3D', 'lowp', 'mediump', 'highp', 'precision', 'in', 'out', 'inout', 'uniform',\r\n 'varying', 'attribute', 'const', 'layout', 'centroid', 'flat', 'smooth', 'noperspective',\r\n 'patch', 'sample', 'buffer', 'shared', 'coherent', 'volatile', 'restrict', 'readonly', 'writeonly'\r\n];\r\n\r\nconst glslStatements = [\r\n 'if', 'else', 'switch', 'case', 'default', 'for', 'while', 'do', 'break', 'continue',\r\n 'return', 'discard'\r\n];\r\n\r\nconst glslBuiltins = [\r\n 'radians', 'degrees', 'sin', 'cos', 'tan', 'asin', 'acos', 'atan', 'pow', 'exp', 'log',\r\n 'exp2', 'log2', 'sqrt', 'inversesqrt', 'abs', 'sign', 'floor', 'ceil', 'fract',\r\n 'mod', 'min', 'max', 'clamp', 'mix', 'step', 'smoothstep', 'length', 'distance',\r\n 'dot', 'cross', 'normalize', 'reflect', 'refract', 'matrixCompMult',\r\n 'lessThan', 'lessThanEqual', 'greaterThan', 'greaterThanEqual',\r\n 'equal', 'notEqual', 'any', 'all', 'not', 'texture', 'textureProj',\r\n 'textureLod', 'textureGrad', 'texelFetch'\r\n];\r\n\r\nTokenizer.registerLanguage( {\r\n name: 'GLSL',\r\n extensions: [ 'glsl' ],\r\n lineComment: '//',\r\n states: {\r\n root: [\r\n { match: /\\/\\*/, type: 'comment', next: 'blockComment' },\r\n { match: /\\/\\/.*/, type: 'comment' },\r\n { match: /#\\w+/, type: 'preprocessor' },\r\n ...NumberRules,\r\n { match: words( glslKeywords ), type: 'keyword' },\r\n { match: words( glslBuiltins ), type: 'builtin' },\r\n { match: words( glslStatements ), type: 'statement' },\r\n ...TailRules,\r\n ],\r\n ...CommonStates\r\n },\r\n reservedWords: [ ...glslKeywords, ...glslBuiltins, ...glslStatements ],\r\n icon: 'AlignLeft text-neutral-500'\r\n} );\r\n\r\n// HLSL (DirectX Shader Language)\r\n\r\nconst hlslKeywords = [\r\n 'bool', 'int', 'uint', 'dword', 'half', 'float', 'double', 'min16float', 'min10float', 'min16int', 'min12int', 'min16uint',\r\n 'float1', 'float2', 'float3', 'float4', 'int1', 'int2', 'int3', 'int4', 'uint1', 'uint2', 'uint3', 'uint4',\r\n 'bool1', 'bool2', 'bool3', 'bool4', 'half1', 'half2', 'half3', 'half4',\r\n 'float1x1', 'float1x2', 'float1x3', 'float1x4', 'float2x1', 'float2x2', 'float2x3', 'float2x4',\r\n 'float3x1', 'float3x2', 'float3x3', 'float3x4', 'float4x1', 'float4x2', 'float4x3', 'float4x4',\r\n 'vector', 'matrix', 'string', 'void', 'struct', 'class', 'interface', 'true', 'false',\r\n 'sampler', 'sampler1D', 'sampler2D', 'sampler3D', 'samplerCUBE', 'sampler_state',\r\n 'Texture1D', 'Texture2D', 'Texture3D', 'TextureCube', 'Texture1DArray', 'Texture2DArray', 'TextureCubeArray',\r\n 'Buffer', 'AppendStructuredBuffer', 'ConsumeStructuredBuffer', 'StructuredBuffer', 'RWStructuredBuffer',\r\n 'ByteAddressBuffer', 'RWByteAddressBuffer', 'RWTexture1D', 'RWTexture2D', 'RWTexture3D', 'RWTexture1DArray', 'RWTexture2DArray',\r\n 'cbuffer', 'tbuffer', 'in', 'out', 'inout', 'uniform', 'extern', 'static', 'volatile', 'precise', 'shared', 'groupshared',\r\n 'linear', 'centroid', 'nointerpolation', 'noperspective', 'sample', 'const', 'row_major', 'column_major'\r\n];\r\n\r\nconst hlslStatements = [\r\n 'if', 'else', 'for', 'while', 'do', 'switch', 'case', 'default', 'break', 'continue', 'discard', 'return',\r\n 'typedef', 'register', 'packoffset'\r\n];\r\n\r\nconst hlslBuiltins = [\r\n 'SV_Position', 'SV_Target', 'SV_Depth', 'SV_VertexID', 'SV_InstanceID', 'SV_PrimitiveID', 'SV_DispatchThreadID',\r\n 'SV_GroupID', 'SV_GroupThreadID', 'SV_GroupIndex', 'SV_Coverage', 'SV_IsFrontFace', 'SV_RenderTargetArrayIndex',\r\n 'POSITION', 'NORMAL', 'TEXCOORD', 'COLOR', 'TANGENT', 'BINORMAL'\r\n];\r\n\r\nTokenizer.registerLanguage( {\r\n name: 'HLSL',\r\n extensions: [ 'hlsl', 'fx', 'fxh', 'vsh', 'psh' ],\r\n lineComment: '//',\r\n states: {\r\n root: [\r\n { match: /\\/\\*/, type: 'comment', next: 'blockComment' },\r\n { match: /\\/\\/.*/, type: 'comment' },\r\n { match: /#\\w+/, type: 'preprocessor' },\r\n ...NumberRules,\r\n { match: words( hlslKeywords ), type: 'keyword' },\r\n { match: words( hlslBuiltins ), type: 'builtin' },\r\n { match: words( hlslStatements ), type: 'statement' },\r\n ...TailRules,\r\n ],\r\n ...CommonStates\r\n },\r\n reservedWords: [ ...hlslKeywords, ...hlslBuiltins, ...hlslStatements ],\r\n icon: 'AlignLeft text-purple-500'\r\n} );\r\n\r\n// Python\r\n\r\nconst pyKeywords = [\r\n 'False', 'def', 'None', 'True', 'in', 'is', 'and', 'lambda', 'nonlocal', 'not', 'or'\r\n];\r\n\r\nconst pyStatements = [\r\n 'if', 'elif', 'else', 'for', 'while', 'try', 'except', 'finally', 'with', 'match', 'case',\r\n 'break', 'continue', 'return', 'raise', 'pass', 'import', 'from', 'as', 'global', 'nonlocal',\r\n 'assert', 'del', 'yield'\r\n];\r\n\r\nconst pyBuiltins = [\r\n 'abs', 'all', 'any', 'ascii', 'bin', 'bool', 'bytearray', 'bytes', 'callable', 'chr', 'classmethod',\r\n 'compile', 'complex', 'delattr', 'dict', 'dir', 'divmod', 'enumerate', 'eval', 'exec', 'filter',\r\n 'float', 'format', 'frozenset', 'getattr', 'globals', 'hasattr', 'hash', 'help', 'hex', 'id',\r\n 'input', 'int', 'isinstance', 'issubclass', 'iter', 'len', 'list', 'locals', 'map', 'max',\r\n 'memoryview', 'min', 'next', 'object', 'oct', 'open', 'ord', 'pow', 'print', 'property',\r\n 'range', 'repr', 'reversed', 'round', 'set', 'setattr', 'slice', 'sorted', 'staticmethod',\r\n 'str', 'sum', 'super', 'tuple', 'type', 'vars', 'zip'\r\n];\r\n\r\nconst pyTypes = [\r\n 'int', 'float', 'complex', 'bool', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset',\r\n 'dict', 'object', 'type', 'ArithmeticError', 'AssertionError', 'AttributeError', 'BaseException',\r\n 'BufferError', 'EOFError', 'Exception', 'FloatingPointError', 'GeneratorExit', 'ImportError',\r\n 'ModuleNotFoundError', 'IndentationError', 'IndexError', 'KeyError', 'KeyboardInterrupt',\r\n 'LookupError', 'MemoryError', 'NameError', 'NotImplementedError', 'OSError', 'OverflowError',\r\n 'RecursionError', 'ReferenceError', 'RuntimeError', 'StopAsyncIteration', 'StopIteration',\r\n 'SyntaxError', 'TabError', 'SystemError', 'SystemExit', 'TypeError', 'UnboundLocalError',\r\n 'UnicodeError', 'UnicodeEncodeError', 'UnicodeDecodeError', 'UnicodeTranslateError',\r\n 'ValueError', 'ZeroDivisionError'\r\n];\r\n\r\nTokenizer.registerLanguage( {\r\n name: 'Python',\r\n extensions: [ 'py' ],\r\n lineComment: '#',\r\n states: {\r\n root: [\r\n { match: /\\/\\*/, type: 'comment', next: 'blockComment' },\r\n { match: /#.*/, type: 'comment' },\r\n { match: /\"/, type: 'string', next: 'doubleString' },\r\n { match: /'/, type: 'string', next: 'singleString' },\r\n ...NumberRules,\r\n { match: words( pyKeywords ), type: 'keyword' },\r\n { match: words( pyTypes ), type: 'type' },\r\n { match: words( pyBuiltins ), type: 'builtin' },\r\n { match: words( pyStatements ), type: 'statement' },\r\n ...TailRules,\r\n ],\r\n ...CommonStates\r\n },\r\n reservedWords: [ ...pyKeywords, ...pyTypes, ...pyBuiltins, ...pyStatements ],\r\n icon: 'Python text-cyan-600'\r\n} );\r\n\r\n// PHP\r\n\r\nconst phpKeywords = [\r\n 'abstract', 'and', 'array', 'as', 'callable', 'class', 'clone', 'const',\r\n 'enum', 'extends', 'final', 'fn', 'function', 'global',\r\n 'implements', 'include', 'include_once', 'instanceof',\r\n 'insteadof', 'interface', 'namespace', 'new', 'null', 'or',\r\n 'private', 'protected', 'public', 'readonly', 'require',\r\n 'require_once', 'static', 'trait', 'use', 'var', 'xor',\r\n 'from', '$this'\r\n];\r\n\r\nconst phpStatements = [\r\n 'if', 'else', 'elseif', 'endif', 'switch', 'case', 'default', 'endswitch',\r\n 'for', 'endfor', 'foreach', 'endforeach', 'while', 'endwhile', 'do',\r\n 'break', 'continue', 'return', 'try', 'catch', 'finally', 'throw',\r\n 'declare', 'enddeclare', 'goto', 'yield', 'match'\r\n];\r\n\r\nconst phpTypes = [\r\n 'int', 'float', 'string', 'bool', 'array', 'object', 'callable', 'iterable',\r\n 'void', 'never', 'mixed', 'static', 'self', 'parent',\r\n 'Exception', 'Error', 'Throwable', 'DateTime', 'DateTimeImmutable',\r\n 'Closure', 'Generator', 'JsonSerializable'\r\n];\r\n\r\nconst phpBuiltins = [\r\n 'echo', 'print', 'isset', 'empty', 'unset', 'eval', 'die', 'exit',\r\n 'count', 'sizeof', 'in_array', 'array_merge', 'array_push', 'array_pop',\r\n 'strlen', 'strpos', 'substr', 'str_replace', 'explode', 'implode',\r\n 'json_encode', 'json_decode', 'var_dump', 'print_r'\r\n];\r\n\r\n\r\nTokenizer.registerLanguage( {\r\n name: 'PHP',\r\n extensions: [ 'php' ],\r\n lineComment: '//',\r\n states: {\r\n root: [\r\n { match: /\\/\\*/, type: 'comment', next: 'blockComment' },\r\n { match: /\\/\\/.*/, type: 'comment' },\r\n { match: /\"/, type: 'string', next: 'doubleString' },\r\n { match: /'/, type: 'string', next: 'singleString' },\r\n ...NumberRules,\r\n { match: words( phpKeywords ), type: 'keyword' },\r\n { match: words( phpTypes ), type: 'type' },\r\n { match: words( phpBuiltins ), type: 'builtin' },\r\n { match: words( phpStatements ), type: 'statement' },\r\n ...TailRules,\r\n ],\r\n ...CommonStates\r\n },\r\n reservedWords: [ ...phpKeywords, ...phpTypes, ...phpBuiltins, ...phpStatements ],\r\n icon: 'Php text-purple-700'\r\n} );\r\n\r\n// C\r\n\r\nconst cKeywords = [\r\n 'int', 'float', 'double', 'bool', 'long', 'short', 'char', 'void', 'const', 'enum', 'extern', 'register', 'sizeof', 'static',\r\n 'struct', 'typedef', 'union', 'volatile', 'true', 'false'\r\n];\r\n\r\nconst cStatements = [\r\n 'break', 'continue', 'do', 'else', 'for', 'goto', 'if', 'return', 'switch', 'while'\r\n];\r\n\r\nTokenizer.registerLanguage({\r\n name: 'C',\r\n extensions: [ 'c', 'h' ],\r\n lineComment: '//',\r\n states: {\r\n root: [\r\n { match: /\\/\\*/, type: 'comment', next: 'blockComment' },\r\n { match: /\\/\\/.*/, type: 'comment' },\r\n { match: /#\\w+/, type: 'preprocessor' },\r\n { match: /\"/, type: 'string', next: 'doubleString' },\r\n { match: /'/, type: 'string', next: 'singleString' },\r\n ...NumberRules,\r\n { match: words( cKeywords ), type: 'keyword' },\r\n { match: words( cStatements ), type: 'statement' },\r\n ...TailRules,\r\n ],\r\n ...CommonStates\r\n },\r\n reservedWords: [ ...cKeywords, ...cStatements ],\r\n icon: { 'c': 'C text-sky-400', 'h': 'C text-fuchsia-500' }\r\n});\r\n\r\n// C++\r\n\r\nconst cppKeywords = [\r\n ...cKeywords, 'wchar_t', 'static_cast', 'dynamic_cast', 'new', 'delete', 'auto', 'class', 'nullptr', 'NULL', 'signed',\r\n 'unsigned', 'namespace', 'static', 'private', 'public'\r\n];\r\n\r\nconst cppStatements = [\r\n ...cStatements, 'case', 'using', 'glm', 'spdlog', 'default'\r\n];\r\n\r\nconst cppTypes = [\r\n 'uint8_t', 'uint16_t', 'uint32_t', 'uint64_t', 'int8_t', 'int16_t', 'int32_t', 'int64_t', 'size_t', 'ptrdiff_t'\r\n];\r\n\r\nconst cppBuiltins = [\r\n 'std', 'string', 'vector', 'map', 'set', 'unordered_map', 'unordered_set', 'array', 'tuple', 'optional', 'variant',\r\n 'cout', 'cin', 'cerr', 'clog'\r\n];\r\n\r\nTokenizer.registerLanguage({\r\n name: 'C++',\r\n extensions: [ 'cpp', 'hpp' ],\r\n lineComment: '//',\r\n states: {\r\n root: [\r\n { match: /\\/\\*/, type: 'comment', next: 'blockComment' },\r\n { match: /\\/\\/.*/, type: 'comment' },\r\n { match: /#\\w+/, type: 'preprocessor' },\r\n { match: /\"/, type: 'string', next: 'doubleString' },\r\n { match: /'/, type: 'string', next: 'singleString' },\r\n ...NumberRules,\r\n { match: words( cppKeywords ), type: 'keyword' },\r\n { match: words( cppTypes ), type: 'type' },\r\n { match: words( cppBuiltins ), type: 'builtin' },\r\n { match: words( cppStatements ), type: 'statement' },\r\n ...TailRules,\r\n ],\r\n ...CommonStates\r\n },\r\n reservedWords: [ ...cppKeywords, ...cppTypes, ...cppBuiltins, ...cppStatements ],\r\n icon: { 'cpp': 'CPlusPlus text-sky-400', 'hpp': 'CPlusPlus text-fuchsia-500' }\r\n});\r\n\r\n// JSON\r\n\r\nTokenizer.registerLanguage({\r\n name: 'JSON',\r\n extensions: [ 'json', 'jsonc', 'bml' ],\r\n states: {\r\n root: [\r\n { match: /\"/, type: 'string', next: 'doubleString' },\r\n { match: /\\btrue\\b|\\bfalse\\b|\\bnull\\b/, type: 'keyword' },\r\n { match: /-?\\d+\\.?\\d*(?:[eE][+-]?\\d+)?/, type: 'number' },\r\n { match: /[{}[\\]:,]/, type: 'symbol' },\r\n { match: /\\s+/, type: 'text' },\r\n ],\r\n ...CommonStates\r\n },\r\n reservedWords: [],\r\n icon: 'Json text-yellow-600'\r\n});\r\n\r\n// XML\r\n\r\nTokenizer.registerLanguage({\r\n name: 'XML',\r\n extensions: [ 'xml', 'xaml', 'xsd', 'xsl' ],\r\n lineComment: '<!--',\r\n states: {\r\n root: [\r\n { match: /<!--/, type: 'comment', next: 'xmlComment' },\r\n { match: /<\\?/, type: 'preprocessor', next: 'processingInstruction' },\r\n { match: /<\\/[a-zA-Z][\\w:-]*>/, type: 'keyword' },\r\n { match: /<[a-zA-Z][\\w:-]*/, type: 'keyword', next: 'tag' },\r\n { match: /[^<]+/, type: 'text' },\r\n ],\r\n tag: [\r\n { match: /\\/?>/, type: 'keyword', pop: true },\r\n { match: /[a-zA-Z][\\w:-]*(?==)/, type: 'type' },\r\n { match: /\"/, type: 'string', next: 'doubleString' },\r\n { match: /'/, type: 'string', next: 'singleString' },\r\n { match: /[^\"'>/]+/, type: 'text' },\r\n ],\r\n xmlComment: [\r\n { match: /-->/, type: 'comment', pop: true },\r\n { match: /[^-]+/, type: 'comment' },\r\n { match: /-/, type: 'comment' },\r\n ],\r\n processingInstruction: [\r\n { match: /\\?>/, type: 'preprocessor', pop: true },\r\n { match: /[^?]+/, type: 'preprocessor' },\r\n { match: /\\?/, type: 'preprocessor' },\r\n ],\r\n ...CommonStates\r\n },\r\n reservedWords: [],\r\n icon: 'Rss text-orange-600'\r\n});\r\n\r\n// HTML\r\n\r\nconst htmlTags = [\r\n 'html', 'head', 'body', 'title', 'meta', 'link', 'script', 'style',\r\n 'div', 'span', 'p', 'a', 'img', 'ul', 'ol', 'li', 'table', 'tr', 'td', 'th',\r\n 'form', 'input', 'button', 'select', 'option', 'textarea', 'label',\r\n 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'header', 'footer', 'nav', 'section', 'article',\r\n 'aside', 'main', 'figure', 'figcaption', 'video', 'audio', 'source', 'canvas', 'svg'\r\n];\r\n\r\nTokenizer.registerLanguage({\r\n name: 'HTML',\r\n extensions: [ 'html' ],\r\n lineComment: '<!--',\r\n states: {\r\n root: [\r\n { match: /<!--/, type: 'comment', next: 'xmlComment' },\r\n { match: /<!DOCTYPE/i, type: 'preprocessor' },\r\n { match: /<\\/[a-zA-Z][\\w-]*>/, type: 'keyword' },\r\n { match: /<script\\b/i, type: 'keyword', next: 'scriptTag' },\r\n { match: /<style\\b/i, type: 'keyword', next: 'styleTag' },\r\n { match: /<[a-zA-Z][\\w-]*/, type: 'keyword', next: 'tag' },\r\n { match: /[^<]+/, type: 'text' },\r\n ],\r\n tag: [\r\n { match: /\\/?>/, type: 'keyword', pop: true },\r\n { match: /[a-zA-Z][\\w-]*(?==)/, type: 'type' },\r\n { match: /\"/, type: 'string', next: 'doubleString' },\r\n { match: /'/, type: 'string', next: 'singleString' },\r\n { match: /[^\"'>/]+/, type: 'text' },\r\n ],\r\n scriptTag: [\r\n { match: /\\/>/, type: 'keyword', pop: true },\r\n { match: />/, type: 'keyword', next: 'scriptContent' },\r\n { match: /[a-zA-Z][\\w-]*(?==)/, type: 'type' },\r\n { match: /\"/, type: 'string', next: 'doubleString' },\r\n { match: /'/, type: 'string', next: 'singleString' },\r\n { match: /[^\"'>/]+/, type: 'text' },\r\n ],\r\n scriptContent: [\r\n { match: /<\\/script>/i, type: 'keyword', pop: 2 },\r\n { match: /[^<]+/, type: 'text' },\r\n { match: /</, type: 'text' },\r\n ],\r\n styleTag: [\r\n { match: /\\/>/, type: 'keyword', pop: true },\r\n { match: />/, type: 'keyword', next: 'styleContent' },\r\n { match: /[a-zA-Z][\\w-]*(?==)/, type: 'type' },\r\n { match: /\"/, type: 'string', next: 'doubleString' },\r\n { match: /'/, type: 'string', next: 'singleString' },\r\n { match: /[^\"'>/]+/, type: 'text' },\r\n ],\r\n styleContent: [\r\n { match: /<\\/style>/i, type: 'keyword', pop: 2 },\r\n { match: /[^<]+/, type: 'text' },\r\n { match: /</, type: 'text' },\r\n ],\r\n xmlComment: [\r\n { match: /-->/, type: 'comment', pop: true },\r\n { match: /[^-]+/, type: 'comment' },\r\n { match: /-/, type: 'comment' },\r\n ],\r\n ...CommonStates\r\n },\r\n reservedWords: [ ...htmlTags ],\r\n icon: 'Code text-orange-500'\r\n});\r\n\r\n// CSS\r\n\r\nconst cssProperties = [\r\n 'color', 'background', 'border', 'margin', 'padding', 'font', 'display', 'position',\r\n 'width', 'height', 'top', 'left', 'right', 'bottom', 'flex', 'grid', 'z-index',\r\n 'opacity', 'transform', 'transition', 'animation', 'content', 'visibility'\r\n];\r\n\r\nconst cssPropertyValues = [\r\n 'inherit', 'initial', 'unset', 'revert', 'revert-layer', 'auto', 'none', 'hidden', 'visible', 'collapse',\r\n 'block', 'inline', 'inline-block', 'flex', 'inline-flex', 'grid', 'inline-grid', 'contents', 'list-item',\r\n 'static', 'relative', 'absolute', 'fixed', 'sticky', 'solid', 'dashed', 'dotted', 'double', 'groove', 'ridge',\r\n 'inset', 'outset', 'bold', 'bolder', 'lighter', 'normal', 'italic', 'oblique', 'uppercase', 'lowercase', 'capitalize',\r\n 'left', 'right', 'center', 'top', 'bottom', 'start', 'end', 'stretch', 'space-between', 'space-around', 'space-evenly',\r\n 'repeat', 'no-repeat', 'repeat-x', 'repeat-y', 'cover', 'contain', 'pointer', 'default', 'move', 'text', 'not-allowed',\r\n 'transparent', 'currentColor'\r\n];\r\n\r\nconst cssPseudos = [\r\n 'hover', 'active', 'focus', 'visited', 'link', 'before', 'after', 'first-child',\r\n 'last-child', 'nth-child', 'not', 'root', 'disabled', 'checked'\r\n];\r\n\r\nTokenizer.registerLanguage({\r\n name: 'CSS',\r\n extensions: [ 'css', 'scss', 'sass', 'less' ],\r\n lineComment: '//',\r\n states: {\r\n root: [\r\n { match: /\\/\\*/, type: 'comment', next: 'blockComment' },\r\n { match: /\\/\\/.*/, type: 'comment' }, // SCSS/Less\r\n { match: /@[\\w-]+/, type: 'statement' }, // @media, @import, @keyframes, etc.\r\n { match: /#[\\w-]+/, type: 'keyword' }, // ID selectors\r\n { match: /\\.[\\w-]+/, type: 'keyword' }, // class selectors\r\n { match: /::?[\\w-]+(?:\\([^)]*\\))?/, type: 'keyword' }, // pseudo-classes/elements\r\n { match: /\\[[\\w-]+(?:[~|^$*]?=(?:\"[^\"]*\"|'[^']*'|[\\w-]+))?\\]/, type: 'type' }, // attribute selectors\r\n { match: /{/, type: 'symbol', next: 'properties' },\r\n { match: /}/, type: 'symbol' },\r\n { match: /[,>+~*]/, type: 'symbol' }, // combinators\r\n { match: /[\\w-]+/, type: 'keyword' }, // element selectors\r\n { match: /\\s+/, type: 'text' },\r\n ],\r\n properties: [\r\n { match: /\\/\\*/, type: 'comment', next: 'blockComment' },\r\n { match: /\\/\\/.*/, type: 'comment' }, // SCSS/Less\r\n { match: /}/, type: 'symbol', pop: true },\r\n { match: /[\\w-]+(?=\\s*:)/, type: 'type' }, // property names\r\n { match: /:/, type: 'symbol' },\r\n { match: words( cssPropertyValues ), type: 'string' },\r\n { match: /;/, type: 'symbol' },\r\n { match: /\"/, type: 'string', next: 'doubleString' },\r\n { match: /'/, type: 'string', next: 'singleString' },\r\n { match: /#[a-fA-F0-9]{3,8}\\b/, type: 'string' }, // hex colors\r\n { match: /-?\\d+\\.?\\d*(?:px|em|rem|%|vh|vw|vmin|vmax|pt|cm|mm|in|pc|ex|ch|fr|deg|rad|grad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?/, type: 'number' },\r\n { match: /!important\\b/, type: 'builtin' },\r\n { match: /[\\w-]+\\(/, type: 'method' }, // functions: rgb(), calc(), var(), url()\r\n { match: /--[\\w-]+/, type: 'type' }, // vars --\r\n { match: /[(),]/, type: 'symbol' },\r\n { match: /{/, type: 'symbol', next: 'properties' }, // nested rules (SCSS/Less)\r\n { match: /[\\w-]+/, type: 'text' },\r\n { match: /\\s+/, type: 'text' },\r\n ],\r\n ...CommonStates\r\n },\r\n reservedWords: [ ...cssProperties, ...cssPropertyValues, ...cssPseudos ],\r\n icon: 'Hash text-blue-500'\r\n});\r\n\r\n// Markdown\r\n\r\nTokenizer.registerLanguage({\r\n name: 'Markdown',\r\n extensions: [ 'md', 'markdown' ],\r\n states: {\r\n root: [\r\n { match: /^#{1,6}\\s+.+/, type: 'keyword' },\r\n { match: /^\\*\\*\\*.+$/, type: 'symbol' },\r\n { match: /\\*\\*[^*]+\\*\\*/, type: 'keyword' },\r\n { match: /\\*[^*]+\\*/, type: 'type' },\r\n { match: /__[^_]+__/, type: 'keyword' },\r\n { match: /_[^_]+_/, type: 'type' },\r\n { match: /`[^`]+`/, type: 'string' },\r\n { match: /```/, type: 'comment', next: 'codeBlock' },\r\n { match: /^\\s*[-*+]\\s+/, type: 'symbol' },\r\n { match: /^\\s*\\d+\\.\\s+/, type: 'symbol' },\r\n { match: /\\[([^\\]]+)\\]\\(([^)]+)\\)/, type: 'builtin' },\r\n { match: /^>\\s+/, type: 'comment' },\r\n { match: /.+/, type: 'text' },\r\n ],\r\n codeBlock: [\r\n { match: /```/, type: 'comment', pop: true },\r\n { match: /.+/, type: 'string' },\r\n ]\r\n },\r\n reservedWords: [],\r\n icon: 'Markdown text-red-500'\r\n});\r\n\r\n// Batch\r\n\r\nconst batchKeywords = [\r\n 'if', 'else', 'for', 'in', 'do', 'goto', 'call', 'exit', 'setlocal', 'endlocal',\r\n 'set', 'echo', 'rem', 'pause', 'cd', 'pushd', 'popd', 'shift', 'start'\r\n];\r\n\r\nconst batchBuiltins = [\r\n 'dir', 'copy', 'move', 'del', 'ren', 'md', 'rd', 'type', 'find', 'findstr',\r\n 'tasklist', 'taskkill', 'ping', 'ipconfig', 'netstat', 'cls', 'title', 'color'\r\n];\r\n\r\nTokenizer.registerLanguage({\r\n name: 'Batch',\r\n extensions: [ 'bat', 'cmd' ],\r\n lineComment: 'rem',\r\n states: {\r\n root: [\r\n { match: /^rem\\s+.*/i, type: 'comment' },\r\n { match: /^::.*/, type: 'comment' },\r\n { match: /\"/, type: 'string', next: 'doubleString' },\r\n { match: /%[\\w]+%/, type: 'type' },\r\n { match: /\\b\\d+\\b/, type: 'number' },\r\n { match: words( [ ...batchKeywords, ...batchKeywords.map( w => w.toUpperCase() ) ] ), type: 'keyword' },\r\n { match: words( batchBuiltins ), type: 'builtin' },\r\n { match: /@echo/, type: 'statement' },\r\n { match: /[a-zA-Z_]\\w*/, type: 'text' },\r\n { match: /[<>|&()@]/, type: 'symbol' },\r\n { match: /\\s+/, type: 'text' },\r\n ],\r\n ...CommonStates\r\n },\r\n reservedWords: [ ...batchKeywords, ...batchBuiltins ],\r\n icon: 'Terminal text-gray-300'\r\n});\r\n\r\n// CMake\r\n\r\nconst cmakeCommands = [\r\n 'project', 'cmake_minimum_required', 'add_executable', 'add_library', 'target_link_libraries',\r\n 'target_include_directories', 'set', 'option', 'if', 'else', 'elseif', 'endif', 'foreach',\r\n 'endforeach', 'while', 'endwhile', 'function', 'endfunction', 'macro', 'endmacro',\r\n 'find_package', 'include', 'message', 'install', 'add_subdirectory', 'configure_file'\r\n];\r\n\r\nTokenizer.registerLanguage({\r\n name: 'CMake',\r\n extensions: [ 'cmake', 'txt', 'cmake-cache' ],\r\n lineComment: '#',\r\n states: {\r\n root: [\r\n { match: /#.*/, type: 'comment' },\r\n { match: /\"/, type: 'string', next: 'doubleString' },\r\n { match: /\\$\\{[^}]+\\}/, type: 'type' },\r\n { match: /\\b\\d+\\.?\\d*\\b/, type: 'number' },\r\n { match: words( [ ...cmakeCommands, ...cmakeCommands.map( w => w.toUpperCase() ) ] ), type: 'keyword' },\r\n { match: /\\b[A-Z_][A-Z0-9_]*\\b/, type: 'builtin' },\r\n { match: /[a-zA-Z_]\\w*/, type: 'text' },\r\n { match: /[(){}]/, type: 'symbol' },\r\n { match: /\\s+/, type: 'text' },\r\n ],\r\n ...CommonStates\r\n },\r\n reservedWords: [ ...cmakeCommands ],\r\n icon: 'AlignLeft text-neutral-500'\r\n});\r\n\r\n// Rust\r\n\r\nconst rustKeywords = [\r\n 'as', 'break', 'const', 'continue', 'crate', 'else', 'enum', 'extern', 'false', 'fn',\r\n 'for', 'if', 'impl', 'in', 'let', 'loop', 'match', 'mod', 'move', 'mut', 'pub', 'ref',\r\n 'return', 'self', 'Self', 'static', 'struct', 'super', 'trait', 'true', 'type', 'unsafe',\r\n 'use', 'where', 'while', 'async', 'await', 'dyn', 'abstract', 'become', 'box', 'do',\r\n 'final', 'macro', 'override', 'priv', 'typeof', 'unsized', 'virtual', 'yield'\r\n];\r\n\r\nconst rustTypes = [\r\n 'i8', 'i16', 'i32', 'i64', 'i128', 'isize', 'u8', 'u16', 'u32', 'u64', 'u128', 'usize',\r\n 'f32', 'f64', 'bool', 'char', 'str', 'String', 'Vec', 'Option', 'Result', 'Box'\r\n];\r\n\r\nconst rustBuiltins = [\r\n 'println', 'print', 'eprintln', 'eprint', 'format', 'panic', 'assert', 'assert_eq',\r\n 'assert_ne', 'debug_assert', 'vec', 'Some', 'None', 'Ok', 'Err'\r\n];\r\n\r\nTokenizer.registerLanguage({\r\n name: 'Rust',\r\n extensions: [ 'rs' ],\r\n lineComment: '//',\r\n states: {\r\n root: [\r\n { match: /\\/\\*/, type: 'comment', next: 'blockComment' },\r\n { match: /\\/\\/.*/, type: 'comment' },\r\n { match: /\"/, type: 'string', next: 'doubleString' },\r\n { match: /'(?:\\\\.|[^'])+'/, type: 'string' },\r\n { match: /r#*\"/, type: 'string', next: 'rawString' },\r\n ...NumberRules,\r\n { match: /#\\[[\\w:]+\\]/, type: 'preprocessor' },\r\n { match: words( rustKeywords ), type: 'keyword' },\r\n { match: words( rustTypes ), type: 'type' },\r\n { match: words( rustBuiltins ), type: 'builtin' },\r\n { match: /![a-zA-Z_]\\w*/, type: 'preprocessor' },\r\n ...TailRules,\r\n ],\r\n rawString: [\r\n { match: /\"#*/, type: 'string', pop: true },\r\n { match: /[^\"]+/, type: 'string' },\r\n { match: /\"/, type: 'string' },\r\n ],\r\n ...CommonStates\r\n },\r\n reservedWords: [ ...rustKeywords, ...rustTypes, ...rustBuiltins ],\r\n icon: 'Rust text-orange-400'\r\n});\r\n\r\n// ____ _\r\n// | \\ ___ ___ _ _ _____ ___ ___| |_\r\n// | | | . | _| | | | -_| | _|\r\n// |____/|___|___|___|_|_|_|___|_|_|_|\r\n\r\nclass CodeDocument\r\n{\r\n private onChange: ( ( doc: CodeDocument ) => void ) | undefined = undefined;\r\n private _lines: string[] = [ '' ];\r\n\r\n get lineCount(): number\r\n {\r\n return this._lines.length;\r\n }\r\n\r\n constructor( onChange?: ( doc: CodeDocument ) => void )\r\n {\r\n this.onChange = onChange;\r\n }\r\n\r\n getLine( n: number ): string\r\n {\r\n return this._lines[ n ] ?? '';\r\n }\r\n\r\n getText( separator: string = '\\n' ): string\r\n {\r\n return this._lines.join( separator );\r\n }\r\n\r\n setText( text: string ): void\r\n {\r\n this._lines = text.split( /\\r?\\n/ );\r\n if ( this._lines.length === 0 )\r\n {\r\n this._lines = [ '' ];\r\n }\r\n\r\n if( this.onChange ) this.onChange( this );\r\n }\r\n\r\n getCharAt( line: number, col: number ): string | undefined\r\n {\r\n const l = this._lines[ line ];\r\n if ( !l || col < 0 || col >= l.length ) return undefined;\r\n return l[ col ];\r\n }\r\n\r\n /**\r\n * Get the word at a given position. Returns [word, startCol, endCol].\r\n */\r\n getWordAt( line: number, col: number ): [ string, number, number ]\r\n {\r\n const l = this._lines[ line ];\r\n if ( !l || col < 0 || col > l.length ) return [ '', col, col ];\r\n\r\n // Expand left\r\n let start = col;\r\n while ( start > 0 && isWord( l[ start - 1 ] ) )\r\n {\r\n start--;\r\n }\r\n\r\n // Expand right\r\n let end = col;\r\n while ( end < l.length && isWord( l[ end ] ) )\r\n {\r\n end++;\r\n }\r\n\r\n return [ l.substring( start, end ), start, end ];\r\n }\r\n\r\n /**\r\n * Get the indentation level (number of leading spaces) of a line.\r\n */\r\n getIndent( line: number ): number\r\n {\r\n const idx = firstNonspaceIndex( this._lines[ line ] ?? '' );\r\n return idx === -1 ? ( this._lines[ line ]?.length ?? 0 ) : idx;\r\n }\r\n\r\n /**\r\n * Find the next occurrence of 'text' starting after (line, col). Returns null if no match.\r\n */\r\n findNext( text: string, startLine: number, startCol: number ): { line: number, col: number } | null\r\n {\r\n if ( !text ) return null;\r\n\r\n // Search from startLine:startCol forward\r\n for ( let i = startLine; i < this._lines.length; i++ )\r\n {\r\n const searchFrom = i === startLine ? startCol : 0;\r\n const idx = this._lines[i].indexOf( text, searchFrom );\r\n if ( idx !== -1 ) return { line: i, col: idx };\r\n }\r\n\r\n // Wrap around from beginning\r\n for ( let i = 0; i <= startLine; i++ )\r\n {\r\n const searchUntil = i === startLine ? startCol : this._lines[i].length;\r\n const idx = this._lines[i].indexOf( text );\r\n if ( idx !== -1 && idx < searchUntil ) return { line: i, col: idx };\r\n }\r\n\r\n return null;\r\n }\r\n\r\n // Mutations (return EditOperations for undo):\r\n\r\n /**\r\n * Insert text at a position (handles newlines in the inserted text).\r\n */\r\n insert( line: number, col: number, text: string ): EditOperation\r\n {\r\n const parts = text.split( /\\r?\\n/ );\r\n const currentLine = this._lines[ line ] ?? '';\r\n const before = currentLine.substring( 0, col );\r\n const after = currentLine.substring( col );\r\n\r\n if ( parts.length === 1 )\r\n {\r\n this._lines[ line ] = before + parts[0] + after;\r\n }\r\n else\r\n {\r\n this._lines[ line ] = before + parts[0];\r\n for ( let i = 1; i < parts.length - 1; i++ )\r\n {\r\n this._lines.splice( line + i, 0, parts[i] );\r\n }\r\n this._lines.splice( line + parts.length - 1, 0, parts[ parts.length - 1 ] + after );\r\n }\r\n\r\n if( this.onChange ) this.onChange( this );\r\n\r\n return { type: 'insert', line, col, text };\r\n }\r\n\r\n /**\r\n * Delete `length` characters forward from a position (handles crossing line boundaries).\r\n */\r\n delete( line: number, col: number, length: number ): EditOperation\r\n {\r\n let remaining = length;\r\n let deletedText = '';\r\n let currentLine = line;\r\n let currentCol = col;\r\n\r\n while ( remaining > 0 && currentLine < this._lines.length )\r\n {\r\n const l = this._lines[ currentLine ];\r\n const available = l.length - currentCol;\r\n\r\n if ( remaining <= available )\r\n {\r\n deletedText += l.substring( currentCol, currentCol + remaining );\r\n this._lines[ currentLine ] = l.substring( 0, currentCol ) + l.substring( currentCol + remaining );\r\n remaining = 0;\r\n }\r\n else\r\n {\r\n // Delete rest of this line + the newline\r\n deletedText += l.substring( currentCol ) + '\\n';\r\n remaining -= ( available + 1 ); // +1 for the newline\r\n\r\n // Merge next line into current\r\n const nextContent = this._lines[ currentLine + 1 ] ?? '';\r\n this._lines[ currentLine ] = l.substring( 0, currentCol ) + nextContent;\r\n this._lines.splice( currentLine + 1, 1 );\r\n }\r\n }\r\n\r\n if( this.onChange ) this.onChange( this );\r\n\r\n return { type: 'delete', line, col, text: deletedText };\r\n }\r\n\r\n /**\r\n * Insert a new line after 'afterLine'. If afterLine is -1, inserts at the beginning.\r\n */\r\n insertLine( afterLine: number, text: string = '' ): EditOperation\r\n {\r\n const insertAt = afterLine + 1;\r\n this._lines.splice( insertAt, 0, text );\r\n\r\n if( this.onChange ) this.onChange( this );\r\n\r\n return { type: 'insert', line: Math.max( afterLine, 0 ), col: afterLine >= 0 ? this._lines[ afterLine ]?.length ?? 0 : 0, text: '\\n' + text };\r\n }\r\n\r\n /**\r\n * Remove an entire line and its trailing newline.\r\n */\r\n removeLine( line: number ): EditOperation\r\n {\r\n const text = this._lines[ line ];\r\n this._lines.splice( line, 1 );\r\n if ( this._lines.length === 0 )\r\n {\r\n this._lines = [ '' ];\r\n }\r\n\r\n if( this.onChange ) this.onChange( this );\r\n\r\n return { type: 'delete', line: Math.max( line - 1, 0 ), col: line > 0 ? ( this._lines[ line - 1 ]?.length ?? 0 ) : 0, text: '\\n' + text };\r\n }\r\n\r\n replaceLine( line: number, newText: string ): EditOperation\r\n {\r\n const oldText = this._lines[ line ];\r\n this._lines[ line ] = newText;\r\n\r\n if( this.onChange ) this.onChange( this );\r\n\r\n return { type: 'replaceLine', line, col: 0, text: newText, oldText };\r\n }\r\n\r\n /**\r\n * Apply an edit operation (used by undo/redo).\r\n */\r\n applyInverse( op: EditOperation ): EditOperation\r\n {\r\n if ( op.type === 'insert' )\r\n {\r\n return this.delete( op.line, op.col, op.text.length );\r\n }\r\n else if ( op.type === 'replaceLine' )\r\n {\r\n return this.replaceLine( op.line, op.oldText! );\r\n }\r\n else\r\n {\r\n return this.insert( op.line, op.col, op.text );\r\n }\r\n }\r\n}\r\n\r\n// _____ _ _ _ _____ _ _ _| |_ _____ _ _____ \r\n// | __|_| |_| |_ | |___ ___ ___ ___| |_|_|___ ___ ___ | __| | | |___ _| |___ | |___ ___ ___ ___ ___ ___ \r\n// | __| . | | _| | | | . | -_| _| .'| _| | . | |_ -| | __| | | | | . | . | | | | | .'| | .'| . | -_| _|\r\n// |_____|___|_|_| |_____| _|___|_| |__,|_| |_|___|_|_|___| |_ _| |_____|_|_|___|___| |_|_|_|__,|_|_|__,|_ |___|_| \r\n// |_| |_| |___|\r\n\r\ninterface EditOperation\r\n{\r\n type: 'insert' | 'delete' | 'replaceLine';\r\n line: number;\r\n col: number;\r\n text: string;\r\n oldText?: string; // used by replaceLine to store previous content\r\n}\r\n\r\ninterface UndoEntry\r\n{\r\n operations: EditOperation[];\r\n cursorsBefore: CursorPosition[];\r\n cursorsAfter: CursorPosition[];\r\n}\r\n\r\nclass UndoManager\r\n{\r\n private _undoStack: UndoEntry[] = [];\r\n private _redoStack: UndoEntry[] = [];\r\n private _pendingOps: EditOperation[] = [];\r\n private _pendingCursorsBefore: CursorPosition[] = [];\r\n private _pendingCursorsAfter: CursorPosition[] = [];\r\n private _lastPushTime: number = 0;\r\n private _groupThresholdMs: number;\r\n private _maxSteps: number;\r\n\r\n constructor( groupThresholdMs: number = 2000, maxSteps: number = 200 )\r\n {\r\n this._groupThresholdMs = groupThresholdMs;\r\n this._maxSteps = maxSteps;\r\n }\r\n\r\n /**\r\n * Record an edit operation. Consecutive operations within the time threshold\r\n * are grouped into a single undo step.\r\n */\r\n record( op: EditOperation, cursors: CursorPosition[] ): void\r\n {\r\n const now = Date.now();\r\n const elapsed = now - this._lastPushTime;\r\n\r\n if ( elapsed > this._groupThresholdMs && this._pendingOps.length > 0 )\r\n {\r\n this._flush();\r\n }\r\n\r\n if ( this._pendingOps.length === 0 )\r\n {\r\n this._pendingCursorsBefore = cursors.map( c => ( { ...c } ) );\r\n }\r\n\r\n this._pendingOps.push( op );\r\n this._pendingCursorsAfter = cursors.map( c => ( { ...c } ) );\r\n this._lastPushTime = now;\r\n\r\n // New edits clear the redo stack\r\n this._redoStack.length = 0;\r\n }\r\n\r\n /**\r\n * Force-flush pending operations into a final undo step.\r\n */\r\n flush( cursorsAfter?: CursorPosition[] ): void\r\n {\r\n if ( cursorsAfter && this._pendingOps.length > 0 )\r\n {\r\n this._pendingCursorsAfter = cursorsAfter.map( c => ( { ...c } ) );\r\n }\r\n this._flush();\r\n }\r\n\r\n /**\r\n * Undo the last step. Stores the operations to apply inversely, and returns the cursor state to restore.\r\n */\r\n undo( doc: CodeDocument, currentCursors?: CursorPosition[] ): { cursors: CursorPosition[] } | null\r\n {\r\n this.flush( currentCursors );\r\n\r\n const entry = this._undoStack.pop();\r\n if ( !entry ) return null;\r\n\r\n // Apply in reverse order\r\n const redoOps: EditOperation[] = [];\r\n for ( let i = entry.operations.length - 1; i >= 0; i-- )\r\n {\r\n const inverseOp = doc.applyInverse( entry.operations[i] );\r\n redoOps.unshift( inverseOp );\r\n }\r\n\r\n this._redoStack.push( { operations: redoOps, cursorsBefore: entry.cursorsBefore, cursorsAfter: entry.cursorsAfter } );\r\n\r\n return { cursors: entry.cursorsBefore };\r\n }\r\n\r\n /**\r\n * Redo the last undone step. Returns the cursor state to restore.\r\n */\r\n redo( doc: CodeDocument ): { cursors: CursorPosition[] } | null\r\n {\r\n const entry = this._redoStack.pop();\r\n if ( !entry ) return null;\r\n\r\n // Apply in forward order (redo entries are already in correct order)\r\n const undoOps: EditOperation[] = [];\r\n for ( let i = 0; i < entry.operations.length; i++ )\r\n {\r\n const inverseOp = doc.applyInverse( entry.operations[i] );\r\n undoOps.push( inverseOp );\r\n }\r\n\r\n this._undoStack.push( { operations: undoOps, cursorsBefore: entry.cursorsBefore, cursorsAfter: entry.cursorsAfter } );\r\n\r\n return { cursors: entry.cursorsAfter };\r\n }\r\n\r\n canUndo(): boolean\r\n {\r\n return this._undoStack.length > 0 || this._pendingOps.length > 0;\r\n }\r\n\r\n canRedo(): boolean\r\n {\r\n return this._redoStack.length > 0;\r\n }\r\n\r\n clear(): void\r\n {\r\n this._undoStack.length = 0;\r\n this._redoStack.length = 0;\r\n this._pendingOps.length = 0;\r\n this._lastPushTime = 0;\r\n }\r\n\r\n private _flush(): void\r\n {\r\n if ( this._pendingOps.length === 0 ) return;\r\n\r\n this._undoStack.push( {\r\n operations: [ ...this._pendingOps ],\r\n cursorsBefore: [ ...this._pendingCursorsBefore ],\r\n cursorsAfter: [ ...this._pendingCursorsAfter ]\r\n } );\r\n\r\n this._pendingOps.length = 0;\r\n this._pendingCursorsBefore = [];\r\n this._pendingCursorsAfter = [];\r\n\r\n // Limit stack size\r\n while ( this._undoStack.length > this._maxSteps )\r\n {\r\n this._undoStack.shift();\r\n }\r\n }\r\n}\r\n\r\n// _____ _| |_ _____ _ _ _ \r\n// | |_ _ ___ ___ ___ ___ | __| | __|___| |___ ___| |_|_|___ ___ \r\n// | --| | | _|_ -| . | _| | __| |__ | -_| | -_| _| _| | . | |\r\n// |_____|___|_| |___|___|_| |_ _| |_____|___|_|___|___|_| |_|___|_|_|\r\n// |_|\r\n\r\ninterface CursorPosition\r\n{\r\n line: number;\r\n col: number;\r\n}\r\n\r\ninterface Selection\r\n{\r\n anchor: CursorPosition; // where selection started\r\n head: CursorPosition; // where cursor is (moves during selection)\r\n}\r\n\r\nfunction posEqual( a: CursorPosition, b: CursorPosition ): boolean\r\n{\r\n return a.line === b.line && a.col === b.col;\r\n}\r\n\r\nfunction posBefore( a: CursorPosition, b: CursorPosition ): boolean\r\n{\r\n return a.line < b.line || ( a.line === b.line && a.col < b.col );\r\n}\r\n\r\nfunction selectionStart( sel: Selection ): CursorPosition\r\n{\r\n return posBefore( sel.anchor, sel.head ) ? sel.anchor : sel.head;\r\n}\r\n\r\nfunction selectionEnd( sel: Selection ): CursorPosition\r\n{\r\n return posBefore( sel.anchor, sel.head ) ? sel.head : sel.anchor;\r\n}\r\n\r\nfunction selectionIsEmpty( sel: Selection ): boolean\r\n{\r\n return posEqual( sel.anchor, sel.head );\r\n}\r\n\r\nclass CursorSet\r\n{\r\n cursors: Selection[] = [];\r\n\r\n constructor()\r\n {\r\n // Start with one cursor at 0,0\r\n this.cursors = [ { anchor: { line: 0, col: 0 }, head: { line: 0, col: 0 } } ];\r\n }\r\n\r\n getPrimary(): Selection\r\n {\r\n return this.cursors[0];\r\n }\r\n\r\n /**\r\n * Set a single cursor position. Clears all secondary cursors and selections.\r\n */\r\n set( line: number, col: number ): void\r\n {\r\n this.cursors = [ { anchor: { line, col }, head: { line, col } } ];\r\n }\r\n\r\n // Movement:\r\n\r\n moveLeft( doc: CodeDocument, selecting: boolean = false ): void\r\n {\r\n for ( const sel of this.cursors )\r\n {\r\n this._moveHead( sel, doc, -1, 0, selecting );\r\n }\r\n this._merge();\r\n }\r\n\r\n moveRight( doc: CodeDocument, selecting: boolean = false ): void\r\n {\r\n for ( const sel of this.cursors )\r\n {\r\n this._moveHead( sel, doc, 1, 0, selecting );\r\n }\r\n this._merge();\r\n }\r\n\r\n moveUp( doc: CodeDocument, selecting: boolean = false ): void\r\n {\r\n for ( const sel of this.cursors )\r\n {\r\n this._moveVertical( sel, doc, -1, selecting );\r\n }\r\n this._merge();\r\n }\r\n\r\n moveDown( doc: CodeDocument, selecting: boolean = false ): void\r\n {\r\n for ( const sel of this.cursors )\r\n {\r\n this._moveVertical( sel, doc, 1, selecting );\r\n }\r\n this._merge();\r\n }\r\n\r\n moveToLineStart( doc: CodeDocument, selecting: boolean = false, noIndent: boolean = false ): void\r\n {\r\n for ( const sel of this.cursors )\r\n {\r\n const line = sel.head.line;\r\n const indent = doc.getIndent( line );\r\n // Toggle between indent and column 0\r\n const targetCol = ( sel.head.col === indent || noIndent ) ? 0 : indent;\r\n sel.head = { line, col: targetCol };\r\n if ( !selecting ) sel.anchor = { ...sel.head };\r\n }\r\n this._merge();\r\n }\r\n\r\n moveToLineEnd( doc: CodeDocument, selecting: boolean = false ): void\r\n {\r\n for ( const sel of this.cursors )\r\n {\r\n const line = sel.head.line;\r\n sel.head = { line, col: doc.getLine( line ).length };\r\n if ( !selecting ) sel.anchor = { ...sel.head };\r\n }\r\n this._merge();\r\n }\r\n\r\n moveWordLeft( doc: CodeDocument, selecting: boolean = false ): void\r\n {\r\n for ( const sel of this.cursors )\r\n {\r\n const { line, col } = sel.head;\r\n if ( col === 0 && line > 0 )\r\n {\r\n // Jump to end of previous line\r\n sel.head = { line: line - 1, col: doc.getLine( line - 1 ).length };\r\n }\r\n else\r\n {\r\n const l = doc.getLine( line );\r\n let c = col;\r\n // Skip whitespace\r\n while ( c > 0 && /\\s/.test( l[ c - 1 ] ) ) c--;\r\n // Skip word or symbols\r\n if ( c > 0 && isWord( l[ c - 1 ] ) )\r\n {\r\n while ( c > 0 && isWord( l[ c - 1 ] ) ) c--;\r\n }\r\n else if ( c > 0 )\r\n {\r\n while ( c > 0 && isSymbol( l[ c - 1 ] ) ) c--;\r\n }\r\n sel.head = { line, col: c };\r\n }\r\n if ( !selecting ) sel.anchor = { ...sel.head };\r\n }\r\n this._merge();\r\n }\r\n\r\n moveWordRight( doc: CodeDocument, selecting: boolean = false ): void\r\n {\r\n for ( const sel of this.cursors )\r\n {\r\n const { line, col } = sel.head;\r\n const l = doc.getLine( line );\r\n if ( col >= l.length && line < doc.lineCount - 1 )\r\n {\r\n // Jump to start of next line\r\n sel.head = { line: line + 1, col: 0 };\r\n }\r\n else\r\n {\r\n let c = col;\r\n // Skip leading whitespace first\r\n while ( c < l.length && /\\s/.test( l[ c ] ) ) c++;\r\n // Then skip word or symbols to end of group\r\n if ( c < l.length && isWord( l[ c ] ) )\r\n {\r\n while ( c < l.length && isWord( l[ c ] ) ) c++;\r\n }\r\n else if ( c < l.length && isSymbol( l[ c ] ) )\r\n {\r\n while ( c < l.length && isSymbol( l[ c ] ) ) c++;\r\n }\r\n sel.head = { line, col: c };\r\n }\r\n if ( !selecting ) sel.anchor = { ...sel.head };\r\n }\r\n this._merge();\r\n }\r\n\r\n selectAll( doc: CodeDocument ): void\r\n {\r\n const lastLine = doc.lineCount - 1;\r\n this.cursors = [ {\r\n anchor: { line: 0, col: 0 },\r\n head: { line: lastLine, col: doc.getLine( lastLine ).length }\r\n } ];\r\n }\r\n\r\n // Multi-cursor:\r\n\r\n addCursor( line: number, col: number ): void\r\n {\r\n this.cursors.push( { anchor: { line, col }, head: { line, col } } );\r\n this._merge();\r\n }\r\n\r\n removeSecondaryCursors(): void\r\n {\r\n this.cursors = [ this.cursors[0] ];\r\n }\r\n\r\n /**\r\n * Returns cursor indices sorted by head position, bottom-to-top (last in doc first)\r\n * to ensure earlier cursors' positions stay valid.\r\n */\r\n sortedIndicesBottomUp(): number[]\r\n {\r\n return this.cursors\r\n .map( ( _, i ) => i )\r\n .sort( ( a, b ) =>\r\n {\r\n const ah = this.cursors[a].head;\r\n const bh = this.cursors[b].head;\r\n return bh.line !== ah.line ? bh.line - ah.line : bh.col - ah.col;\r\n } );\r\n }\r\n\r\n /**\r\n * After editing at (line, col), shift all other cursors on the same line\r\n * that are at or after `afterCol` by `colDelta`. Also handles line shifts\r\n * for multi-line inserts/deletes via `lineDelta`.\r\n */\r\n adjustOthers( skipIdx: number, line: number, afterCol: number, colDelta: number, lineDelta: number = 0 ): void\r\n {\r\n for ( let i = 0; i < this.cursors.length; i++ )\r\n {\r\n if ( i === skipIdx ) continue;\r\n const c = this.cursors[i];\r\n\r\n // Adjust head\r\n if ( lineDelta !== 0 && c.head.line > line )\r\n {\r\n c.head = { line: c.head.line + lineDelta, col: c.head.col };\r\n }\r\n else if ( c.head.line === line && c.head.col >= afterCol )\r\n {\r\n c.head = { line: c.head.line + lineDelta, col: c.head.col + colDelta };\r\n }\r\n\r\n // Adjust anchor\r\n if ( lineDelta !== 0 && c.anchor.line > line )\r\n {\r\n c.anchor = { line: c.anchor.line + lineDelta, col: c.anchor.col };\r\n }\r\n else if ( c.anchor.line === line && c.anchor.col >= afterCol )\r\n {\r\n c.anchor = { line: c.anchor.line + lineDelta, col: c.anchor.col + colDelta };\r\n }\r\n }\r\n }\r\n\r\n // Queries:\r\n\r\n hasSelection( index: number = 0 ): boolean\r\n {\r\n const sel = this.cursors[ index ];\r\n return sel ? !posEqual( sel.anchor, sel.head ) : false;\r\n }\r\n\r\n getSelectedText( doc: CodeDocument, index: number = 0 ): string\r\n {\r\n const sel = this.cursors[ index ];\r\n if ( !sel || selectionIsEmpty( sel ) ) return '';\r\n\r\n const start = selectionStart( sel );\r\n const end = selectionEnd( sel );\r\n\r\n if ( start.line === end.line )\r\n {\r\n return doc.getLine( start.line ).substring( start.col, end.col );\r\n }\r\n\r\n const lines: string[] = [];\r\n lines.push( doc.getLine( start.line ).substring( start.col ) );\r\n for ( let i = start.line + 1; i < end.line; i++ )\r\n {\r\n lines.push( doc.getLine( i ) );\r\n }\r\n lines.push( doc.getLine( end.line ).substring( 0, end.col ) );\r\n return lines.join( '\\n' );\r\n }\r\n\r\n getCursorPositions(): CursorPosition[]\r\n {\r\n return this.cursors.map( s => ( { ...s.head } ) );\r\n }\r\n\r\n private _moveHead( sel: Selection, doc: CodeDocument, dx: number, _dy: number, selecting: boolean ): void\r\n {\r\n const { line, col } = sel.head;\r\n\r\n // If there's a selection and we're not extending it, collapse to the edge\r\n if ( !selecting && !selectionIsEmpty( sel ) )\r\n {\r\n const target = dx < 0 ? selectionStart( sel ) : selectionEnd( sel );\r\n sel.head = { ...target };\r\n sel.anchor = { ...target };\r\n return;\r\n }\r\n\r\n if ( dx < 0 )\r\n {\r\n if ( col > 0 )\r\n {\r\n sel.head = { line, col: col - 1 };\r\n }\r\n else if ( line > 0 )\r\n {\r\n sel.head = { line: line - 1, col: doc.getLine( line - 1 ).length };\r\n }\r\n }\r\n else if ( dx > 0 )\r\n {\r\n const lineLen = doc.getLine( line ).length;\r\n if ( col < lineLen )\r\n {\r\n sel.head = { line, col: col + 1 };\r\n }\r\n else if ( line < doc.lineCount - 1 )\r\n {\r\n sel.head = { line: line + 1, col: 0 };\r\n }\r\n }\r\n\r\n if ( !selecting ) sel.anchor = { ...sel.head };\r\n }\r\n\r\n private _moveVertical( sel: Selection, doc: CodeDocument, direction: number, selecting: boolean ): void\r\n {\r\n const { line, col } = sel.head;\r\n const newLine = line + direction;\r\n\r\n if ( newLine < 0 || newLine >= doc.lineCount ) return;\r\n\r\n const newLineLen = doc.getLine( newLine ).length;\r\n sel.head = { line: newLine, col: Math.min( col, newLineLen ) };\r\n\r\n if ( !selecting ) sel.anchor = { ...sel.head };\r\n }\r\n\r\n /**\r\n * Merge overlapping cursors/selections. Keeps the first one when duplicates exist.\r\n */\r\n private _merge(): void\r\n {\r\n if ( this.cursors.length <= 1 ) return;\r\n\r\n // Sort by head position\r\n this.cursors.sort( ( a, b ) => {\r\n if ( a.head.line !== b.head.line ) return a.head.line - b.head.line;\r\n return a.head.col - b.head.col;\r\n } );\r\n\r\n const merged: Selection[] = [ this.cursors[0] ];\r\n\r\n for ( let i = 1; i < this.cursors.length; i++ )\r\n {\r\n const prev = merged[ merged.length - 1 ];\r\n const curr = this.cursors[i];\r\n\r\n if ( posEqual( prev.head, curr.head ) )\r\n {\r\n // Same position — skip duplicate\r\n continue;\r\n }\r\n\r\n merged.push( curr );\r\n }\r\n\r\n this.cursors = merged;\r\n }\r\n}\r\n\r\n// _____ _ _\r\n// | __|_ _ _____| |_ ___| |___\r\n// |__ | | | | . | . | |_ -|\r\n// |_____|_ |_|_|_|___|___|_|___|\r\n// |___|\r\n\r\ninterface Symbol\r\n{\r\n name: string;\r\n kind: string; // class | function | method | variable | interface | type | enum | struct | property | constructor-call | method-call\r\n scope: string;\r\n line: number;\r\n col?: number;\r\n}\r\n\r\ninterface ScopeInfo\r\n{\r\n name: string;\r\n type: string; // global | class | function | method | enum | struct | interface | anonymous\r\n line: number; // Line where scope opened\r\n}\r\n\r\n/**\r\n * Manages code symbols for autocomplete, navigation, and outlining.\r\n * Incrementally updates as lines change.\r\n */\r\nclass SymbolTable\r\n{\r\n private _symbols: Map<string, Symbol[]> = new Map(); // name -> symbols[]\r\n private _lineSymbols: Symbol[][] = []; // [lineNum] -> symbols declared on that line\r\n private _scopeStack: ScopeInfo[] = [{ name: 'global', type: 'global', line: 0 }];\r\n private _lineScopes: ScopeInfo[][] = []; // [lineNum] -> scope stack at that line\r\n\r\n get currentScope(): string\r\n {\r\n return this._scopeStack[this._scopeStack.length - 1]?.name ?? 'global';\r\n }\r\n\r\n get currentScopeType(): string\r\n {\r\n return this._scopeStack[this._scopeStack.length - 1]?.type ?? 'global';\r\n }\r\n\r\n getScopeAtLine( line: number ): ScopeInfo[]\r\n {\r\n return this._lineScopes[line] ?? [{ name: 'global', type: 'global', line: 0 }];\r\n }\r\n\r\n getSymbols( name: string ): Symbol[]\r\n {\r\n return this._symbols.get( name ) ?? [];\r\n }\r\n\r\n getAllSymbolNames(): string[]\r\n {\r\n return Array.from( this._symbols.keys() );\r\n }\r\n\r\n getAllSymbols(): Symbol[]\r\n {\r\n const all: Symbol[] = [];\r\n for ( const symbols of this._symbols.values() )\r\n {\r\n all.push( ...symbols );\r\n }\r\n return all;\r\n }\r\n\r\n getLineSymbols( line: number ): Symbol[]\r\n {\r\n return this._lineSymbols[line] ?? [];\r\n }\r\n\r\n /** Update scope stack for a line (call before parsing symbols) */\r\n updateScopeForLine( line: number, lineText: string ): void\r\n {\r\n // Track braces to maintain scope stack\r\n const openBraces = ( lineText.match( /\\{/g ) || [] ).length;\r\n const closeBraces = ( lineText.match( /\\}/g ) || [] ).length;\r\n\r\n // Save current scope for this line\r\n this._lineScopes[line] = [ ...this._scopeStack ];\r\n\r\n // Pop scopes for closing braces\r\n for ( let i = 0; i < closeBraces; i++ )\r\n {\r\n if ( this._scopeStack.length > 1 ) this._scopeStack.pop();\r\n }\r\n\r\n // Push scopes for opening braces (will be named by symbol detection)\r\n for ( let i = 0; i < openBraces; i++ )\r\n {\r\n this._scopeStack.push( { name: 'anonymous', type: 'anonymous', line } );\r\n }\r\n }\r\n\r\n /** Name the most recent anonymous scope (called when detecting class/function) */\r\n nameCurrentScope( name: string, type: string ): void\r\n {\r\n if ( this._scopeStack.length > 0 )\r\n {\r\n const current = this._scopeStack[this._scopeStack.length - 1];\r\n if ( current.name === 'anonymous' || current.type === 'anonymous' )\r\n {\r\n current.name = name;\r\n current.type = type;\r\n }\r\n }\r\n }\r\n\r\n /** Remove symbols from a line (before reparsing) */\r\n removeLineSymbols( line: number ): void\r\n {\r\n const oldSymbols = this._lineSymbols[line];\r\n if ( !oldSymbols ) return;\r\n\r\n for ( const symbol of oldSymbols )\r\n {\r\n const list = this._symbols.get( symbol.name );\r\n if ( !list ) continue;\r\n\r\n // Remove this specific symbol from the name's list\r\n const index = list.findIndex( s => s.line === line && s.kind === symbol.kind && s.scope === symbol.scope );\r\n if ( index !== -1 ) list.splice( index, 1 );\r\n\r\n if ( list.length === 0 ) this._symbols.delete( symbol.name );\r\n }\r\n\r\n this._lineSymbols[line] = [];\r\n }\r\n\r\n addSymbol( symbol: Symbol ): void\r\n {\r\n if ( !this._symbols.has( symbol.name ) )\r\n {\r\n this._symbols.set( symbol.name, [] );\r\n }\r\n this._symbols.get( symbol.name )!.push( symbol );\r\n\r\n if ( !this._lineSymbols[symbol.line] )\r\n {\r\n this._lineSymbols[symbol.line] = [];\r\n }\r\n this._lineSymbols[symbol.line].push( symbol );\r\n }\r\n\r\n /** Reset scope stack (e.g. when document structure changes significantly) */\r\n resetScopes(): void\r\n {\r\n this._scopeStack = [{ name: 'global', type: 'global', line: 0 }];\r\n this._lineScopes = [];\r\n }\r\n\r\n clear(): void\r\n {\r\n this._symbols.clear();\r\n this._lineSymbols = [];\r\n this.resetScopes();\r\n }\r\n}\r\n\r\n/**\r\n * Parse symbols from a line of code using token types and text patterns to detect declarations.\r\n */\r\nfunction parseSymbolsFromLine( lineText: string, tokens: Token[], line: number, symbolTable: SymbolTable ): Symbol[]\r\n{\r\n const symbols: Symbol[] = [];\r\n const scope = symbolTable.currentScope;\r\n const scopeType = symbolTable.currentScopeType;\r\n\r\n // Build set of reserved words from tokens (keywords, statements, builtins) to skip when detecting symbols\r\n const reservedWords = new Set<string>();\r\n for ( const token of tokens )\r\n {\r\n if ( [ 'keyword', 'statement', 'builtin', 'preprocessor' ].includes( token.type ) )\r\n {\r\n reservedWords.add( token.value );\r\n }\r\n }\r\n\r\n // Track added symbols by name and approximate position to avoid duplicates\r\n const addedSymbols = new Set<string>();\r\n\r\n const addSymbol = ( name: string, kind: string, col: number = 0 ) =>\r\n {\r\n if ( !name || !name.match( /^[a-zA-Z_$][\\w$]*$/ ) ) return; // Valid identifier check\r\n if ( reservedWords.has( name ) ) return;\r\n\r\n // Unique key using 5 chars tolerance\r\n const posKey = `${name}@${Math.floor( col / 5 ) * 5}`;\r\n if ( addedSymbols.has( posKey ) ) return; // Already added\r\n\r\n symbols.push( { name, kind, scope, line, col } );\r\n addedSymbols.add( posKey );\r\n };\r\n\r\n // Top-level declaration patterns (only one per line, checked with anchors)\r\n const topLevelPatterns = [\r\n { regex: /^\\s*class\\s+([A-Z_]\\w*)/i, kind: 'class' },\r\n { regex: /^\\s*struct\\s+([A-Z_]\\w*)/i, kind: 'struct' },\r\n { regex: /^\\s*interface\\s+([A-Z_]\\w*)/i, kind: 'interface' },\r\n { regex: /^\\s*enum\\s+([A-Z_]\\w*)/i, kind: 'enum' },\r\n { regex: /^\\s*type\\s+([A-Z_]\\w*)\\s*=/i, kind: 'type' },\r\n { regex: /^\\s*(?:export\\s+)?(?:async\\s+)?function\\s+(\\w+)/i, kind: 'function' },\r\n { regex: /^\\s*(?:const|let|var)\\s+(\\w+)\\s*=\\s*(?:async\\s+)?\\([^)]*\\)\\s*=>/i, kind: 'function' },\r\n { regex: /^\\s*(?:static\\s+|const\\s+|virtual\\s+|inline\\s+|extern\\s+|pub\\s+|async\\s+)*(\\w+[\\w\\s\\*&:<>,]*?)\\s+(\\w+)\\s*\\([^)]*\\)\\s*[{;]/i, kind: 'typed-function' },\r\n { regex: /^\\s*(?:public|private|protected|static|readonly)*\\s*(\\w+)\\s*\\([^)]*\\)\\s*[:{]/i, kind: scopeType === 'class' ? 'method' : 'function' }\r\n ];\r\n\r\n const multiPatterns = [\r\n { regex: /(?:const|let|var)\\s+(\\w+)/gi, kind: 'variable' },\r\n { regex: /(\\w+)\\s*:\\s*(?:function|[A-Z]\\w*)/gi, kind: 'variable' },\r\n { regex: /this\\.(\\w+)\\s*=/gi, kind: 'property' },\r\n { regex: /new\\s+([A-Z]\\w+)/gi, kind: 'constructor-call' },\r\n { regex: /(\\w+)\\s*\\(/gi, kind: 'method-call' }\r\n ];\r\n\r\n let foundTopLevel = false;\r\n for ( const pattern of topLevelPatterns )\r\n {\r\n const match = lineText.match( pattern.regex );\r\n if ( match )\r\n {\r\n let name: string;\r\n let kind = pattern.kind;\r\n\r\n if ( pattern.kind === 'typed-function' && match[2] )\r\n {\r\n name = match[2];\r\n kind = scopeType === 'class' ? 'method' : 'function';\r\n }\r\n else if ( match[1] )\r\n {\r\n name = match[1];\r\n }\r\n else\r\n {\r\n continue;\r\n }\r\n\r\n const col = lineText.indexOf( name );\r\n addSymbol( name, kind, col );\r\n\r\n if ( [ 'class', 'function', 'method', 'enum', 'struct', 'interface' ].includes( kind ) )\r\n {\r\n symbolTable.nameCurrentScope( name, kind );\r\n }\r\n\r\n foundTopLevel = true;\r\n break;\r\n }\r\n }\r\n\r\n // If no top-level declaration, check for multiple occurrences\r\n if ( !foundTopLevel )\r\n {\r\n for ( const pattern of multiPatterns )\r\n {\r\n const matches = lineText.matchAll( pattern.regex );\r\n for ( const match of matches )\r\n {\r\n if ( match[1] )\r\n {\r\n const name = match[1];\r\n const col = match.index ?? 0;\r\n addSymbol( name, pattern.kind, col );\r\n }\r\n }\r\n }\r\n }\r\n\r\n if ( scopeType === 'enum' )\r\n {\r\n const enumValueMatch = lineText.match( /^\\s*(\\w+)\\s*[,=]?/ );\r\n if ( enumValueMatch && enumValueMatch[1] && !lineText.includes( 'enum' ) )\r\n {\r\n addSymbol( enumValueMatch[1], 'enum-value', lineText.indexOf( enumValueMatch[1] ) );\r\n }\r\n }\r\n\r\n return symbols;\r\n}\r\n\r\n// _____ _ _____ _ _ _ ____ _____ _____ \r\n// | |___ _| |___| __|_| |_| |_ ___ ___ | \\| | |\r\n// | --| . | . | -_| __| . | | _| . | _| | | | | | | | |\r\n// |_____|___|___|___|_____|___|_|_| |___|_| |____/|_____|_|_|_|\r\n\r\nconst g = globalThis as any;\r\nconst TOKEN_CLASS_MAP: Record<string, string> = {\r\n 'keyword': 'cm-kwd',\r\n 'statement': 'cm-std',\r\n 'type': 'cm-typ',\r\n 'builtin': 'cm-bln',\r\n 'string': 'cm-str',\r\n 'comment': 'cm-com',\r\n 'number': 'cm-dec',\r\n 'method': 'cm-mtd',\r\n 'symbol': 'cm-sym',\r\n 'enum': 'cm-enu',\r\n 'preprocessor': 'cm-ppc',\r\n 'variable': 'cm-var',\r\n};\r\n\r\nconst Area = LX.Area;\r\nconst Panel = LX.Panel;\r\nconst Tabs = LX.Tabs;\r\nconst NodeTree = LX.NodeTree;\r\n\r\ninterface CodeTab\r\n{\r\n name: string;\r\n dom: HTMLElement;\r\n doc: CodeDocument;\r\n cursorSet: CursorSet;\r\n undoManager: UndoManager;\r\n language: string;\r\n title?: string;\r\n path?: string;\r\n}\r\n\r\n// _____ _ _ _____\r\n// | __|___ ___ ___| | | __ |___ ___\r\n// |__ | _| _| . | | | __ -| .'| _|\r\n// |_____|___|_| |___|_|_|_____|__,|_|\r\n\r\nclass ScrollBar\r\n{\r\n static SIZE = 10;\r\n\r\n root: HTMLElement;\r\n thumb: HTMLElement;\r\n\r\n private _vertical: boolean;\r\n private _thumbPos: number = 0; // current thumb offset in px\r\n private _thumbRatio: number = 0; // thumb size as fraction of track (0..1)\r\n private _lastMouse: number = 0;\r\n private _onDrag: ( ( delta: number ) => void ) | null = null;\r\n\r\n get visible(): boolean { return !this.root.classList.contains( 'hidden' ); }\r\n get isVertical(): boolean { return this._vertical; }\r\n\r\n constructor( vertical: boolean, onDrag: ( delta: number ) => void )\r\n {\r\n this._vertical = vertical;\r\n this._onDrag = onDrag;\r\n\r\n this.root = LX.makeElement( 'div', `lexcodescrollbar hidden ${vertical ? 'vertical' : 'horizontal'}` );\r\n\r\n this.thumb = LX.makeElement( 'div' );\r\n this.thumb.addEventListener( 'mousedown', ( e: MouseEvent ) => this._onMouseDown( e ) );\r\n this.root.appendChild( this.thumb );\r\n }\r\n\r\n setThumbRatio( ratio: number ): void\r\n {\r\n this._thumbRatio = LX.clamp( ratio, 0, 1 );\r\n const needed = this._thumbRatio < 1;\r\n this.root.classList.toggle( 'hidden', !needed );\r\n\r\n if ( needed )\r\n {\r\n if ( this._vertical )\r\n this.thumb.style.height = ( this._thumbRatio * 100 ) + '%';\r\n else\r\n this.thumb.style.width = ( this._thumbRatio * 100 ) + '%';\r\n }\r\n }\r\n\r\n syncToScroll( scrollPos: number, scrollMax: number ): void\r\n {\r\n if ( scrollMax <= 0 ) return;\r\n const trackSize = this._vertical ? this.root.offsetHeight : this.root.offsetWidth;\r\n const thumbSize = this._vertical ? this.thumb.offsetHeight : this.thumb.offsetWidth;\r\n const available = trackSize - thumbSize;\r\n if ( available <= 0 ) return;\r\n\r\n this._thumbPos = ( scrollPos / scrollMax ) * available;\r\n this._applyPosition();\r\n }\r\n\r\n applyDragDelta( delta: number, scrollMax: number ): number\r\n {\r\n const trackSize = this._vertical ? this.root.offsetHeight : this.root.offsetWidth;\r\n const thumbSize = this._vertical ? this.thumb.offsetHeight : this.thumb.offsetWidth;\r\n const available = trackSize - thumbSize;\r\n if ( available <= 0 ) return 0;\r\n\r\n this._thumbPos = LX.clamp( this._thumbPos + delta, 0, available );\r\n this._applyPosition();\r\n\r\n return ( this._thumbPos / available ) * scrollMax;\r\n }\r\n\r\n private _applyPosition(): void\r\n {\r\n if ( this._vertical )\r\n this.thumb.style.top = this._thumbPos + 'px';\r\n else\r\n this.thumb.style.left = this._thumbPos + 'px';\r\n }\r\n\r\n private _onMouseDown( e: MouseEvent ): void\r\n {\r\n const doc = document;\r\n this._lastMouse = this._vertical ? e.clientY : e.clientX;\r\n\r\n const onMouseMove = ( e: MouseEvent ) =>\r\n {\r\n const current = this._vertical ? e.clientY : e.clientX;\r\n const delta = current - this._lastMouse;\r\n this._lastMouse = current;\r\n this._onDrag?.( delta );\r\n e.stopPropagation();\r\n e.preventDefault();\r\n };\r\n\r\n const onMouseUp = () =>\r\n {\r\n doc.removeEventListener( 'mousemove', onMouseMove );\r\n doc.removeEventListener( 'mouseup', onMouseUp );\r\n };\r\n\r\n doc.addEventListener( 'mousemove', onMouseMove );\r\n doc.addEventListener( 'mouseup', onMouseUp );\r\n e.stopPropagation();\r\n e.preventDefault();\r\n }\r\n}\r\n\r\n/**\r\n * @class CodeEditor\r\n * The main editor class. Wires Document, Tokenizer, CursorSet, UndoManager\r\n * together with the DOM.\r\n */\r\nexport class CodeEditor\r\n{\r\n static __instances: CodeEditor[] = [];\r\n\r\n language: LanguageDef;\r\n symbolTable: SymbolTable;\r\n\r\n // DOM:\r\n area: typeof Area;\r\n baseArea: typeof Area;\r\n codeArea: typeof Area;\r\n explorerArea: typeof Area;\r\n tabs: typeof Tabs;\r\n root: HTMLElement;\r\n codeScroller: HTMLElement;\r\n codeSizer: HTMLElement;\r\n cursorsLayer: HTMLElement;\r\n selectionsLayer: HTMLElement;\r\n lineGutter: HTMLElement;\r\n vScrollbar!: ScrollBar;\r\n hScrollbar!: ScrollBar;\r\n searchBox: HTMLElement | null = null;\r\n searchLineBox: HTMLElement | null = null;\r\n autocomplete: HTMLElement | null = null;\r\n currentTab: CodeTab | null = null;\r\n statusPanel: typeof Panel;\r\n leftStatusPanel: typeof Panel;\r\n rightStatusPanel: typeof Panel;\r\n explorer: typeof NodeTree | null = null;\r\n\r\n // Measurements:\r\n charWidth: number = 0;\r\n lineHeight: number = 0;\r\n fontSize: number = 0;\r\n xPadding: number = 64; // 4rem left padding in pixels\r\n private _cachedTabsHeight: number = 0;\r\n private _cachedStatusPanelHeight: number = 0;\r\n\r\n // Editor options:\r\n skipInfo: boolean = false;\r\n disableEdition: boolean = false;\r\n skipTabs: boolean = false;\r\n useFileExplorer: boolean = false;\r\n useAutoComplete: boolean = true;\r\n allowAddScripts: boolean = true;\r\n allowClosingTabs: boolean = true;\r\n allowLoadingFiles: boolean = true;\r\n tabSize: number = 4;\r\n highlight: string = 'Plain Text';\r\n newTabOptions: any[] | null = null;\r\n customSuggestions: any[] = [];\r\n explorerName: string = 'EXPLORER';\r\n\r\n // Editor callbacks:\r\n onSave: ( text: string, editor: CodeEditor ) => void;\r\n onRun: ( text: string, editor: CodeEditor ) => void;\r\n onCtrlSpace: ( text: string, editor: CodeEditor ) => void;\r\n onCreateStatusPanel: ( panel: typeof Panel, editor: CodeEditor ) => void;\r\n onContextMenu: any;\r\n onNewTab: ( event: MouseEvent ) => void;\r\n onSelectTab: ( name: string, editor: CodeEditor ) => void;\r\n onReady: ( ( editor: CodeEditor ) => void ) | undefined;\r\n onCreateFile: ( ( editor: CodeEditor ) => void ) | undefined;\r\n onCodeChange: ( ( doc: CodeDocument ) => void ) | undefined;\r\n\r\n private _inputArea!: HTMLTextAreaElement;\r\n\r\n // State:\r\n private _lineStates: TokenizerState[] = []; // tokenizer state at end of each line\r\n private _lineElements: HTMLElement[] = []; // <pre> element per line\r\n private _openedTabs: Record<string, CodeTab> = {};\r\n private _loadedTabs: Record<string, CodeTab> = {};\r\n private _storedTabs: Record<string, any> = {};\r\n private _focused: boolean = false;\r\n private _composing: boolean = false;\r\n private _keyChain: string | null = null;\r\n private _wasPaired: boolean = false;\r\n private _lastAction: string = '';\r\n private _blinkerInterval: ReturnType<typeof setInterval> | null = null;\r\n private _cursorVisible: boolean = true;\r\n private _cursorBlinkRate: number = 550;\r\n private _clickCount: number = 0;\r\n private _lastClickTime: number = 0;\r\n private _lastClickLine: number = -1;\r\n private _isSearchBoxActive: boolean = false;\r\n private _isSearchLineBoxActive: boolean = false;\r\n private _searchMatchCase: boolean = false;\r\n private _lastTextFound: string = '';\r\n private _lastSearchPos: { line: number, col: number } | null = null;\r\n private _discardScroll: boolean = false;\r\n private _isReady: boolean = false;\r\n private _lastMaxLineLength: number = 0;\r\n private _lastLineCount: number = 0;\r\n private _isAutoCompleteActive: boolean = false;\r\n private _selectedAutocompleteIndex: number = 0;\r\n private _displayObservers: { intersectionObserver: IntersectionObserver, resizeObserver: ResizeObserver } | undefined;\r\n\r\n private static readonly CODE_MIN_FONT_SIZE = 9;\r\n private static readonly CODE_MAX_FONT_SIZE = 22;\r\n private static readonly PAIR_KEYS: Record<string, string> = { '\"': '\"', \"'\": \"'\", '`': '`', '(': ')', '{': '}', '[': ']' };\r\n\r\n get doc(): CodeDocument\r\n {\r\n return this.currentTab!.doc;\r\n }\r\n\r\n get undoManager(): UndoManager\r\n {\r\n return this.currentTab!.undoManager;\r\n }\r\n\r\n get cursorSet(): CursorSet\r\n {\r\n return this.currentTab!.cursorSet;\r\n }\r\n\r\n get codeContainer(): HTMLElement\r\n {\r\n return this.currentTab!.dom;\r\n }\r\n\r\n static getInstances()\r\n {\r\n return CodeEditor.__instances;\r\n }\r\n\r\n constructor( area: typeof Area, options: Record<string, any> = {} )\r\n {\r\n g.editor = this;\r\n\r\n CodeEditor.__instances.push( this );\r\n\r\n this.skipInfo = options.skipInfo ?? this.skipInfo;\r\n this.disableEdition = options.disableEdition ?? this.disableEdition;\r\n this.skipTabs = options.skipTabs ?? this.skipTabs;\r\n this.useFileExplorer = ( options.fileExplorer ?? this.useFileExplorer ) && !this.skipTabs;\r\n this.useAutoComplete = options.autocomplete ?? this.useAutoComplete;\r\n this.allowAddScripts = options.allowAddScripts ?? this.allowAddScripts;\r\n this.allowClosingTabs = options.allowClosingTabs ?? this.allowClosingTabs;\r\n this.allowLoadingFiles = options.allowLoadingFiles ?? this.allowLoadingFiles;\r\n this.highlight = options.highlight ?? this.highlight;\r\n this.newTabOptions = options.newTabOptions;\r\n this.customSuggestions = options.customSuggestions ?? [];\r\n this.explorerName = options.explorerName ?? this.explorerName;\r\n\r\n // Editor callbacks\r\n this.onSave = options.onSave;\r\n this.onRun = options.onRun;\r\n this.onCtrlSpace = options.onCtrlSpace;\r\n this.onCreateStatusPanel = options.onCreateStatusPanel;\r\n this.onContextMenu = options.onContextMenu;\r\n this.onNewTab = options.onNewTab;\r\n this.onSelectTab = options.onSelectTab;\r\n this.onReady = options.onReady;\r\n this.onCodeChange = options.onCodeChange;\r\n\r\n this.language = Tokenizer.getLanguage( this.highlight ) ?? Tokenizer.getLanguage( 'Plain Text' )!;\r\n this.symbolTable = new SymbolTable();\r\n\r\n // File explorer\r\n if ( this.useFileExplorer )\r\n {\r\n let [ explorerArea, editorArea ] = area.split( { sizes: [ '15%', '85%' ] } );\r\n // explorerArea.setLimitBox( 180, 20, 512 );\r\n this.explorerArea = explorerArea;\r\n\r\n let panel = new LX.Panel();\r\n\r\n panel.addTitle( this.explorerName );\r\n\r\n let sceneData: any[] = [];\r\n\r\n this.explorer = panel.addTree( null, sceneData, {\r\n filter: false,\r\n rename: false,\r\n skipDefaultIcon: true\r\n } );\r\n\r\n this.explorer.on( 'dblClick', ( event: any ) => {\r\n const node = event.items[0];\r\n const name = node.id;\r\n this.loadTab( name );\r\n } );\r\n\r\n this.explorer.on( 'beforeDelete', ( event: any, resolve: Function ) => {\r\n return;\r\n } );\r\n\r\n explorerArea.attach( panel );\r\n\r\n // Update area\r\n area = editorArea;\r\n }\r\n\r\n // Full editor\r\n area.root.className = LX.mergeClass( area.root.className, 'codebasearea overflow-hidden flex relative' );\r\n\r\n this.baseArea = area;\r\n this.area = new LX.Area( {\r\n className: 'lexcodeeditor flex flex-col outline-none overflow-hidden size-full select-none bg-inherit relative',\r\n skipAppend: true\r\n } );\r\n\r\n const codeAreaClassName = 'lexcodearea scrollbar-hidden flex flex-row flex-auto-fill';\r\n\r\n if ( !this.skipTabs )\r\n {\r\n this.tabs = this.area.addTabs( { contentClass: codeAreaClassName, onclose: ( name: string ) => {\r\n // this.closeTab triggers this onclose!\r\n delete this._openedTabs[name];\r\n } } );\r\n\r\n LX.addClass( this.tabs.root.parentElement, 'rounded-t-lg' );\r\n\r\n if ( !this.disableEdition )\r\n {\r\n this.tabs.root.parentElement.addEventListener( 'dblclick', ( e: MouseEvent ) => {\r\n if ( !this.allowAddScripts ) return;\r\n e.preventDefault();\r\n this._onCreateNewFile();\r\n } );\r\n }\r\n\r\n this.codeArea = this.tabs.area;\r\n }\r\n else\r\n {\r\n this.codeArea = new LX.Area( { className: codeAreaClassName, skipAppend: true } );\r\n this.area.attach( this.codeArea );\r\n }\r\n\r\n this.root = this.area.root;\r\n area.attach( this.root );\r\n\r\n this.codeScroller = this.codeArea.root;\r\n // Add Line numbers gutter, only the container, line numbers are in the same line div\r\n this.lineGutter = LX.makeElement( 'div', `w-16 overflow-hidden absolute top-0 bg-inherit z-10 ${this.skipTabs ? '' : 'mt-8'}`, null, this.codeScroller );\r\n // Add code sizer, which will have the code elements\r\n this.codeSizer = LX.makeElement( 'div', 'pseudoparent-tabs w-full', null, this.codeScroller );\r\n\r\n // Cursors and selections\r\n this.cursorsLayer = LX.makeElement( 'div', 'cursors', null, this.codeSizer );\r\n this.selectionsLayer = LX.makeElement( 'div', 'selections', null, this.codeSizer );\r\n\r\n // Custom scrollbars\r\n if ( !this.disableEdition )\r\n {\r\n this.vScrollbar = new ScrollBar( true, ( delta ) => {\r\n const scrollMax = this.codeScroller.scrollHeight - this.codeScroller.clientHeight;\r\n this.codeScroller.scrollTop = this.vScrollbar.applyDragDelta( delta, scrollMax );\r\n this._discardScroll = true;\r\n } );\r\n this.root.appendChild( this.vScrollbar.root );\r\n\r\n this.hScrollbar = new ScrollBar( false, ( delta ) => {\r\n const scrollMax = this.codeScroller.scrollWidth - this.codeScroller.clientWidth;\r\n this.codeScroller.scrollLeft = this.hScrollbar.applyDragDelta( delta, scrollMax );\r\n this._discardScroll = true;\r\n } );\r\n this.root.appendChild( this.hScrollbar.root );\r\n\r\n // Sync scrollbar thumbs on native scroll\r\n this.codeScroller.addEventListener( 'scroll', () => {\r\n if ( this._discardScroll )\r\n {\r\n this._discardScroll = false;\r\n return;\r\n }\r\n this._syncScrollBars();\r\n } );\r\n\r\n // Touch events for native scrolling on mobile\r\n let touchStartX = 0;\r\n let touchStartY = 0;\r\n\r\n this.codeScroller.addEventListener( 'touchstart', ( e: TouchEvent ) => {\r\n touchStartX = e.touches[0].clientX;\r\n touchStartY = e.touches[0].clientY;\r\n }, { passive: true } );\r\n\r\n this.codeScroller.addEventListener( 'touchmove', ( e: TouchEvent ) => {\r\n const touchX = e.touches[0].clientX;\r\n const touchY = e.touches[0].clientY;\r\n\r\n const deltaX = touchStartX - touchX;\r\n const deltaY = touchStartY - touchY;\r\n\r\n this.codeScroller.scrollLeft += deltaX;\r\n this.codeScroller.scrollTop += deltaY;\r\n\r\n touchStartX = touchX;\r\n touchStartY = touchY;\r\n }, { passive: true } );\r\n\r\n // Wheel: Ctrl+Wheel for font zoom, Shift+Wheel for horizontal scroll\r\n this.codeScroller.addEventListener( 'wheel', ( e: WheelEvent ) => {\r\n if ( e.ctrlKey )\r\n {\r\n e.preventDefault();\r\n this._applyFontSizeOffset( e.deltaY < 0 ? 1 : -1 );\r\n return;\r\n }\r\n\r\n if ( e.shiftKey )\r\n {\r\n this.codeScroller.scrollLeft += e.deltaY > 0 ? 10 : -10;\r\n }\r\n }, { passive: false } );\r\n }\r\n\r\n // Resize observer\r\n const codeResizeObserver = new ResizeObserver( () => {\r\n if ( !this.currentTab ) return;\r\n this.resize( true );\r\n } );\r\n codeResizeObserver.observe( this.codeArea.root );\r\n\r\n if ( !this.disableEdition )\r\n {\r\n // Add autocomplete box\r\n if( this.useAutoComplete )\r\n {\r\n this.autocomplete = LX.makeElement( 'div','autocomplete' );\r\n this.codeArea.attach( this.autocomplete );\r\n }\r\n\r\n const searchBoxClass = 'searchbox bg-card min-w-96 absolute z-100 top-8 right-2 rounded-lg border-color overflow-y-scroll opacity-0';\r\n\r\n // Add search box\r\n {\r\n const box = LX.makeElement( 'div', searchBoxClass, null, this.codeArea );\r\n const searchPanel = new LX.Panel();\r\n box.appendChild( searchPanel.root );\r\n\r\n searchPanel.sameLine();\r\n const textComponent = searchPanel.addText( null, '', null, { placeholder: 'Find', inputClass: 'bg-secondary' } );\r\n searchPanel.addButton( null, 'MatchCaseButton', ( v: boolean ) => {\r\n this._searchMatchCase = v;\r\n this._doSearch();\r\n }, { icon: 'CaseSensitive', selectable: true, buttonClass: 'link', title: 'Match Case',\r\n tooltip: true } );\r\n searchPanel.addButton( null, 'up', () => this._doSearch( null, true ), { icon: 'ArrowUp', buttonClass: 'ghost', title: 'Previous Match',\r\n tooltip: true } );\r\n searchPanel.addButton( null, 'down', () => this._doSearch(), { icon: 'ArrowDown', buttonClass: 'ghost', title: 'Next Match',\r\n tooltip: true } );\r\n searchPanel.addButton( null, 'x', this._doHideSearch.bind( this ), { icon: 'X', buttonClass: 'ghost', title: 'Close',\r\n tooltip: true } );\r\n searchPanel.endLine();\r\n\r\n const searchInput = textComponent.root.querySelector( 'input' );\r\n searchInput?.addEventListener( 'keyup', ( e: KeyboardEvent ) => {\r\n if ( e.key == 'Escape' ) this._doHideSearch();\r\n else if ( e.key == 'Enter' ) this._doSearch( ( e.target as HTMLInputElement ).value, !!e.shiftKey );\r\n } );\r\n\r\n this.searchBox = box;\r\n }\r\n\r\n // Add search LINE box\r\n {\r\n const box = LX.makeElement( 'div', searchBoxClass, null, this.codeArea );\r\n const searchPanel = new LX.Panel();\r\n box.appendChild( searchPanel.root );\r\n\r\n searchPanel.sameLine();\r\n const textComponent = searchPanel.addText( null, '', ( value: string ) => {\r\n searchInput.value = ':' + value.replaceAll( ':', '' );\r\n this._doGotoLine( parseInt( searchInput.value.slice( 1 ) ) );\r\n }, { className: 'flex-auto-fill', placeholder: 'Go to line', trigger: 'input' } );\r\n searchPanel.addButton( null, 'x', this._doHideSearch.bind( this ), { icon: 'X', title: 'Close', buttonClass: 'ghost',\r\n tooltip: true } );\r\n searchPanel.endLine();\r\n\r\n const searchInput = textComponent.root.querySelector( 'input' );\r\n searchInput.addEventListener( 'keyup', ( e: KeyboardEvent ) => {\r\n if ( e.key == 'Escape' ) this._doHideSearch();\r\n } );\r\n\r\n searchPanel.addText( null, 'Type a line number to go to (from 0 to 0).', null,\r\n { disabled: true, inputClass: 'text-xs bg-none', signal: '@line-number-range' } );\r\n\r\n this.searchLineBox = box;\r\n }\r\n }\r\n\r\n // Hidden textarea for capturing keyboard input (dead keys, IME, etc.)\r\n this._inputArea = LX.makeElement( 'textarea', 'absolute opacity-0 w-[1px] h-[1px] top-0 left-0 overflow-hidden resize-none', '', this.root );\r\n this._inputArea.setAttribute( 'autocorrect', 'off' );\r\n this._inputArea.setAttribute( 'autocapitalize', 'off' );\r\n this._inputArea.setAttribute( 'spellcheck', 'false' );\r\n this._inputArea.tabIndex = 0;\r\n\r\n // Events:\r\n this._inputArea.addEventListener( 'keydown', this._onKeyDown.bind( this ) );\r\n this._inputArea.addEventListener( 'compositionstart', () => this._composing = true );\r\n this._inputArea.addEventListener( 'compositionend', ( e: CompositionEvent ) => {\r\n this._composing = false;\r\n this._inputArea.value = '';\r\n if ( e.data ) this._doInsertChar( e.data );\r\n } );\r\n this._inputArea.addEventListener( 'input', () => {\r\n if ( this._composing ) return;\r\n const val = this._inputArea.value;\r\n if ( val )\r\n {\r\n this._inputArea.value = '';\r\n this._doInsertChar( val );\r\n }\r\n } );\r\n this._inputArea.addEventListener( 'focus', () => this._setFocused( true ) );\r\n this._inputArea.addEventListener( 'blur', () => this._setFocused( false ) );\r\n this.codeArea.root.addEventListener( 'mousedown', this._onMouseDown.bind( this ) );\r\n this.codeArea.root.addEventListener( 'contextmenu', this._onMouseDown.bind( this ) );\r\n\r\n // Bottom status panel\r\n this.statusPanel = this._createStatusPanel( options );\r\n if ( this.statusPanel )\r\n {\r\n // Don't do this.area.attach here, since it will append to the tabs area.\r\n this.area.root.appendChild( this.statusPanel.root );\r\n }\r\n\r\n if ( this.allowAddScripts )\r\n {\r\n this.onCreateFile = options.onCreateFile;\r\n this.addTab( '+', {\r\n selected: false,\r\n title: 'Create file'\r\n } );\r\n }\r\n\r\n // Starter code tab container\r\n if( options.defaultTab ?? true )\r\n {\r\n this.addTab( options.name || 'untitled', {\r\n language: this.highlight,\r\n title: options.title\r\n } );\r\n\r\n // Initial render\r\n this._renderAllLines();\r\n this._renderCursors();\r\n }\r\n \r\n this._init();\r\n }\r\n\r\n private _init()\r\n {\r\n if ( this._displayObservers ) return;\r\n\r\n this._isReady = false;\r\n\r\n const root = this.root;\r\n\r\n const _isVisible = () => {\r\n return (\r\n root.offsetParent !== null\r\n && root.clientWidth > 0\r\n && root.clientHeight > 0\r\n );\r\n };\r\n\r\n const _tryPrepare = async () => {\r\n if ( this._isReady ) return;\r\n if ( !_isVisible() ) return;\r\n\r\n // Stop observing once prepared\r\n intersectionObserver.disconnect();\r\n resizeObserver.disconnect();\r\n\r\n await this._setupEditorWhenVisible();\r\n };\r\n\r\n // IntersectionObserver (for viewport)\r\n const intersectionObserver = new IntersectionObserver( ( entries ) => {\r\n for ( const entry of entries )\r\n {\r\n if ( entry.isIntersecting )\r\n {\r\n _tryPrepare();\r\n }\r\n }\r\n } );\r\n intersectionObserver.observe( root );\r\n\r\n // ResizeObserver (for display property changes)\r\n const resizeObserver = new ResizeObserver( () => {\r\n _tryPrepare();\r\n } );\r\n resizeObserver.observe( root );\r\n\r\n // Fallback polling (don't use it for now)\r\n // const interval = setInterval( () => {\r\n // if ( this._isReady ) {\r\n // clearInterval( interval );\r\n // return;\r\n // }\r\n // _tryPrepare();\r\n // }, 250 );\r\n\r\n this._displayObservers = {\r\n intersectionObserver,\r\n resizeObserver\r\n // interval,\r\n };\r\n }\r\n\r\n clear()\r\n {\r\n console.assert( this.rightStatusPanel && this.leftStatusPanel, 'No panels to clear.' );\r\n this.rightStatusPanel.clear();\r\n this.leftStatusPanel.clear();\r\n }\r\n\r\n addExplorerItem( item: any )\r\n {\r\n if ( !this.explorer )\r\n {\r\n return;\r\n }\r\n\r\n if ( !this.explorer.innerTree.data.find( ( value: any, index: number ) => value.id === item.id ) )\r\n {\r\n this.explorer.innerTree.data.push( item );\r\n }\r\n };\r\n\r\n setText( text: string ): void\r\n {\r\n if( !this.currentTab ) return;\r\n\r\n this.doc.setText( text );\r\n this.cursorSet.set( 0, 0 );\r\n this.undoManager.clear();\r\n this._lineStates = [];\r\n this._renderAllLines();\r\n this._renderCursors();\r\n this._renderSelections();\r\n this.resize( true );\r\n }\r\n\r\n appendText( text: string ): void\r\n {\r\n const cursor = this.cursorSet.getPrimary();\r\n const { line, col } = cursor.head;\r\n\r\n const op = this.doc.insert( line, col, text );\r\n this.undoManager.record( op, this.cursorSet.getCursorPositions() );\r\n\r\n // Move cursor to end of inserted text\r\n const lines = text.split( /\\r?\\n/ );\r\n if ( lines.length === 1 )\r\n {\r\n cursor.head = { line, col: col + text.length };\r\n }\r\n else\r\n {\r\n cursor.head = { line: line + lines.length - 1, col: lines[ lines.length - 1 ].length };\r\n }\r\n cursor.anchor = { ...cursor.head };\r\n\r\n this._rebuildLines();\r\n this._renderCursors();\r\n this._renderSelections();\r\n this.resize();\r\n this._scrollCursorIntoView();\r\n }\r\n\r\n getText(): string\r\n {\r\n return this.doc.getText();\r\n }\r\n\r\n setLanguage( name: string, extension?: string ): void\r\n {\r\n const lang = Tokenizer.getLanguage( name );\r\n if ( !lang ) return;\r\n\r\n this.language = lang;\r\n\r\n if ( this.currentTab )\r\n {\r\n this.currentTab.language = name;\r\n\r\n if( !this.skipTabs )\r\n {\r\n this.tabs.setIcon( this.currentTab.name, getLanguageIcon( lang, extension ) );\r\n }\r\n }\r\n\r\n this._lineStates = [];\r\n this._renderAllLines();\r\n LX.emitSignal( '@highlight', name );\r\n }\r\n\r\n focus(): void\r\n {\r\n this._inputArea.focus();\r\n }\r\n\r\n addTab( name: string, options: Record<string, any> = {} ): CodeTab\r\n {\r\n const isNewTabButton = name === '+';\r\n const dom = LX.makeElement( 'div', 'code' );\r\n const langName = options.language ?? 'Plain Text';\r\n const langDef = Tokenizer.getLanguage( langName );\r\n const extension = LX.getExtension( name );\r\n const icon = isNewTabButton ? null : getLanguageIcon( langDef, extension );\r\n const selected = options.selected ?? true;\r\n\r\n const codeTab : CodeTab = {\r\n name,\r\n dom,\r\n doc: new CodeDocument( this.onCodeChange ),\r\n cursorSet: new CursorSet(),\r\n undoManager: new UndoManager(),\r\n language: langName,\r\n title: options.title ?? name\r\n };\r\n \r\n this._openedTabs[name] = codeTab;\r\n this._loadedTabs[name] = codeTab;\r\n\r\n if ( this.useFileExplorer && !isNewTabButton )\r\n {\r\n this.addExplorerItem( { id: name, skipVisibility: true, icon } );\r\n this.explorer.innerTree.frefresh( name );\r\n }\r\n\r\n if( !this.skipTabs )\r\n {\r\n this.tabs.add( name, dom, {\r\n selected,\r\n icon,\r\n fixed: isNewTabButton,\r\n title: codeTab.title,\r\n onSelect: this._onSelectTab.bind( this, isNewTabButton ),\r\n onContextMenu: this._onContextMenuTab.bind( this, isNewTabButton ),\r\n allowDelete: this.allowClosingTabs,\r\n indexOffset: options.indexOffset\r\n } );\r\n }\r\n\r\n // Move into the sizer..\r\n this.codeSizer.appendChild( dom );\r\n\r\n if( options.text )\r\n {\r\n codeTab.doc.setText( options.text );\r\n codeTab.cursorSet.set( 0, 0 );\r\n codeTab.undoManager.clear();\r\n this._renderAllLines();\r\n this._renderCursors();\r\n this._renderSelections();\r\n this._resetGutter();\r\n }\r\n\r\n if ( selected )\r\n {\r\n this.currentTab = codeTab;\r\n this._updateDataInfoPanel( '@tab-name', name );\r\n this.setLanguage( langName, extension );\r\n }\r\n\r\n return codeTab;\r\n }\r\n\r\n loadTab( name: string )\r\n {\r\n if ( this._openedTabs[name] )\r\n {\r\n this.tabs.select( name );\r\n return;\r\n }\r\n\r\n const tab = this._loadedTabs[name];\r\n if( tab )\r\n {\r\n this._openedTabs[name] = tab;\r\n\r\n this.tabs.add( name, tab.dom, {\r\n selected: true,\r\n // icon,\r\n title: tab.title,\r\n onSelect: this._onSelectTab.bind( this ),\r\n onContextMenu: this._onContextMenuTab.bind( this ),\r\n allowDelete: this.allowClosingTabs\r\n } );\r\n\r\n // Move into the sizer..\r\n this.codeSizer.appendChild( tab.dom );\r\n\r\n this.currentTab = tab;\r\n this._updateDataInfoPanel( '@tab-name', name );\r\n return;\r\n }\r\n \r\n this.addTab( name, this._storedTabs[name] ?? null );\r\n }\r\n\r\n closeTab( name: string )\r\n {\r\n if ( !this.allowClosingTabs ) return;\r\n\r\n this.tabs.delete( name );\r\n const tab = this._openedTabs[name];\r\n if ( tab )\r\n {\r\n tab.dom.remove();\r\n delete this._openedTabs[name];\r\n }\r\n\r\n // If we closed the current tab, switch to the first available\r\n if ( this.currentTab?.name === name )\r\n {\r\n const remaining = Object.keys( this._openedTabs ).filter( k => k !== '+' );\r\n if ( remaining.length > 0 )\r\n {\r\n this.tabs.select( remaining[0] );\r\n }\r\n else\r\n {\r\n this.currentTab = null;\r\n }\r\n }\r\n }\r\n\r\n setCustomSuggestions( suggestions: string[] )\r\n {\r\n if( !suggestions || suggestions.constructor !== Array )\r\n {\r\n console.warn( 'suggestions should be a string array!' );\r\n return;\r\n }\r\n\r\n this.customSuggestions = suggestions;\r\n }\r\n\r\n loadFile( file: File | string, options: Record<string, any> = {} ): void\r\n {\r\n const onLoad = ( text: string, name: string ) =>\r\n {\r\n // Remove Carriage Return in some cases and sub tabs using spaces\r\n text = text.replaceAll( '\\r', '' ).replaceAll( /\\t|\\\\t/g, ' '.repeat( this.tabSize ) );\r\n\r\n const ext = LX.getExtension( name );\r\n const lang = options.language ?? ( Tokenizer.getLanguage( options.language )\r\n ?? ( Tokenizer.getLanguageByExtension( ext ) ?? Tokenizer.getLanguage( 'Plain Text' )! ) );\r\n const langName = lang.name;\r\n\r\n if ( this.useFileExplorer || this.skipTabs )\r\n {\r\n this._storedTabs[name] = {\r\n text,\r\n title: options.title ?? name,\r\n language: langName,\r\n ...options\r\n };\r\n\r\n if ( this.useFileExplorer )\r\n {\r\n this.addExplorerItem( { id: name, skipVisibility: true, icon: getLanguageIcon( lang, ext ) } );\r\n this.explorer.innerTree.frefresh( name );\r\n }\r\n }\r\n else\r\n {\r\n this.addTab( name, {\r\n selected: true,\r\n title: options.title ?? name,\r\n language: langName\r\n } );\r\n \r\n this.doc.setText( text );\r\n this.setLanguage( langName, ext );\r\n this.cursorSet.set( 0, 0 );\r\n this.undoManager.clear();\r\n this._renderCursors();\r\n this._renderSelections();\r\n this._resetGutter();\r\n }\r\n\r\n if ( options.callback )\r\n {\r\n options.callback( name, text );\r\n }\r\n };\r\n\r\n if ( typeof file === 'string' )\r\n {\r\n const url = file;\r\n const name = options.filename ?? url.substring( url.lastIndexOf( '/' ) + 1 );\r\n\r\n LX.request( { url, success: ( text: string ) => {\r\n onLoad( text, name );\r\n } } );\r\n }\r\n else\r\n {\r\n const fr = new FileReader();\r\n fr.readAsText( file );\r\n fr.onload = ( e ) => {\r\n const text = ( e.currentTarget as any ).result;\r\n onLoad( text, file.name );\r\n };\r\n }\r\n }\r\n\r\n async loadFiles( files: string[], onComplete?: ( editor: CodeEditor, results: any[], total: number ) => void, async: boolean = false )\r\n {\r\n if ( !files || files.length === 0 )\r\n {\r\n onComplete?.( this, [], 0 );\r\n return;\r\n }\r\n\r\n const results: any[] = [];\r\n\r\n for ( const filePath of files )\r\n {\r\n try\r\n {\r\n const text = await LX.requestFileAsync( filePath, 'text' );\r\n\r\n // Process the loaded file\r\n const name = filePath.substring( filePath.lastIndexOf( '/' ) + 1 );\r\n const processedText = text.replaceAll( '\\r', '' ).replaceAll( /\\t|\\\\t/g, ' '.repeat( this.tabSize ) );\r\n\r\n const ext = LX.getExtension( name );\r\n const lang = Tokenizer.getLanguageByExtension( ext ) ?? Tokenizer.getLanguage( 'Plain Text' )!;\r\n const langName = lang.name;\r\n\r\n if ( this.useFileExplorer || this.skipTabs )\r\n {\r\n this._storedTabs[name] = {\r\n text: processedText,\r\n title: name,\r\n language: langName\r\n };\r\n\r\n if ( this.useFileExplorer )\r\n {\r\n this.addExplorerItem( { id: name, skipVisibility: true, icon: getLanguageIcon( lang, ext ) } );\r\n this.explorer.innerTree.frefresh( name );\r\n }\r\n }\r\n else\r\n {\r\n this.addTab( name, {\r\n selected: results.length === 0, // Select first tab only\r\n title: name,\r\n language: langName\r\n } );\r\n\r\n if ( results.length === 0 )\r\n {\r\n this.doc.setText( processedText );\r\n this.setLanguage( langName, ext );\r\n this.cursorSet.set( 0, 0 );\r\n this.undoManager.clear();\r\n this._renderCursors();\r\n this._renderSelections();\r\n this._resetGutter();\r\n }\r\n }\r\n\r\n results.push( { filePath, name, success: true } );\r\n }\r\n catch ( error )\r\n {\r\n console.error( `[LX.CodeEditor] Failed to load file: ${filePath}`, error );\r\n results.push( { filePath, success: false, error } );\r\n }\r\n }\r\n\r\n onComplete?.( this, results, results.length );\r\n }\r\n\r\n async _setupEditorWhenVisible()\r\n {\r\n // Load any font size from local storage\r\n // If not, use default size and make sure it's sync by not hardcoding a number by default here\r\n const savedFontSize = window.localStorage.getItem( 'lexcodeeditor-font-size' );\r\n if ( savedFontSize )\r\n {\r\n await this._setFontSize( parseInt( savedFontSize ), false );\r\n }\r\n else\r\n {\r\n const r: any = document.querySelector( ':root' );\r\n const s = getComputedStyle( r );\r\n this.fontSize = parseInt( s.getPropertyValue( '--code-editor-font-size' ) );\r\n await this._measureChar();\r\n }\r\n\r\n LX.emitSignal( '@font-size', this.fontSize );\r\n\r\n LX.doAsync( () => {\r\n \r\n if ( !this._isReady )\r\n {\r\n this._isReady = true;\r\n\r\n if ( this.onReady )\r\n {\r\n this.onReady( this );\r\n }\r\n\r\n console.log( `[LX.CodeEditor] Ready! (font size: ${this.fontSize}px, char size: ${this.charWidth}px)` );\r\n }\r\n }, 20 );\r\n }\r\n\r\n private _onSelectTab( isNewTabButton: boolean, event: MouseEvent, name: string ): void\r\n {\r\n if ( this.disableEdition )\r\n {\r\n return;\r\n }\r\n\r\n if ( isNewTabButton )\r\n {\r\n this._onNewTab( event );\r\n return;\r\n }\r\n\r\n this.currentTab = this._openedTabs[name];\r\n\r\n this._updateDataInfoPanel( '@tab-name', name );\r\n\r\n this.language = Tokenizer.getLanguage( this.currentTab.language ) ?? Tokenizer.getLanguage( 'Plain Text' )!;\r\n LX.emitSignal( '@highlight', this.currentTab.language );\r\n \r\n this._renderAllLines();\r\n this._afterCursorMove();\r\n\r\n if ( !isNewTabButton && this.onSelectTab )\r\n {\r\n this.onSelectTab( name, this );\r\n }\r\n }\r\n\r\n private _onNewTab( event: MouseEvent )\r\n {\r\n if ( this.onNewTab )\r\n {\r\n this.onNewTab( event );\r\n return;\r\n }\r\n\r\n const dmOptions = this.newTabOptions ?? [\r\n { name: 'Create file', icon: 'FilePlus', callback: this._onCreateNewFile.bind( this ) },\r\n { name: 'Load file', icon: 'FileUp', disabled: !this.allowLoadingFiles, callback: this._doLoadFromFile.bind( this ) }\r\n ];\r\n\r\n LX.addDropdownMenu( event.target, dmOptions, { side: 'bottom', align: 'start' } );\r\n }\r\n\r\n private _onCreateNewFile()\r\n {\r\n let options: any = {};\r\n\r\n if ( this.onCreateFile )\r\n {\r\n options = this.onCreateFile( this );\r\n // Skip adding new file\r\n if ( !options )\r\n { \r\n return;\r\n }\r\n }\r\n\r\n const name = options.name ?? 'unnamed.js';\r\n this.addTab( name, {\r\n selected: true,\r\n title: name,\r\n indexOffset: options.indexOffset,\r\n language: options.language ?? 'JavaScript'\r\n } );\r\n\r\n this._renderAllLines();\r\n this._renderCursors();\r\n this._renderSelections();\r\n this._resetGutter();\r\n }\r\n\r\n private _onContextMenuTab( isNewTabButton: boolean = false, event: any, name: string )\r\n {\r\n if ( isNewTabButton )\r\n {\r\n return;\r\n }\r\n\r\n LX.addDropdownMenu( event.target, [\r\n { name: 'Close', kbd: 'MWB', disabled: !this.allowClosingTabs, callback: () => {\r\n this.closeTab( name );\r\n } },\r\n { name: 'Close Others', disabled: !this.allowClosingTabs, callback: () => {\r\n for ( const key of Object.keys( this.tabs.tabs ) )\r\n {\r\n if ( key === '+' || key === name ) continue;\r\n this.closeTab( key );\r\n }\r\n } },\r\n { name: 'Close All', disabled: !this.allowClosingTabs, callback: () => {\r\n for ( const key of Object.keys( this.tabs.tabs ) )\r\n {\r\n if ( key === '+' ) continue;\r\n this.closeTab( key );\r\n }\r\n } },\r\n null,\r\n { name: 'Copy Path', icon: 'Copy', callback: () => {\r\n navigator.clipboard.writeText( this._openedTabs[name].path ?? '' );\r\n } }\r\n ], { side: 'bottom', align: 'start', event } );\r\n }\r\n\r\n private async _measureChar(): Promise<void>\r\n {\r\n const parentContainer = LX.makeContainer( null, 'lexcodeeditor', '', document.body );\r\n const container = LX.makeContainer( null, 'code', '', parentContainer );\r\n const line = document.createElement( 'pre' );\r\n container.appendChild( line );\r\n const measurer = document.createElement( 'span' );\r\n measurer.className = 'codechar';\r\n measurer.style.visibility = 'hidden';\r\n measurer.textContent = 'M';\r\n line.appendChild( measurer );\r\n\r\n // Force load the font before measuring\r\n const computedStyle = getComputedStyle( measurer );\r\n const fontFamily = computedStyle.fontFamily;\r\n const fontSize = computedStyle.fontSize;\r\n const fontWeight = computedStyle.fontWeight || 'normal';\r\n const fontStyle = computedStyle.fontStyle || 'normal';\r\n const fontString = `${fontStyle} ${fontWeight} ${fontSize} ${fontFamily}`;\r\n\r\n try\r\n {\r\n await document.fonts.load( fontString );\r\n }\r\n catch ( e )\r\n {\r\n console.warn( '[LX.CodeEditor] Failed to load font:', fontString, e );\r\n }\r\n\r\n // Use requestAnimationFrame to ensure the element is rendered\r\n requestAnimationFrame( () =>\r\n {\r\n const rect = measurer.getBoundingClientRect();\r\n this.charWidth = rect.width || 7;\r\n this.lineHeight = parseFloat( getComputedStyle( this.root ).getPropertyValue( '--code-editor-row-height' ) ) || 20;\r\n LX.deleteElement( parentContainer );\r\n\r\n // Re-render cursors with correct measurements\r\n this._renderCursors();\r\n this._renderSelections();\r\n this.resize( true );\r\n } );\r\n }\r\n\r\n private _createStatusPanel( options: Record<string, any> = {} )\r\n {\r\n if ( this.skipInfo )\r\n {\r\n return;\r\n }\r\n\r\n let panel = new LX.Panel( { className: 'lexcodetabinfo bg-inherit flex flex-row flex-auto-keep', height: 'auto' } );\r\n\r\n if ( this.onCreateStatusPanel )\r\n {\r\n this.onCreateStatusPanel( panel, this );\r\n }\r\n\r\n let leftStatusPanel = this.leftStatusPanel = new LX.Panel( { id: 'FontSizeZoomStatusComponent',\r\n className: 'pad-xs content-center items-center flex-auto-keep', width: 'auto', height: 'auto' } );\r\n leftStatusPanel.sameLine();\r\n\r\n // Zoom Component\r\n leftStatusPanel.addButton( null, 'ZoomOutButton', this._decreaseFontSize.bind( this ), { icon: 'ZoomOut', buttonClass: 'ghost sm',\r\n title: 'Zoom Out', tooltip: true } );\r\n leftStatusPanel.addLabel( this.fontSize, { fit: true, signal: '@font-size' } );\r\n leftStatusPanel.addButton( null, 'ZoomInButton', this._increaseFontSize.bind( this ), { icon: 'ZoomIn', buttonClass: 'ghost sm',\r\n title: 'Zoom In', tooltip: true } );\r\n leftStatusPanel.endLine( 'justify-start' );\r\n panel.attach( leftStatusPanel.root );\r\n\r\n // Filename cursor data\r\n let rightStatusPanel = this.rightStatusPanel = new LX.Panel( { className: 'pad-xs content-center items-center', height: 'auto' } );\r\n rightStatusPanel.sameLine();\r\n rightStatusPanel.addLabel( this.currentTab?.title ?? '', { id: 'EditorFilenameStatusComponent', fit: true, inputClass: 'text-xs',\r\n signal: '@tab-name' } );\r\n rightStatusPanel.addButton( null, 'Ln 1, Col 1', this._doOpenLineSearch.bind( this ), {\r\n id: 'EditorSelectionStatusComponent',\r\n buttonClass: 'outline xs',\r\n fit: true,\r\n signal: '@cursor-data'\r\n } );\r\n\r\n const tabSizeButton = rightStatusPanel.addButton( null, 'Spaces: ' + this.tabSize, ( value: any, event: any ) => {\r\n\r\n const _onNewTabSize = ( v: string ) => {\r\n this.tabSize = parseInt( v );\r\n this._rebuildLines();\r\n this._updateDataInfoPanel( '@tab-spaces', `Spaces: ${this.tabSize}` );\r\n }\r\n\r\n const dd = LX.addDropdownMenu(\r\n tabSizeButton.root,\r\n [ '2', '4', '8' ].map( ( v ) => { return { name: v, className: 'w-full place-content-center', callback: _onNewTabSize } } ),\r\n { side: 'top', align: 'end' }\r\n );\r\n LX.addClass( dd.root, 'min-w-16! items-center' );\r\n\r\n }, { id: 'EditorIndentationStatusComponent', buttonClass: 'outline xs', signal: '@tab-spaces' } );\r\n\r\n const langButton = rightStatusPanel.addButton( '<b>{ }</b>', this.highlight, ( value: any, event: any ) => {\r\n\r\n const dd = LX.addDropdownMenu(\r\n langButton.root,\r\n Tokenizer.getRegisteredLanguages().map( ( v ) => {\r\n const lang = Tokenizer.getLanguage( v );\r\n const icon: any = getLanguageIcon( lang );\r\n const iconData = icon ? icon.split( ' ' ) : [];\r\n return {\r\n name: v,\r\n icon: iconData[0],\r\n className: 'w-full text-xs px-3',\r\n svgClass: iconData.slice( 1 ).join( ' ' ),\r\n callback: ( v: string ) => this.setLanguage( v )\r\n };\r\n } ),\r\n { side: 'top', align: 'end' }\r\n );\r\n LX.addClass( dd.root, 'min-w-min! items-center' );\r\n\r\n }, { id: 'EditorLanguageStatusComponent', nameWidth: 'auto', buttonClass: 'outline xs', signal: '@highlight', title: '' } );\r\n\r\n rightStatusPanel.endLine( 'justify-end' );\r\n panel.attach( rightStatusPanel.root );\r\n\r\n const itemVisibilityMap: Record<string, boolean> = {\r\n 'Font Size Zoom': options.statusShowFontSizeZoom ?? true,\r\n 'Editor Filename': options.statusShowEditorFilename ?? true,\r\n 'Editor Selection': options.statusShowEditorSelection ?? true,\r\n 'Editor Indentation': options.statusShowEditorIndentation ?? true,\r\n 'Editor Language': options.statusShowEditorLanguage ?? true\r\n };\r\n\r\n const _setVisibility = ( itemName: string ) => {\r\n const b = panel.root.querySelector( `#${itemName.replaceAll( ' ', '' )}StatusComponent` );\r\n console.assert( b, `${itemName} has no status button!` );\r\n b.classList.toggle( 'hidden', !itemVisibilityMap[itemName] );\r\n };\r\n\r\n for ( const [ itemName, v ] of Object.entries( itemVisibilityMap ) )\r\n {\r\n _setVisibility( itemName );\r\n }\r\n\r\n panel.root.addEventListener( 'contextmenu', ( e: any ) => {\r\n if ( e.target\r\n && ( e.target.classList.contains( 'lexpanel' )\r\n || e.target.classList.contains( 'lexinlinecomponents' ) ) )\r\n {\r\n return;\r\n }\r\n\r\n const menuOptions = Object.keys( itemVisibilityMap ).map( ( itemName, idx ) => {\r\n const item: any = {\r\n name: itemName,\r\n icon: 'Check',\r\n callback: () => {\r\n itemVisibilityMap[itemName] = !itemVisibilityMap[itemName];\r\n _setVisibility( itemName );\r\n }\r\n };\r\n if ( !itemVisibilityMap[itemName] ) delete item.icon;\r\n return item;\r\n } );\r\n\r\n LX.addDropdownMenu( e.target, menuOptions, { side: 'top', align: 'start' } );\r\n } );\r\n\r\n return panel;\r\n }\r\n\r\n private _updateDataInfoPanel( signal: string, value: string )\r\n {\r\n if ( this.skipInfo ) return;\r\n\r\n if ( this.cursorSet.cursors.length > 1 )\r\n {\r\n value = '';\r\n }\r\n\r\n LX.emitSignal( signal, value );\r\n }\r\n\r\n /**\r\n * Tokenize a line and return its innerHTML with syntax highlighting spans.\r\n */\r\n private _tokenizeLine( lineIndex: number ): { html: string; endState: TokenizerState; tokens: Token[] }\r\n {\r\n const prevState = lineIndex > 0\r\n ? ( this._lineStates[ lineIndex - 1 ] ?? Tokenizer.initialState() )\r\n : Tokenizer.initialState();\r\n\r\n const lineText = this.doc.getLine( lineIndex );\r\n const result = Tokenizer.tokenizeLine( lineText, this.language, prevState );\r\n\r\n // Build HTML\r\n const langClass = this.language.name.toLowerCase().replace( /[^a-z]/g, '' );\r\n let html = '';\r\n for ( const token of result.tokens )\r\n {\r\n const cls = TOKEN_CLASS_MAP[ token.type ];\r\n const escaped = token.value\r\n .replace( /&/g, '&amp;' )\r\n .replace( /</g, '&lt;' )\r\n .replace( />/g, '&gt;' );\r\n if ( cls )\r\n {\r\n html += `<span class=\"${cls} ${langClass}\">${escaped}</span>`;\r\n }\r\n else\r\n {\r\n html += escaped;\r\n }\r\n }\r\n\r\n return { html: html || '&nbsp;', endState: result.state, tokens: result.tokens };\r\n }\r\n\r\n /**\r\n * Update symbol table for a line.\r\n */\r\n private _updateSymbolsForLine( lineIndex: number ): void\r\n {\r\n const lineText = this.doc.getLine( lineIndex );\r\n\r\n this.symbolTable.updateScopeForLine( lineIndex, lineText );\r\n\r\n this.symbolTable.removeLineSymbols( lineIndex );\r\n\r\n const { tokens } = this._tokenizeLine( lineIndex );\r\n const symbols = parseSymbolsFromLine( lineText, tokens, lineIndex, this.symbolTable );\r\n for ( const symbol of symbols )\r\n {\r\n this.symbolTable.addSymbol( symbol );\r\n }\r\n }\r\n\r\n /**\r\n * Render all lines from scratch.\r\n */\r\n private _renderAllLines(): void\r\n {\r\n if ( !this.currentTab ) return;\r\n\r\n this.codeContainer.innerHTML = '';\r\n this._lineElements = [];\r\n this._lineStates = [];\r\n this.symbolTable.clear(); // Clear all symbols on full rebuild\r\n\r\n for ( let i = 0; i < this.doc.lineCount; i++ )\r\n {\r\n this._appendLineElement( i );\r\n }\r\n }\r\n\r\n /**\r\n * Gets the html for the line gutter.\r\n */\r\n private _getGutterHtml( lineIndex: number ): string\r\n {\r\n return `<span class=\"line-gutter\">${lineIndex + 1}</span>`;\r\n }\r\n\r\n /**\r\n * Create and append a <pre> element for a line.\r\n */\r\n private _appendLineElement( lineIndex: number ): void\r\n {\r\n const { html, endState } = this._tokenizeLine( lineIndex );\r\n this._lineStates[ lineIndex ] = endState;\r\n\r\n const pre = document.createElement( 'pre' );\r\n pre.innerHTML = this._getGutterHtml( lineIndex ) + html;\r\n this.codeContainer.appendChild( pre );\r\n this._lineElements[ lineIndex ] = pre;\r\n\r\n // Update symbols for this line\r\n this._updateSymbolsForLine( lineIndex );\r\n }\r\n\r\n /**\r\n * Re-render a single line's content (after editing).\r\n */\r\n private _updateLine( lineIndex: number ): void\r\n {\r\n const { html, endState } = this._tokenizeLine( lineIndex );\r\n const oldState = this._lineStates[ lineIndex ];\r\n this._lineStates[ lineIndex ] = endState;\r\n\r\n if ( this._lineElements[ lineIndex ] )\r\n {\r\n this._lineElements[ lineIndex ].innerHTML = this._getGutterHtml( lineIndex ) + html;\r\n }\r\n\r\n // Update symbols for this line\r\n this._updateSymbolsForLine( lineIndex );\r\n\r\n // If the tokenizer state changed (e.g. opened/closed a block comment),\r\n // re-render subsequent lines until states stabilize\r\n if ( !this._statesEqual( oldState, endState ) )\r\n {\r\n for ( let i = lineIndex + 1; i < this.doc.lineCount; i++ )\r\n {\r\n const { html: nextHtml, endState: nextEnd } = this._tokenizeLine( i );\r\n const nextOld = this._lineStates[ i ];\r\n this._lineStates[ i ] = nextEnd;\r\n if ( this._lineElements[ i ] )\r\n {\r\n this._lineElements[ i ].innerHTML = this._getGutterHtml( i ) + nextHtml;\r\n }\r\n this._updateSymbolsForLine( i ); // Update symbols for cascaded lines too\r\n if ( this._statesEqual( nextOld, nextEnd ) ) break;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Rebuild line elements after structural changes (insert/delete lines).\r\n */\r\n private _rebuildLines(): void\r\n {\r\n // Diff: if count matches, just update content; otherwise full rebuild\r\n if ( this._lineElements.length === this.doc.lineCount )\r\n {\r\n for ( let i = 0; i < this.doc.lineCount; i++ )\r\n {\r\n this._updateLine( i );\r\n }\r\n }\r\n else\r\n {\r\n this._renderAllLines();\r\n }\r\n this.resize();\r\n }\r\n\r\n private _statesEqual( a: TokenizerState | undefined, b: TokenizerState ): boolean\r\n {\r\n if ( !a ) return false;\r\n if ( a.stack.length !== b.stack.length ) return false;\r\n for ( let i = 0; i < a.stack.length; i++ )\r\n {\r\n if ( a.stack[i] !== b.stack[i] ) return false;\r\n }\r\n return true;\r\n }\r\n\r\n private _updateActiveLine(): void\r\n {\r\n const hasSelection = this.cursorSet.hasSelection();\r\n const activeLine = this.cursorSet.getPrimary().head.line;\r\n const activeCol = this.cursorSet.getPrimary().head.col;\r\n for ( let i = 0; i < this._lineElements.length; i++ )\r\n {\r\n this._lineElements[i].classList.toggle( 'active-line', !hasSelection && i === activeLine );\r\n }\r\n\r\n this._updateDataInfoPanel( '@cursor-data', `Ln ${activeLine + 1}, Col ${activeCol + 1}` );\r\n }\r\n\r\n private _renderCursors(): void\r\n {\r\n if ( !this.currentTab ) return;\r\n\r\n this.cursorsLayer.innerHTML = '';\r\n\r\n for ( const sel of this.cursorSet.cursors )\r\n {\r\n const el = document.createElement( 'div' );\r\n el.className = 'cursor';\r\n el.innerHTML = '&nbsp;';\r\n el.style.left = ( sel.head.col * this.charWidth + this.xPadding ) + 'px';\r\n el.style.top = ( sel.head.line * this.lineHeight ) + 'px';\r\n this.cursorsLayer.appendChild( el );\r\n }\r\n\r\n this._updateActiveLine();\r\n }\r\n\r\n private _renderSelections(): void\r\n {\r\n if ( !this.currentTab ) return;\r\n\r\n this.selectionsLayer.innerHTML = '';\r\n\r\n for ( const sel of this.cursorSet.cursors )\r\n {\r\n if ( selectionIsEmpty( sel ) ) continue;\r\n\r\n const start = selectionStart( sel );\r\n const end = selectionEnd( sel );\r\n\r\n for ( let line = start.line; line <= end.line; line++ )\r\n {\r\n const lineText = this.doc.getLine( line );\r\n const fromCol = line === start.line ? start.col : 0;\r\n const toCol = line === end.line ? end.col : lineText.length;\r\n\r\n if ( fromCol === toCol ) continue;\r\n\r\n const div = document.createElement( 'div' );\r\n div.className = 'lexcodeselection';\r\n div.style.top = ( line * this.lineHeight ) + 'px';\r\n div.style.left = ( fromCol * this.charWidth + this.xPadding ) + 'px';\r\n div.style.width = ( ( toCol - fromCol ) * this.charWidth ) + 'px';\r\n this.selectionsLayer.appendChild( div );\r\n }\r\n }\r\n }\r\n\r\n private _setFocused( focused: boolean ): void\r\n {\r\n this._focused = focused;\r\n\r\n if ( focused )\r\n {\r\n this.cursorsLayer.classList.add( 'show' );\r\n this.selectionsLayer.classList.add( 'show' );\r\n this.selectionsLayer.classList.remove( 'unfocused' );\r\n this._startBlinker();\r\n }\r\n else\r\n {\r\n this.cursorsLayer.classList.remove( 'show' );\r\n if ( !this._isSearchBoxActive )\r\n {\r\n this.selectionsLayer.classList.add( 'unfocused' );\r\n }\r\n else\r\n {\r\n this.selectionsLayer.classList.add( 'show' );\r\n }\r\n this._stopBlinker();\r\n }\r\n }\r\n\r\n private _startBlinker(): void\r\n {\r\n this._stopBlinker();\r\n this._cursorVisible = true;\r\n this._setCursorVisibility( true );\r\n\r\n this._blinkerInterval = setInterval( () =>\r\n {\r\n this._cursorVisible = !this._cursorVisible;\r\n this._setCursorVisibility( this._cursorVisible );\r\n }, this._cursorBlinkRate );\r\n }\r\n\r\n private _stopBlinker(): void\r\n {\r\n if ( this._blinkerInterval !== null )\r\n {\r\n clearInterval( this._blinkerInterval );\r\n this._blinkerInterval = null;\r\n }\r\n }\r\n\r\n private _resetBlinker(): void\r\n {\r\n if ( this._focused )\r\n {\r\n this._startBlinker();\r\n }\r\n }\r\n\r\n private _setCursorVisibility( visible: boolean ): void\r\n {\r\n const cursors = this.cursorsLayer.querySelectorAll( '.cursor' );\r\n for ( const c of cursors )\r\n {\r\n ( c as HTMLElement ).style.opacity = visible ? '0.6' : '0';\r\n }\r\n }\r\n\r\n // Keyboard input events:\r\n\r\n private _onKeyDown( e: KeyboardEvent ): void\r\n {\r\n if ( !this.currentTab ) return;\r\n\r\n // Ignore events during IME / dead key composition\r\n if ( this._composing || e.key === 'Dead' ) return;\r\n\r\n // Ignore modifier-only presses\r\n if ( [ 'Control', 'Shift', 'Alt', 'Meta' ].includes( e.key ) ) return;\r\n\r\n const ctrl = e.ctrlKey || e.metaKey;\r\n const shift = e.shiftKey;\r\n const alt = e.altKey;\r\n\r\n if ( this._keyChain )\r\n {\r\n const chain = this._keyChain;\r\n this._keyChain = null;\r\n e.preventDefault();\r\n\r\n if ( ctrl && chain === 'k' )\r\n {\r\n switch ( e.key.toLowerCase() )\r\n {\r\n case 'c': this._commentLines(); return;\r\n case 'u': this._uncommentLines(); return;\r\n }\r\n }\r\n return; // Unknown chord, just consume it\r\n }\r\n\r\n if ( ctrl )\r\n {\r\n switch ( e.key.toLowerCase() )\r\n {\r\n case 'a':\r\n e.preventDefault();\r\n this.cursorSet.selectAll( this.doc );\r\n this._afterCursorMove();\r\n return;\r\n case 'd':\r\n e.preventDefault();\r\n this._doFindNextOcurrence();\r\n return;\r\n case 'f':\r\n e.preventDefault();\r\n this._doOpenSearch();\r\n return;\r\n case 'g':\r\n e.preventDefault();\r\n this._doOpenLineSearch();\r\n return;\r\n case 'k':\r\n e.preventDefault();\r\n this._keyChain = 'k';\r\n return;\r\n case 's': // save\r\n e.preventDefault();\r\n if ( this.onSave )\r\n {\r\n this.onSave( this.getText(), this );\r\n }\r\n return;\r\n case 'z':\r\n e.preventDefault();\r\n shift ? this._doRedo() : this._doUndo();\r\n return;\r\n case 'y':\r\n e.preventDefault();\r\n this._doRedo();\r\n return;\r\n case 'c':\r\n e.preventDefault();\r\n this._doCopy();\r\n return;\r\n case 'x':\r\n e.preventDefault();\r\n this._doCut();\r\n return;\r\n case 'v':\r\n e.preventDefault();\r\n this._doPaste();\r\n return;\r\n case ' ':\r\n e.preventDefault();\r\n // Also call user callback if provided\r\n if ( this.onCtrlSpace )\r\n {\r\n this.onCtrlSpace( this.getText(), this );\r\n }\r\n return;\r\n }\r\n }\r\n\r\n switch ( e.key )\r\n {\r\n case 'ArrowLeft':\r\n e.preventDefault();\r\n this._wasPaired = false;\r\n if ( ctrl ) this.cursorSet.moveWordLeft( this.doc, shift );\r\n else this.cursorSet.moveLeft( this.doc, shift );\r\n this._afterCursorMove();\r\n return;\r\n case 'ArrowRight':\r\n e.preventDefault();\r\n this._wasPaired = false;\r\n if ( ctrl ) this.cursorSet.moveWordRight( this.doc, shift );\r\n else this.cursorSet.moveRight( this.doc, shift );\r\n this._afterCursorMove();\r\n return;\r\n case 'ArrowUp':\r\n e.preventDefault();\r\n if ( this._isAutoCompleteActive )\r\n {\r\n const items = this.autocomplete!.childNodes as NodeListOf<HTMLElement>;\r\n items[this._selectedAutocompleteIndex]?.classList.remove( 'selected' );\r\n this._selectedAutocompleteIndex = ( this._selectedAutocompleteIndex - 1 + items.length ) % items.length;\r\n items[this._selectedAutocompleteIndex]?.classList.add( 'selected' );\r\n items[this._selectedAutocompleteIndex]?.scrollIntoView( { block: 'nearest' } );\r\n return;\r\n }\r\n this._wasPaired = false;\r\n if ( alt && shift ) { this._duplicateLine( -1 ); return; }\r\n if ( alt ) { this._swapLine( -1 ); return; }\r\n this.cursorSet.moveUp( this.doc, shift );\r\n this._afterCursorMove();\r\n return;\r\n case 'ArrowDown':\r\n e.preventDefault();\r\n if ( this._isAutoCompleteActive )\r\n {\r\n const items = this.autocomplete!.childNodes as NodeListOf<HTMLElement>;\r\n items[this._selectedAutocompleteIndex]?.classList.remove( 'selected' );\r\n this._selectedAutocompleteIndex = ( this._selectedAutocompleteIndex + 1 ) % items.length;\r\n items[this._selectedAutocompleteIndex]?.classList.add( 'selected' );\r\n items[this._selectedAutocompleteIndex]?.scrollIntoView( { block: 'nearest' } );\r\n return;\r\n }\r\n this._wasPaired = false;\r\n if ( alt && shift ) { this._duplicateLine( 1 ); return; }\r\n if ( alt ) { this._swapLine( 1 ); return; }\r\n this.cursorSet.moveDown( this.doc, shift );\r\n this._afterCursorMove();\r\n return;\r\n case 'Home':\r\n e.preventDefault();\r\n this._wasPaired = false;\r\n this.cursorSet.moveToLineStart( this.doc, shift );\r\n this._afterCursorMove();\r\n return;\r\n case 'End':\r\n e.preventDefault();\r\n this._wasPaired = false;\r\n this.cursorSet.moveToLineEnd( this.doc, shift );\r\n this._afterCursorMove();\r\n return;\r\n case 'Escape':\r\n e.preventDefault();\r\n if( this._isAutoCompleteActive )\r\n {\r\n this._doHideAutocomplete();\r\n return;\r\n }\r\n if ( this._doHideSearch() ) return;\r\n this.cursorSet.removeSecondaryCursors();\r\n // Collapse selection\r\n const h = this.cursorSet.getPrimary().head;\r\n this.cursorSet.set( h.line, h.col );\r\n this._afterCursorMove();\r\n return;\r\n }\r\n\r\n switch ( e.key )\r\n {\r\n case 'Backspace':\r\n e.preventDefault();\r\n this._doBackspace( ctrl );\r\n return;\r\n case 'Delete':\r\n e.preventDefault();\r\n this._doDelete( ctrl );\r\n return;\r\n case 'Enter':\r\n e.preventDefault();\r\n this._doEnter( ctrl );\r\n return;\r\n case 'Tab':\r\n e.preventDefault();\r\n this._doTab( shift );\r\n return;\r\n }\r\n\r\n if ( e.key.length === 1 && !ctrl )\r\n {\r\n e.preventDefault();\r\n this._doInsertChar( e.key );\r\n }\r\n }\r\n\r\n private _flushIfActionChanged( action: string ): void\r\n {\r\n if ( this._lastAction !== action )\r\n {\r\n this.undoManager.flush( this.cursorSet.getCursorPositions() );\r\n this._lastAction = action;\r\n }\r\n }\r\n\r\n private _flushAction(): void\r\n {\r\n this.undoManager.flush( this.cursorSet.getCursorPositions() );\r\n this._lastAction = '';\r\n }\r\n\r\n private _doInsertChar( char: string ): void\r\n {\r\n // Enclose selection if applicable\r\n if ( char in CodeEditor.PAIR_KEYS && this.cursorSet.hasSelection() )\r\n {\r\n this._encloseSelection( char, CodeEditor.PAIR_KEYS[ char ] );\r\n return;\r\n }\r\n\r\n this._flushIfActionChanged( 'insert' );\r\n\r\n this._deleteSelectionIfAny();\r\n\r\n const changedLines = new Set<number>();\r\n let paired = false;\r\n\r\n for ( const idx of this.cursorSet.sortedIndicesBottomUp() )\r\n {\r\n const cursor = this.cursorSet.cursors[idx];\r\n const { line, col } = cursor.head;\r\n const nextChar = this.doc.getCharAt( line, col );\r\n\r\n // If we just auto-paired and the next char is the same closing char, skip over it\r\n if ( this._wasPaired && nextChar === char )\r\n {\r\n cursor.head = { line, col: col + 1 };\r\n cursor.anchor = { ...cursor.head };\r\n continue;\r\n }\r\n\r\n const op = this.doc.insert( line, col, char );\r\n this.undoManager.record( op, this.cursorSet.getCursorPositions() );\r\n\r\n const pairInserted = char in CodeEditor.PAIR_KEYS && ( !nextChar || /\\s/.test( nextChar ) );\r\n const charsInserted = pairInserted ? 2 : 1;\r\n\r\n // Auto-pair: insert closing char if next char is whitespace or end of line\r\n if ( pairInserted )\r\n {\r\n const closeOp = this.doc.insert( line, col + 1, CodeEditor.PAIR_KEYS[ char ] );\r\n this.undoManager.record( closeOp, this.cursorSet.getCursorPositions() );\r\n paired = true;\r\n }\r\n\r\n cursor.head = { line, col: col + 1 };\r\n cursor.anchor = { ...cursor.head };\r\n this.cursorSet.adjustOthers( idx, line, col, charsInserted );\r\n changedLines.add( line );\r\n }\r\n\r\n this._wasPaired = paired;\r\n for ( const line of changedLines ) this._updateLine( line );\r\n this._afterCursorMove();\r\n\r\n // Close autocomplete when typing most chars (except word chars which update it)\r\n if ( /[\\w$]/.test( char ) )\r\n {\r\n // Update autocomplete with new partial word\r\n this._doOpenAutocomplete();\r\n }\r\n else\r\n {\r\n // Non-word char, close autocomplete\r\n this._doHideAutocomplete();\r\n }\r\n }\r\n\r\n private _getAffectedLines(): [ number, number ]\r\n {\r\n const cursor = this.cursorSet.getPrimary();\r\n const a = cursor.anchor.line;\r\n const h = cursor.head.line;\r\n return a <= h ? [ a, h ] : [ h, a ];\r\n }\r\n\r\n private _commentLines(): void\r\n {\r\n const token = this.language.lineComment;\r\n if ( !token ) return;\r\n\r\n const [ fromLine, toLine ] = this._getAffectedLines();\r\n const comment = token + ' ';\r\n\r\n // Find minimum indentation across affected lines (skip empty lines)\r\n let minIndent = Infinity;\r\n for ( let i = fromLine; i <= toLine; i++ )\r\n {\r\n const line = this.doc.getLine( i );\r\n if ( line.trim().length === 0 ) continue;\r\n minIndent = Math.min( minIndent, this.doc.getIndent( i ) );\r\n }\r\n if ( minIndent === Infinity ) minIndent = 0;\r\n\r\n this._flushAction();\r\n for ( let i = fromLine; i <= toLine; i++ )\r\n {\r\n const line = this.doc.getLine( i );\r\n if ( line.trim().length === 0 ) continue;\r\n const op = this.doc.insert( i, minIndent, comment );\r\n this.undoManager.record( op, this.cursorSet.getCursorPositions() );\r\n this._updateLine( i );\r\n }\r\n\r\n this._afterCursorMove();\r\n }\r\n\r\n private _uncommentLines(): void\r\n {\r\n const token = this.language.lineComment;\r\n if ( !token ) return;\r\n\r\n const [ fromLine, toLine ] = this._getAffectedLines();\r\n\r\n this._flushAction();\r\n for ( let i = fromLine; i <= toLine; i++ )\r\n {\r\n const line = this.doc.getLine( i );\r\n const indent = this.doc.getIndent( i );\r\n const rest = line.substring( indent );\r\n\r\n // Check for \"// \" or \"//\"\r\n if ( rest.startsWith( token + ' ' ) )\r\n {\r\n const op = this.doc.delete( i, indent, token.length + 1 );\r\n this.undoManager.record( op, this.cursorSet.getCursorPositions() );\r\n }\r\n else if ( rest.startsWith( token ) )\r\n {\r\n const op = this.doc.delete( i, indent, token.length );\r\n this.undoManager.record( op, this.cursorSet.getCursorPositions() );\r\n }\r\n }\r\n\r\n this._rebuildLines();\r\n this._afterCursorMove();\r\n }\r\n\r\n private _doFindNextOcurrence(): void\r\n {\r\n const primary = this.cursorSet.getPrimary();\r\n\r\n // Get the search text: selection or word under cursor\r\n let searchText = this.cursorSet.getSelectedText( this.doc );\r\n if ( !searchText )\r\n {\r\n const { line, col } = primary.head;\r\n const [ word, start, end ] = this.doc.getWordAt( line, col );\r\n if ( !word ) return;\r\n\r\n // Select the word under cursor first (first Ctrl+D)\r\n primary.anchor = { line, col: start };\r\n primary.head = { line, col: end };\r\n this._renderCursors();\r\n this._renderSelections();\r\n return;\r\n }\r\n\r\n const lastCursor = this.cursorSet.cursors[ this.cursorSet.cursors.length - 1 ];\r\n const lastEnd = posBefore( lastCursor.anchor, lastCursor.head ) ? lastCursor.head : lastCursor.anchor;\r\n\r\n const match = this.doc.findNext( searchText, lastEnd.line, lastEnd.col );\r\n if ( !match ) return;\r\n\r\n // Check if this occurrence is already selected by any cursor\r\n const alreadySelected = this.cursorSet.cursors.some( sel =>\r\n {\r\n const start = posBefore( sel.anchor, sel.head ) ? sel.anchor : sel.head;\r\n return start.line === match.line && start.col === match.col;\r\n } );\r\n\r\n if ( alreadySelected ) return;\r\n\r\n this.cursorSet.cursors.push( {\r\n anchor: { line: match.line, col: match.col },\r\n head: { line: match.line, col: match.col + searchText.length }\r\n } );\r\n\r\n this._renderCursors();\r\n this._renderSelections();\r\n this._scrollCursorIntoView();\r\n }\r\n\r\n private _doOpenSearch( clear: boolean = false ): void\r\n {\r\n if ( !this.searchBox ) return;\r\n\r\n this._doHideSearch();\r\n\r\n LX.addClass( this.searchBox, 'opened' );\r\n this._isSearchBoxActive = true;\r\n\r\n const input: HTMLInputElement | null = this.searchBox.querySelector( 'input' );\r\n if ( !input ) return;\r\n\r\n if ( clear )\r\n {\r\n input.value = '';\r\n }\r\n else if ( this.cursorSet.hasSelection() )\r\n {\r\n input.value = this.cursorSet.getSelectedText( this.doc );\r\n }\r\n\r\n input.selectionStart = 0;\r\n input.selectionEnd = input.value.length;\r\n input.focus();\r\n }\r\n\r\n private _doOpenLineSearch(): void\r\n {\r\n if ( !this.searchLineBox ) return;\r\n\r\n this._doHideSearch();\r\n\r\n LX.emitSignal( '@line-number-range', `Type a line number to go to (from 1 to ${this.doc.lineCount}).` )\r\n\r\n LX.addClass( this.searchLineBox, 'opened' );\r\n this._isSearchLineBoxActive = true;\r\n\r\n const input: HTMLInputElement | null = this.searchLineBox.querySelector( 'input' );\r\n if ( !input ) return;\r\n input.value = ':';\r\n input.focus();\r\n }\r\n\r\n /**\r\n * Returns true if visibility changed.\r\n */\r\n private _doHideSearch(): boolean\r\n {\r\n if ( !this.searchBox || !this.searchLineBox ) return false;\r\n\r\n const active = this._isSearchBoxActive;\r\n const activeLine = this._isSearchLineBoxActive;\r\n if ( active )\r\n {\r\n this.searchBox.classList.remove( 'opened' );\r\n this._isSearchBoxActive = false;\r\n this._lastSearchPos = null;\r\n }\r\n else if ( activeLine )\r\n {\r\n this.searchLineBox.classList.remove( 'opened' );\r\n this._isSearchLineBoxActive = false;\r\n }\r\n\r\n return ( active != this._isSearchBoxActive ) || ( activeLine != this._isSearchLineBoxActive );\r\n }\r\n\r\n private _doSearch( text?: string | null, reverse: boolean = false, callback?: any, skipAlert: boolean = true, forceFocus: boolean = true )\r\n {\r\n text = text ?? this._lastTextFound;\r\n\r\n if ( !text ) return;\r\n\r\n const doc = this.doc;\r\n let startLine: number;\r\n let startCol: number;\r\n\r\n if ( this._lastSearchPos )\r\n {\r\n startLine = this._lastSearchPos.line;\r\n startCol = this._lastSearchPos.col + ( reverse ? -text.length : text.length );\r\n }\r\n else\r\n {\r\n const cursor = this.cursorSet.getPrimary();\r\n startLine = cursor.head.line;\r\n startCol = cursor.head.col;\r\n }\r\n\r\n const findInLine = ( lineIdx: number, fromCol: number ): number =>\r\n {\r\n let lineText = doc.getLine( lineIdx );\r\n let needle = text!;\r\n\r\n if ( !this._searchMatchCase )\r\n {\r\n lineText = lineText.toLowerCase();\r\n needle = needle.toLowerCase();\r\n }\r\n\r\n if ( reverse )\r\n {\r\n const sub = lineText.substring( 0, fromCol );\r\n return sub.lastIndexOf( needle );\r\n }\r\n else\r\n {\r\n return lineText.indexOf( needle, fromCol );\r\n }\r\n };\r\n\r\n let foundLine: number = -1;\r\n let foundCol: number = -1;\r\n\r\n if ( reverse )\r\n {\r\n for ( let j = startLine; j >= 0; j-- )\r\n {\r\n const col = findInLine( j, j === startLine ? startCol : doc.getLine( j ).length );\r\n if ( col > -1 )\r\n {\r\n foundLine = j;\r\n foundCol = col;\r\n break;\r\n }\r\n }\r\n\r\n // Wrap around from bottom\r\n if ( foundLine === -1 )\r\n {\r\n for ( let j = doc.lineCount - 1; j > startLine; j-- )\r\n {\r\n const col = findInLine( j, doc.getLine( j ).length );\r\n if ( col > -1 )\r\n {\r\n foundLine = j;\r\n foundCol = col;\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n else\r\n {\r\n for ( let j = startLine; j < doc.lineCount; j++ )\r\n {\r\n const col = findInLine( j, j === startLine ? startCol : 0 );\r\n if ( col > -1 )\r\n {\r\n foundLine = j;\r\n foundCol = col;\r\n break;\r\n }\r\n }\r\n\r\n // Wrap around from top\r\n if ( foundLine === -1 )\r\n {\r\n for ( let j = 0; j < startLine; j++ )\r\n {\r\n const col = findInLine( j, 0 );\r\n if ( col > -1 )\r\n {\r\n foundLine = j;\r\n foundCol = col;\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n if ( foundLine === -1 )\r\n {\r\n if ( !skipAlert ) alert( 'No results!' );\r\n this._lastSearchPos = null;\r\n return;\r\n }\r\n\r\n this._lastTextFound = text;\r\n this._lastSearchPos = { line: foundLine, col: foundCol };\r\n\r\n if ( callback )\r\n {\r\n callback( foundCol, foundLine );\r\n }\r\n else\r\n {\r\n // Select the found text\r\n const primary = this.cursorSet.getPrimary();\r\n primary.anchor = { line: foundLine, col: foundCol };\r\n primary.head = { line: foundLine, col: foundCol + text.length };\r\n this._renderCursors();\r\n this._renderSelections();\r\n }\r\n\r\n // Scroll to the match\r\n this.codeScroller.scrollTop = Math.max( ( foundLine - 10 ) * this.lineHeight, 0 );\r\n this.codeScroller.scrollLeft = Math.max( foundCol * this.charWidth - this.codeScroller.clientWidth / 2, 0 );\r\n\r\n if ( forceFocus )\r\n {\r\n const input = this.searchBox?.querySelector( 'input' );\r\n input?.focus();\r\n }\r\n }\r\n\r\n private _doGotoLine( lineNumber: number ): void\r\n {\r\n if ( Number.isNaN( lineNumber ) || lineNumber < 1 || lineNumber > this.doc.lineCount ) return;\r\n\r\n this.cursorSet.set( lineNumber - 1, 0 );\r\n\r\n this._afterCursorMove();\r\n }\r\n\r\n private _encloseSelection( open: string, close: string ): void\r\n {\r\n const cursor = this.cursorSet.getPrimary();\r\n const sel = cursor.anchor;\r\n const head = cursor.head;\r\n\r\n // Normalize selection (old invertIfNecessary)\r\n const fromLine = sel.line < head.line || ( sel.line === head.line && sel.col < head.col ) ? sel : head;\r\n const toLine = fromLine === sel ? head : sel;\r\n\r\n // Only single-line selections for now\r\n if ( fromLine.line !== toLine.line ) return;\r\n\r\n const line = fromLine.line;\r\n const from = fromLine.col;\r\n const to = toLine.col;\r\n\r\n this._flushAction();\r\n\r\n const op1 = this.doc.insert( line, from, open );\r\n this.undoManager.record( op1, this.cursorSet.getCursorPositions() );\r\n const op2 = this.doc.insert( line, to + 1, close );\r\n this.undoManager.record( op2, this.cursorSet.getCursorPositions() );\r\n\r\n // Keep selection on the enclosed word (shifted by 1)\r\n cursor.anchor = { line, col: from + 1 };\r\n cursor.head = { line, col: to + 1 };\r\n\r\n this._updateLine( line );\r\n this._afterCursorMove();\r\n }\r\n\r\n private _doBackspace( ctrlKey: boolean ): void\r\n {\r\n this._flushIfActionChanged( 'backspace' );\r\n\r\n // If any cursor has a selection, delete selections\r\n if ( this.cursorSet.hasSelection() )\r\n {\r\n this._deleteSelectionIfAny();\r\n this._rebuildLines();\r\n this._afterCursorMove();\r\n return;\r\n }\r\n\r\n for ( const idx of this.cursorSet.sortedIndicesBottomUp() )\r\n {\r\n const cursor = this.cursorSet.cursors[idx];\r\n const { line, col } = cursor.head;\r\n\r\n if ( line === 0 && col === 0 ) continue;\r\n\r\n if ( col === 0 )\r\n {\r\n // Merge with previous line\r\n const prevLineLen = this.doc.getLine( line - 1 ).length;\r\n const op = this.doc.delete( line - 1, prevLineLen, 1 );\r\n this.undoManager.record( op, this.cursorSet.getCursorPositions() );\r\n cursor.head = { line: line - 1, col: prevLineLen };\r\n cursor.anchor = { ...cursor.head };\r\n this.cursorSet.adjustOthers( idx, line, 0, prevLineLen, -1 );\r\n }\r\n else if ( ctrlKey )\r\n {\r\n // Delete word left\r\n const [ word, from ] = this.doc.getWordAt( line, col - 1 );\r\n const deleteFrom = word.length > 0 ? from : col - 1;\r\n const deleteLen = col - deleteFrom;\r\n const op = this.doc.delete( line, deleteFrom, deleteLen );\r\n this.undoManager.record( op, this.cursorSet.getCursorPositions() );\r\n cursor.head = { line, col: deleteFrom };\r\n cursor.anchor = { ...cursor.head };\r\n this.cursorSet.adjustOthers( idx, line, col, -deleteLen );\r\n }\r\n else\r\n {\r\n const op = this.doc.delete( line, col - 1, 1 );\r\n this.undoManager.record( op, this.cursorSet.getCursorPositions() );\r\n cursor.head = { line, col: col - 1 };\r\n cursor.anchor = { ...cursor.head };\r\n this.cursorSet.adjustOthers( idx, line, col, -1 );\r\n }\r\n }\r\n\r\n this._rebuildLines();\r\n this._afterCursorMove();\r\n this._doOpenAutocomplete();\r\n }\r\n\r\n private _doDelete( ctrlKey: boolean ): void\r\n {\r\n if ( this.cursorSet.hasSelection() )\r\n {\r\n this._deleteSelectionIfAny();\r\n this._rebuildLines();\r\n this._afterCursorMove();\r\n return;\r\n }\r\n\r\n this._flushIfActionChanged( 'delete' );\r\n\r\n for ( const idx of this.cursorSet.sortedIndicesBottomUp() )\r\n {\r\n const cursor = this.cursorSet.cursors[idx];\r\n const { line, col } = cursor.head;\r\n const lineText = this.doc.getLine( line );\r\n\r\n if ( col >= lineText.length && line >= this.doc.lineCount - 1 ) continue;\r\n\r\n if ( col >= lineText.length )\r\n {\r\n // Merge with next line\r\n const op = this.doc.delete( line, col, 1 );\r\n this.undoManager.record( op, this.cursorSet.getCursorPositions() );\r\n this.cursorSet.adjustOthers( idx, line, col, 0, -1 );\r\n }\r\n else if ( ctrlKey )\r\n {\r\n // Delete word right\r\n const [ word, , end ] = this.doc.getWordAt( line, col );\r\n const deleteLen = word.length > 0 ? end - col : 1;\r\n const op = this.doc.delete( line, col, deleteLen );\r\n this.undoManager.record( op, this.cursorSet.getCursorPositions() );\r\n this.cursorSet.adjustOthers( idx, line, col, -deleteLen );\r\n }\r\n else\r\n {\r\n const op = this.doc.delete( line, col, 1 );\r\n this.undoManager.record( op, this.cursorSet.getCursorPositions() );\r\n this.cursorSet.adjustOthers( idx, line, col, -1 );\r\n }\r\n }\r\n\r\n this._rebuildLines();\r\n this._afterCursorMove();\r\n }\r\n\r\n private _doEnter( shift: boolean ): void\r\n {\r\n if ( this._isAutoCompleteActive )\r\n {\r\n this._doAutocompleteWord();\r\n return;\r\n }\r\n\r\n if ( shift && this.onRun )\r\n {\r\n this.onRun( this.getText(), this );\r\n return;\r\n }\r\n\r\n this._deleteSelectionIfAny();\r\n this._flushAction();\r\n\r\n for ( const idx of this.cursorSet.sortedIndicesBottomUp() )\r\n {\r\n const cursor = this.cursorSet.cursors[idx];\r\n const { line, col } = cursor.head;\r\n\r\n const indent = this.doc.getIndent( line );\r\n const spaces = ' '.repeat( indent );\r\n\r\n const op = this.doc.insert( line, col, '\\n' + spaces );\r\n this.undoManager.record( op, this.cursorSet.getCursorPositions() );\r\n\r\n cursor.head = { line: line + 1, col: indent };\r\n cursor.anchor = { ...cursor.head };\r\n this.cursorSet.adjustOthers( idx, line, col, 0, 1 );\r\n }\r\n\r\n this._rebuildLines();\r\n this._afterCursorMove();\r\n }\r\n\r\n private _doTab( shift: boolean ): void\r\n {\r\n if ( this._isAutoCompleteActive )\r\n {\r\n this._doAutocompleteWord();\r\n return;\r\n }\r\n\r\n this._flushAction();\r\n\r\n for ( const idx of this.cursorSet.sortedIndicesBottomUp() )\r\n {\r\n const cursor = this.cursorSet.cursors[idx];\r\n const { line, col } = cursor.head;\r\n\r\n if ( shift )\r\n {\r\n // Dedent: remove up to tabSize spaces from start\r\n const lineText = this.doc.getLine( line );\r\n let spacesToRemove = 0;\r\n while ( spacesToRemove < this.tabSize && spacesToRemove < lineText.length && lineText[spacesToRemove] === ' ' )\r\n {\r\n spacesToRemove++;\r\n }\r\n if ( spacesToRemove > 0 )\r\n {\r\n const op = this.doc.delete( line, 0, spacesToRemove );\r\n this.undoManager.record( op, this.cursorSet.getCursorPositions() );\r\n cursor.head = { line, col: Math.max( 0, col - spacesToRemove ) };\r\n cursor.anchor = { ...cursor.head };\r\n this.cursorSet.adjustOthers( idx, line, 0, -spacesToRemove );\r\n }\r\n }\r\n else\r\n {\r\n const spacesToAdd = this.tabSize - ( col % this.tabSize );\r\n const spaces = ' '.repeat( spacesToAdd );\r\n const op = this.doc.insert( line, col, spaces );\r\n this.undoManager.record( op, this.cursorSet.getCursorPositions() );\r\n cursor.head = { line, col: col + spacesToAdd };\r\n cursor.anchor = { ...cursor.head };\r\n this.cursorSet.adjustOthers( idx, line, col, spacesToAdd );\r\n }\r\n }\r\n\r\n this._rebuildLines();\r\n this._afterCursorMove();\r\n }\r\n\r\n private _deleteSelectionIfAny(): void\r\n {\r\n let anyDeleted = false;\r\n\r\n for ( const idx of this.cursorSet.sortedIndicesBottomUp() )\r\n {\r\n const sel = this.cursorSet.cursors[idx];\r\n if ( selectionIsEmpty( sel ) ) continue;\r\n\r\n const start = selectionStart( sel );\r\n const end = selectionEnd( sel );\r\n const selectedText = this.cursorSet.getSelectedText( this.doc, idx );\r\n if ( !selectedText ) continue;\r\n\r\n const linesRemoved = end.line - start.line;\r\n // not exact for multiline, but start.col is where cursor lands\r\n const colDelta = linesRemoved === 0 ? ( end.col - start.col ) : start.col; \r\n\r\n const op = this.doc.delete( start.line, start.col, selectedText.length );\r\n this.undoManager.record( op, this.cursorSet.getCursorPositions() );\r\n\r\n sel.head = { ...start };\r\n sel.anchor = { ...start };\r\n this.cursorSet.adjustOthers( idx, start.line, start.col, -colDelta, -linesRemoved );\r\n anyDeleted = true;\r\n }\r\n\r\n if ( anyDeleted ) this._rebuildLines();\r\n }\r\n\r\n // Clipboard helpers:\r\n\r\n private _doCopy(): void\r\n {\r\n const text = this.cursorSet.getSelectedText( this.doc );\r\n if ( text )\r\n {\r\n navigator.clipboard.writeText( text );\r\n }\r\n }\r\n\r\n private _doCut(): void\r\n {\r\n this._flushAction();\r\n\r\n const text = this.cursorSet.getSelectedText( this.doc );\r\n if ( text )\r\n {\r\n navigator.clipboard.writeText( text );\r\n this._deleteSelectionIfAny();\r\n }\r\n else\r\n {\r\n const cursor = this.cursorSet.getPrimary();\r\n const line = cursor.head.line;\r\n const lineText = this.doc.getLine( line );\r\n const isLastLine = line === this.doc.lineCount - 1;\r\n\r\n navigator.clipboard.writeText( lineText + ( isLastLine ? '' : '\\n' ) );\r\n\r\n \r\n const op = this.doc.removeLine( line );\r\n this.undoManager.record( op, this.cursorSet.getCursorPositions() );\r\n\r\n // Place cursor at col 0 of the resulting line\r\n const newLine = Math.min( line, this.doc.lineCount - 1 );\r\n cursor.head = { line: newLine, col: 0 };\r\n cursor.anchor = { ...cursor.head };\r\n }\r\n\r\n this._rebuildLines();\r\n this._afterCursorMove();\r\n }\r\n\r\n private _swapLine( dir: -1 | 1 ): void\r\n {\r\n const cursor = this.cursorSet.getPrimary();\r\n const line = cursor.head.line;\r\n const targetLine = line + dir;\r\n\r\n if ( targetLine < 0 || targetLine >= this.doc.lineCount ) return;\r\n\r\n const currentText = this.doc.getLine( line );\r\n const targetText = this.doc.getLine( targetLine );\r\n\r\n this._flushAction();\r\n const op1 = this.doc.replaceLine( line, targetText );\r\n this.undoManager.record( op1, this.cursorSet.getCursorPositions() );\r\n const op2 = this.doc.replaceLine( targetLine, currentText );\r\n this.undoManager.record( op2, this.cursorSet.getCursorPositions() );\r\n\r\n cursor.head = { line: targetLine, col: cursor.head.col };\r\n cursor.anchor = { ...cursor.head };\r\n\r\n this._rebuildLines();\r\n this._afterCursorMove();\r\n }\r\n\r\n private _duplicateLine( dir: -1 | 1 ): void\r\n {\r\n const cursor = this.cursorSet.getPrimary();\r\n const line = cursor.head.line;\r\n const text = this.doc.getLine( line );\r\n\r\n this._flushAction();\r\n const op = this.doc.insertLine( line, text );\r\n this.undoManager.record( op, this.cursorSet.getCursorPositions() );\r\n\r\n const newLine = dir === 1 ? line + 1 : line;\r\n cursor.head = { line: newLine, col: cursor.head.col };\r\n cursor.anchor = { ...cursor.head };\r\n\r\n this._rebuildLines();\r\n this._afterCursorMove();\r\n }\r\n\r\n private async _doPaste(): Promise<void>\r\n {\r\n const text = await navigator.clipboard.readText();\r\n if ( !text ) return;\r\n \r\n this._flushAction();\r\n\r\n this._deleteSelectionIfAny();\r\n\r\n const cursor = this.cursorSet.getPrimary();\r\n const op = this.doc.insert( cursor.head.line, cursor.head.col, text );\r\n this.undoManager.record( op, this.cursorSet.getCursorPositions() );\r\n\r\n // Calculate new cursor position after paste\r\n const lines = text.split( '\\n' );\r\n if ( lines.length === 1 )\r\n {\r\n this.cursorSet.set( cursor.head.line, cursor.head.col + text.length );\r\n }\r\n else\r\n {\r\n this.cursorSet.set(\r\n cursor.head.line + lines.length - 1,\r\n lines[ lines.length - 1 ].length\r\n );\r\n }\r\n\r\n this._rebuildLines();\r\n this._afterCursorMove();\r\n }\r\n\r\n // Undo/Redo:\r\n\r\n private _doUndo(): void\r\n {\r\n const result = this.undoManager.undo( this.doc, this.cursorSet.getCursorPositions() );\r\n if ( result )\r\n {\r\n if ( result.cursors.length > 0 )\r\n {\r\n const c = result.cursors[0];\r\n this.cursorSet.set( c.line, c.col );\r\n }\r\n this._rebuildLines();\r\n this._afterCursorMove();\r\n }\r\n }\r\n\r\n private _doRedo(): void\r\n {\r\n const result = this.undoManager.redo( this.doc );\r\n if ( result )\r\n {\r\n if ( result.cursors.length > 0 )\r\n {\r\n const c = result.cursors[0];\r\n this.cursorSet.set( c.line, c.col );\r\n }\r\n this._rebuildLines();\r\n this._afterCursorMove();\r\n }\r\n }\r\n\r\n // Mouse input events:\r\n\r\n private _onMouseDown( e: MouseEvent ): void\r\n {\r\n if ( !this.currentTab ) return;\r\n if ( this.searchBox && this.searchBox.contains( e.target as Node ) ) return;\r\n if ( this.autocomplete && this.autocomplete.contains( e.target as Node ) ) return;\r\n\r\n e.preventDefault(); // Prevent browser from stealing focus from _inputArea\r\n this._wasPaired = false;\r\n\r\n // Calculate line and column from click position\r\n const rect = this.codeContainer.getBoundingClientRect();\r\n const x = e.clientX - rect.left - this.xPadding;\r\n const y = e.clientY - rect.top;\r\n\r\n const line = LX.clamp( Math.floor( y / this.lineHeight ), 0, this.doc.lineCount - 1 );\r\n const col = LX.clamp( Math.round( x / this.charWidth ), 0, this.doc.getLine( line ).length );\r\n\r\n if( e.type === 'contextmenu' )\r\n {\r\n this._onContextMenu( e, line, col );\r\n return;\r\n }\r\n\r\n if ( e.button !== 0 ) return;\r\n\r\n const now = Date.now();\r\n if ( now - this._lastClickTime < 400 && line === this._lastClickLine )\r\n {\r\n this._clickCount = Math.min( this._clickCount + 1, 3 );\r\n }\r\n else\r\n {\r\n this._clickCount = 1;\r\n }\r\n\r\n this._lastClickTime = now;\r\n this._lastClickLine = line;\r\n\r\n // Triple click: select entire line\r\n if ( this._clickCount === 3 )\r\n {\r\n const sel = this.cursorSet.getPrimary();\r\n sel.anchor = { line, col: 0 };\r\n sel.head = { line, col: this.doc.getLine( line ).length };\r\n }\r\n // Double click: select word\r\n else if ( this._clickCount === 2 )\r\n {\r\n const [ , start, end ] = this.doc.getWordAt( line, col );\r\n const sel = this.cursorSet.getPrimary();\r\n sel.anchor = { line, col: start };\r\n sel.head = { line, col: end };\r\n }\r\n else if ( e.shiftKey )\r\n {\r\n // Extend selection\r\n const sel = this.cursorSet.getPrimary();\r\n sel.head = { line, col };\r\n }\r\n else\r\n {\r\n this.cursorSet.set( line, col );\r\n }\r\n\r\n this._afterCursorMove();\r\n this._inputArea.focus();\r\n\r\n // Track mouse for drag selection\r\n const onMouseMove = ( me: MouseEvent ) =>\r\n {\r\n const mx = me.clientX - rect.left - this.xPadding;\r\n const my = me.clientY - rect.top;\r\n const ml = Math.max( 0, Math.min( Math.floor( my / this.lineHeight ), this.doc.lineCount - 1 ) );\r\n const mc = Math.max( 0, Math.min( Math.round( mx / this.charWidth ), this.doc.getLine( ml ).length ) );\r\n\r\n const sel = this.cursorSet.getPrimary();\r\n sel.head = { line: ml, col: mc };\r\n this._renderCursors();\r\n this._renderSelections();\r\n };\r\n\r\n const onMouseUp = () =>\r\n {\r\n document.removeEventListener( 'mousemove', onMouseMove );\r\n document.removeEventListener( 'mouseup', onMouseUp );\r\n };\r\n\r\n document.addEventListener( 'mousemove', onMouseMove );\r\n document.addEventListener( 'mouseup', onMouseUp );\r\n }\r\n\r\n private _onContextMenu( e: MouseEvent, line: number, col: number ): void\r\n {\r\n e.preventDefault();\r\n \r\n // if ( !this.canOpenContextMenu )\r\n // {\r\n // return;\r\n // }\r\n\r\n const dmOptions: any[] = [ { name: 'Copy', icon: 'Copy', callback: () => this._doCopy(), kbd: ['Ctrl', 'C'], useKbdSpecialKeys: false } ];\r\n\r\n if ( !this.disableEdition )\r\n {\r\n dmOptions.push( { name: 'Cut', icon: 'Scissors', callback: () => this._doCut(), kbd: ['Ctrl', 'X'], useKbdSpecialKeys: false } );\r\n dmOptions.push( { name: 'Paste', icon: 'Paste', callback: () => this._doPaste(), kbd: ['Ctrl', 'V'], useKbdSpecialKeys: false } );\r\n }\r\n\r\n if ( this.onContextMenu )\r\n {\r\n const content = this.cursorSet.getSelectedText( this.doc );\r\n const options = this.onContextMenu( this, content, e );\r\n if ( options?.length )\r\n {\r\n dmOptions.push( null ); // Separator\r\n\r\n for ( const o of options )\r\n {\r\n dmOptions.push( { name: o.path, disabled: o.disabled, callback: o.callback } );\r\n }\r\n }\r\n }\r\n\r\n LX.addDropdownMenu( e.target, dmOptions, { event: e, side: 'bottom', align: 'start' } );\r\n }\r\n\r\n // Autocomplete:\r\n\r\n /**\r\n * Get word at cursor position for autocomplete.\r\n */\r\n private _getWordAtCursor(): { word: string, start: number, end: number }\r\n {\r\n const cursor = this.cursorSet.getPrimary().head;\r\n const line = this.doc.getLine( cursor.line );\r\n let start = cursor.col;\r\n let end = cursor.col;\r\n\r\n // Find word boundaries\r\n while ( start > 0 && /[\\w$]/.test( line[start - 1] ) ) start--;\r\n while ( end < line.length && /[\\w$]/.test( line[end] ) ) end++;\r\n\r\n return { word: line.slice( start, end ), start, end };\r\n }\r\n\r\n /**\r\n * Open autocomplete box with suggestions from symbols and custom suggestions.\r\n */\r\n private _doOpenAutocomplete(): void\r\n {\r\n if ( !this.autocomplete || !this.useAutoComplete ) return;\r\n\r\n this.autocomplete.innerHTML = ''; // Clear all suggestions\r\n\r\n const { word } = this._getWordAtCursor();\r\n if( !word || word.length === 0 )\r\n {\r\n this._doHideAutocomplete();\r\n return;\r\n }\r\n\r\n const suggestions: Array<{ label: string, kind?: string, scope?: string, detail?: string }> = [];\r\n const added = new Set<string>();\r\n\r\n const addSuggestion = ( label: string, kind?: string, scope?: string, detail?: string ) =>\r\n {\r\n if ( !added.has( label ) )\r\n {\r\n suggestions.push( { label, kind, scope, detail } );\r\n added.add( label );\r\n }\r\n };\r\n\r\n // Get first suggestions from symbol table\r\n const allSymbols = this.symbolTable.getAllSymbols();\r\n for ( const symbol of allSymbols )\r\n {\r\n if ( symbol.name.toLowerCase().startsWith( word.toLowerCase() ) )\r\n {\r\n addSuggestion( symbol.name, symbol.kind, symbol.scope, `${symbol.kind} in ${symbol.scope}` );\r\n }\r\n }\r\n\r\n // Add language reserved keys\r\n for ( const reservedWord of this.language.reservedWords )\r\n {\r\n if ( reservedWord.toLowerCase().startsWith( word.toLowerCase() ) )\r\n {\r\n addSuggestion( reservedWord );\r\n }\r\n }\r\n\r\n // Add custom suggestions\r\n for ( const suggestion of this.customSuggestions )\r\n {\r\n const label = typeof suggestion === 'string' ? suggestion : suggestion.label;\r\n const kind = typeof suggestion === 'object' ? suggestion.kind : undefined;\r\n const detail = typeof suggestion === 'object' ? suggestion.detail : undefined;\r\n\r\n if ( label.toLowerCase().startsWith( word.toLowerCase() ) )\r\n {\r\n addSuggestion( label, kind, undefined, detail );\r\n }\r\n }\r\n\r\n // Close autocomplete if no suggestions\r\n if ( suggestions.length === 0 )\r\n {\r\n this._doHideAutocomplete();\r\n return;\r\n }\r\n\r\n // Sort suggestions: exact matches first, then alphabetically\r\n suggestions.sort( ( a, b ) =>\r\n {\r\n const aExact = a.label.toLowerCase() === word.toLowerCase() ? 0 : 1;\r\n const bExact = b.label.toLowerCase() === word.toLowerCase() ? 0 : 1;\r\n if ( aExact !== bExact ) return aExact - bExact;\r\n return a.label.localeCompare( b.label );\r\n } );\r\n\r\n this._selectedAutocompleteIndex = 0;\r\n\r\n // Render suggestions\r\n suggestions.forEach( ( suggestion, index ) =>\r\n {\r\n const item = document.createElement( 'pre' );\r\n if ( index === this._selectedAutocompleteIndex ) item.classList.add( 'selected' );\r\n const currSuggestion = suggestion.label;\r\n\r\n let iconName = 'CaseLower';\r\n let iconClass = 'foo';\r\n\r\n switch ( suggestion.kind )\r\n {\r\n case 'class':\r\n iconName = 'CircleNodes';\r\n iconClass = 'text-orange-500';\r\n break;\r\n case 'struct':\r\n iconName = 'Form';\r\n iconClass = 'text-orange-400';\r\n break;\r\n case 'interface':\r\n iconName = 'FileType';\r\n iconClass = 'text-cyan-500';\r\n break;\r\n case 'enum':\r\n iconName = 'ListTree';\r\n iconClass = 'text-yellow-500';\r\n break;\r\n case 'enum-value':\r\n iconName = 'Dot';\r\n iconClass = 'text-yellow-400';\r\n break;\r\n case 'type':\r\n iconName = 'Type';\r\n iconClass = 'text-teal-500';\r\n break;\r\n case 'function':\r\n iconName = 'Function';\r\n iconClass = 'text-purple-500';\r\n break;\r\n case 'method':\r\n iconName = 'Box';\r\n iconClass = 'text-fuchsia-500';\r\n break;\r\n case 'variable':\r\n iconName = 'Cuboid';\r\n iconClass = 'text-blue-400';\r\n break;\r\n case 'property':\r\n iconName = 'Layers';\r\n iconClass = 'text-blue-300';\r\n break;\r\n case 'constructor-call':\r\n iconName = 'Hammer';\r\n iconClass = 'text-green-500';\r\n break;\r\n case 'method-call':\r\n iconName = 'PlayCircle';\r\n iconClass = 'text-gray-400';\r\n break;\r\n default:\r\n iconName = 'CaseLower';\r\n iconClass = 'text-gray-500';\r\n break;\r\n }\r\n\r\n item.appendChild( LX.makeIcon( iconName, { iconClass: 'ml-1 mr-2', svgClass: 'sm ' + iconClass } ) );\r\n\r\n // Highlight the written part\r\n const hIndex = currSuggestion.toLowerCase().indexOf( word.toLowerCase() );\r\n\r\n var preWord = document.createElement( 'span' );\r\n preWord.textContent = currSuggestion.substring( 0, hIndex );\r\n item.appendChild( preWord );\r\n\r\n var actualWord = document.createElement( 'span' );\r\n actualWord.textContent = currSuggestion.substring( hIndex, hIndex + word.length );\r\n actualWord.classList.add( 'word-highlight' );\r\n item.appendChild( actualWord );\r\n\r\n var postWord = document.createElement( 'span' );\r\n postWord.textContent = currSuggestion.substring( hIndex + word.length );\r\n item.appendChild( postWord );\r\n\r\n if ( suggestion.kind )\r\n {\r\n const kind = document.createElement( 'span' );\r\n kind.textContent = ` (${suggestion.kind})`;\r\n kind.className = 'kind text-muted-foreground text-xs! ml-2';\r\n item.appendChild( kind );\r\n }\r\n\r\n item.addEventListener( 'click', () =>\r\n {\r\n this._doAutocompleteWord();\r\n } );\r\n\r\n this.autocomplete!.appendChild( item );\r\n } );\r\n\r\n this._isAutoCompleteActive = true;\r\n\r\n const handleClick = ( e: MouseEvent ) =>\r\n {\r\n if ( !this.autocomplete?.contains( e.target as Node ) )\r\n {\r\n this._doHideAutocomplete();\r\n }\r\n };\r\n setTimeout( () => document.addEventListener( 'click', handleClick, { once: true } ), 0 );\r\n\r\n // Store cleanup function\r\n ( this.autocomplete as any )._cleanup = () =>\r\n {\r\n document.removeEventListener( 'click', handleClick );\r\n };\r\n\r\n // Prepare autocomplete ui\r\n this.autocomplete.classList.toggle( 'show', true );\r\n this.autocomplete.classList.toggle( 'no-scrollbar', !( this.autocomplete.scrollHeight > this.autocomplete.offsetHeight ) );\r\n const cursor = this.cursorSet.getPrimary().head;\r\n const left = cursor.col * this.charWidth + this.xPadding;\r\n const top = ( cursor.line + 1 ) * this.lineHeight + this._cachedTabsHeight - this.codeScroller.scrollTop;\r\n this.autocomplete.style.left = left + 'px';\r\n this.autocomplete.style.top = top + 'px';\r\n }\r\n\r\n private _doHideAutocomplete(): void\r\n {\r\n if ( !this.autocomplete || !this._isAutoCompleteActive ) return;\r\n\r\n this.autocomplete.innerHTML = ''; // Clear all suggestions\r\n this.autocomplete.classList.remove( 'show' );\r\n this._isAutoCompleteActive = false;\r\n\r\n if ( ( this.autocomplete as any )._cleanup )\r\n {\r\n ( this.autocomplete as any )._cleanup();\r\n delete ( this.autocomplete as any )._cleanup;\r\n }\r\n }\r\n\r\n /**\r\n * Insert the selected autocomplete word at cursor.\r\n */\r\n private _doAutocompleteWord(): void\r\n {\r\n const word = this._getSelectedAutoCompleteWord();\r\n if ( !word ) return;\r\n const cursor = this.cursorSet.getPrimary().head;\r\n const { start, end } = this._getWordAtCursor();\r\n const line = cursor.line;\r\n\r\n const cursorsBefore = this.cursorSet.getCursorPositions();\r\n if ( end > start )\r\n {\r\n const deleteOp = this.doc.delete( line, start, end - start );\r\n this.undoManager.record( deleteOp, cursorsBefore );\r\n }\r\n\r\n const insertOp = this.doc.insert( line, start, word );\r\n this.cursorSet.set( line, start + word.length );\r\n\r\n const cursorsAfter = this.cursorSet.getCursorPositions();\r\n this.undoManager.record( insertOp, cursorsAfter );\r\n\r\n this._rebuildLines();\r\n this._afterCursorMove();\r\n this._doHideAutocomplete();\r\n }\r\n\r\n private _getSelectedAutoCompleteWord(): string | null\r\n {\r\n if ( !this.autocomplete || !this._isAutoCompleteActive ) return null;\r\n\r\n const pre = this.autocomplete.childNodes[ this._selectedAutocompleteIndex ];\r\n var word = '';\r\n for ( let childSpan of pre.childNodes )\r\n {\r\n const span = childSpan as HTMLElement;\r\n\r\n if ( span.constructor != HTMLSpanElement || span.classList.contains( 'kind' ) )\r\n {\r\n continue;\r\n }\r\n word += span.textContent;\r\n }\r\n\r\n return word;\r\n }\r\n\r\n private _afterCursorMove(): void\r\n {\r\n this._renderCursors();\r\n this._renderSelections();\r\n this._resetBlinker();\r\n this.resize();\r\n this._scrollCursorIntoView();\r\n }\r\n\r\n // Scrollbar & Resize:\r\n\r\n private _scrollCursorIntoView(): void\r\n {\r\n const cursor = this.cursorSet.getPrimary().head;\r\n const top = cursor.line * this.lineHeight;\r\n const left = cursor.col * this.charWidth;\r\n\r\n // Vertical scroll\r\n if ( top < this.codeScroller.scrollTop )\r\n {\r\n this.codeScroller.scrollTop = top;\r\n }\r\n else if ( top + this.lineHeight > this.codeScroller.scrollTop + this.codeScroller.clientHeight )\r\n {\r\n this.codeScroller.scrollTop = top + this.lineHeight - this.codeScroller.clientHeight;\r\n }\r\n\r\n // Horizontal scroll\r\n const sbOffset = ScrollBar.SIZE * 2;\r\n if ( left < this.codeScroller.scrollLeft )\r\n {\r\n this.codeScroller.scrollLeft = left;\r\n }\r\n else if ( left + sbOffset > this.codeScroller.scrollLeft + this.codeScroller.clientWidth - this.xPadding )\r\n {\r\n this.codeScroller.scrollLeft = left + sbOffset - this.codeScroller.clientWidth + this.xPadding;\r\n }\r\n }\r\n\r\n private _resetGutter(): void\r\n {\r\n // Use cached value or compute if not available (e.g., on initial load)\r\n const tabsHeight = this._cachedTabsHeight || ( this.tabs?.root.getBoundingClientRect().height ?? 0 );\r\n this.lineGutter.style.height = `calc(100% - ${tabsHeight}px)`;\r\n }\r\n\r\n getMaxLineLength(): number\r\n {\r\n if ( !this.currentTab ) return 0;\r\n\r\n let max = 0;\r\n for ( let i = 0; i < this.doc.lineCount; i++ )\r\n {\r\n const len = this.doc.getLine( i ).length;\r\n if ( len > max ) max = len;\r\n }\r\n return max;\r\n }\r\n\r\n resize( force: boolean = false ): void\r\n {\r\n if ( !this.charWidth ) return;\r\n\r\n // Cache layout measurements to avoid reflows\r\n this._cachedTabsHeight = this.tabs?.root.getBoundingClientRect().height ?? 0;\r\n this._cachedStatusPanelHeight = this.statusPanel?.root.getBoundingClientRect().height ?? 0;\r\n\r\n const maxLineLength = this.getMaxLineLength();\r\n const lineCount = this.currentTab ? this.doc.lineCount : 0;\r\n const viewportChars = Math.floor( ( this.codeScroller.clientWidth - this.xPadding ) / this.charWidth );\r\n const viewportLines = Math.floor( this.codeScroller.clientHeight / this.lineHeight );\r\n\r\n let needsHResize = maxLineLength !== this._lastMaxLineLength\r\n && ( maxLineLength >= viewportChars || this._lastMaxLineLength >= viewportChars );\r\n let needsVResize = lineCount !== this._lastLineCount\r\n && ( lineCount >= viewportLines || this._lastLineCount >= viewportLines );\r\n\r\n\r\n // If doesn't need resize due to not reaching min length, maybe we need to resize if the content shrinks and we have extra space now\r\n needsHResize = needsHResize || ( maxLineLength < viewportChars && this.hScrollbar?.visible );\r\n needsVResize = needsVResize || ( lineCount < viewportLines && this.vScrollbar?.visible );\r\n\r\n if ( !force && !needsHResize && !needsVResize ) return;\r\n\r\n this._lastMaxLineLength = maxLineLength;\r\n this._lastLineCount = lineCount;\r\n\r\n if ( force || needsHResize )\r\n {\r\n this.codeSizer.style.minWidth = ( maxLineLength * this.charWidth + this.xPadding + ScrollBar.SIZE * 2 ) + 'px';\r\n }\r\n\r\n if ( force || needsVResize )\r\n {\r\n this.codeSizer.style.minHeight = ( lineCount * this.lineHeight + ScrollBar.SIZE * 2 ) + 'px';\r\n }\r\n\r\n this._resetGutter();\r\n\r\n setTimeout( () => this._resizeScrollBars(), 10 );\r\n }\r\n\r\n private _resizeScrollBars(): void\r\n {\r\n if ( !this.vScrollbar ) return;\r\n\r\n // Use cached offsets to avoid reflows\r\n const topOffset = this._cachedTabsHeight;\r\n const bottomOffset = this._cachedStatusPanelHeight;\r\n\r\n // Vertical scrollbar: right edge, between tabs and status bar\r\n const scrollHeight = this.codeScroller.scrollHeight;\r\n this.vScrollbar.setThumbRatio( scrollHeight > 0 ? this.codeScroller.clientHeight / scrollHeight : 1 );\r\n this.vScrollbar.root.style.top = topOffset + 'px';\r\n this.vScrollbar.root.style.height = `calc(100% - ${topOffset + bottomOffset}px)`;\r\n\r\n // Horizontal scrollbar: bottom of code area, offset by gutter and vertical scrollbar\r\n const scrollWidth = this.codeScroller.scrollWidth;\r\n this.hScrollbar.setThumbRatio( scrollWidth > 0 ? this.codeScroller.clientWidth / scrollWidth : 1 );\r\n this.hScrollbar.root.style.bottom = bottomOffset + 'px';\r\n this.hScrollbar.root.style.width = `calc(100% - ${this.xPadding + ( this.vScrollbar.visible ? ScrollBar.SIZE : 0 )}px)`;\r\n }\r\n\r\n private _syncScrollBars(): void\r\n {\r\n if ( !this.vScrollbar ) return;\r\n\r\n this.vScrollbar.syncToScroll(\r\n this.codeScroller.scrollTop,\r\n this.codeScroller.scrollHeight - this.codeScroller.clientHeight\r\n );\r\n this.hScrollbar.syncToScroll(\r\n this.codeScroller.scrollLeft,\r\n this.codeScroller.scrollWidth - this.codeScroller.clientWidth\r\n );\r\n }\r\n\r\n // Files:\r\n\r\n private _doLoadFromFile()\r\n {\r\n const input = LX.makeElement( 'input', '', '', document.body );\r\n input.type = 'file';\r\n input.click();\r\n input.addEventListener( 'change', ( e: Event ) => {\r\n const target = e.target as HTMLInputElement;\r\n if ( target.files && target.files[0] )\r\n {\r\n this.loadFile( target.files[0] );\r\n }\r\n input.remove();\r\n } );\r\n }\r\n\r\n // Font Size utils:\r\n\r\n private async _setFontSize( size: number, updateDOM: boolean = true )\r\n {\r\n // Change font size\r\n this.fontSize = size;\r\n const r: any = document.querySelector( ':root' );\r\n r.style.setProperty( '--code-editor-font-size', `${this.fontSize}px` );\r\n window.localStorage.setItem( 'lexcodeeditor-font-size', `${this.fontSize}` );\r\n await this._measureChar();\r\n\r\n // Change row size\r\n const rowPixels = this.fontSize + 6;\r\n r.style.setProperty( '--code-editor-row-height', `${rowPixels}px` );\r\n this.lineHeight = rowPixels;\r\n\r\n if ( updateDOM )\r\n {\r\n this._rebuildLines();\r\n this._afterCursorMove();\r\n }\r\n\r\n // Emit event\r\n LX.emitSignal( '@font-size', this.fontSize );\r\n }\r\n\r\n private _applyFontSizeOffset( offset = 0 )\r\n {\r\n const newFontSize = LX.clamp( this.fontSize + offset, CodeEditor.CODE_MIN_FONT_SIZE, CodeEditor.CODE_MAX_FONT_SIZE );\r\n this._setFontSize( newFontSize );\r\n }\r\n\r\n private _increaseFontSize()\r\n {\r\n this._applyFontSizeOffset( 1 );\r\n }\r\n\r\n private _decreaseFontSize()\r\n {\r\n this._applyFontSizeOffset( -1 );\r\n }\r\n}\r\n\r\n( LX as any ).CodeEditor = CodeEditor;"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"CodeEditor.js","sources":["../../src/extensions/CodeEditor.ts"],"sourcesContent":["// CodeEditor.ts @jxarco\r\n\r\nimport { LX } from '../core/Namespace';\r\n\r\nif ( !LX )\r\n{\r\n throw ( 'Missing LX namespace!' );\r\n}\r\n\r\nLX.extensions.push( 'CodeEditor' );\r\n\r\n// _____ \r\n// |_ _|_ _ ___ ___ ___ \r\n// | | | | | . | -_|_ -|\r\n// |_| |_ | _|___|___|\r\n// |___|_|\r\n\r\ninterface Token\r\n{\r\n type: string; // 'keyword', 'string', 'comment', 'number', 'method', 'type', 'symbol', 'builtin', 'statement', 'preprocessor', 'text'\r\n value: string;\r\n}\r\n\r\ninterface TokenRule\r\n{\r\n match: RegExp;\r\n type: string;\r\n next?: string; // push this state\r\n pop?: boolean | number; // pop back to previous state (true = 1, or specify number of pops)\r\n}\r\n\r\ninterface LanguageDef\r\n{\r\n name: string;\r\n extensions: string[];\r\n states: Record<string, TokenRule[]>;\r\n lineComment?: string;\r\n icon?: string | Record<string, string>;\r\n reservedWords: string[];\r\n}\r\n\r\ninterface TokenizerState\r\n{\r\n stack: string[]; // state stack, e.g. ['root'] or ['root', 'blockComment']\r\n}\r\n\r\ninterface TokenizeResult\r\n{\r\n tokens: Token[];\r\n state: TokenizerState;\r\n}\r\n\r\n// _____ _ _ _ _ _ _ \r\n// | | | |_|_| |_| |_|_|___ ___ \r\n// | | | _| | | | _| | -_|_ -|\r\n// |_____|_| |_|_|_|_| |_|___|___|\r\n\r\nfunction firstNonspaceIndex( str: string ): number\r\n{\r\n const index = str.search( /\\S|$/ );\r\n return index < str.length ? index : -1;\r\n}\r\n\r\nfunction isSymbol( str: string ): boolean\r\n{\r\n return /[^\\w\\s]/.test( str );\r\n}\r\n\r\nfunction isWord( str: string ): boolean\r\n{\r\n return /\\w/.test( str );\r\n}\r\n\r\nfunction getLanguageIcon( langDef: LanguageDef | undefined, extension?: string ): string\r\n{\r\n if ( !langDef?.icon )\r\n {\r\n return 'FileCode text-neutral-500'; // default icon\r\n }\r\n\r\n if ( typeof langDef.icon === 'string' )\r\n {\r\n return langDef.icon;\r\n }\r\n\r\n if ( extension && langDef.icon[ extension ] )\r\n {\r\n return langDef.icon[ extension ];\r\n }\r\n\r\n const firstIcon = Object.values( langDef.icon )[0];\r\n return firstIcon || 'FileCode text-neutral-500';\r\n}\r\n\r\n// _____ _ _ \r\n// |_ _|___| |_ ___ ___|_|___ ___ ___ \r\n// | | | . | '_| -_| | |- _| -_| _|\r\n// |_| |___|_,_|___|_|_|_|___|___|_|\r\n\r\nexport class Tokenizer\r\n{\r\n private static languages: Map<string, LanguageDef> = new Map();\r\n private static extensionMap: Map<string, string> = new Map(); // ext -> language name\r\n\r\n static registerLanguage( def: LanguageDef ): void\r\n {\r\n Tokenizer.languages.set( def.name, def );\r\n for ( const ext of def.extensions )\r\n {\r\n Tokenizer.extensionMap.set( ext, def.name );\r\n }\r\n }\r\n\r\n static getLanguage( name: string ): LanguageDef | undefined\r\n {\r\n return Tokenizer.languages.get( name );\r\n }\r\n\r\n static getLanguageByExtension( ext: string ): LanguageDef | undefined\r\n {\r\n const name = Tokenizer.extensionMap.get( ext );\r\n return name ? Tokenizer.languages.get( name ) : undefined;\r\n }\r\n\r\n static getRegisteredLanguages(): string[]\r\n {\r\n return Array.from( Tokenizer.languages.keys() );\r\n }\r\n\r\n static initialState(): TokenizerState\r\n {\r\n return { stack: [ 'root' ] };\r\n }\r\n\r\n /**\r\n * Tokenize a single line given a language and the state from the previous line.\r\n * Returns the tokens and the updated state for the next line.\r\n */\r\n static tokenizeLine( line: string, language: LanguageDef, state: TokenizerState ): TokenizeResult\r\n {\r\n const tokens: Token[] = [];\r\n const stack = [ ...state.stack ]; // clone\r\n\r\n let pos = 0;\r\n\r\n while ( pos < line.length )\r\n {\r\n const currentState = stack[ stack.length - 1 ];\r\n const rules = language.states[ currentState ];\r\n\r\n if ( !rules )\r\n {\r\n // No rules for this state, so emit rest as text\r\n tokens.push( { type: 'text', value: line.slice( pos ) } );\r\n pos = line.length;\r\n break;\r\n }\r\n\r\n let matched = false;\r\n\r\n for ( const rule of rules )\r\n {\r\n // Anchor regex at current position\r\n const regex = new RegExp( rule.match.source, 'y' + ( rule.match.flags.replace( /[gy]/g, '' ) ) );\r\n regex.lastIndex = pos;\r\n const m = regex.exec( line );\r\n\r\n if ( m )\r\n {\r\n if ( m[0].length === 0 )\r\n {\r\n // Zero-length match, skipping to avoid infinite loop...\r\n continue;\r\n }\r\n\r\n tokens.push( { type: rule.type, value: m[0] } );\r\n pos += m[0].length;\r\n\r\n // State transitions\r\n if ( rule.next )\r\n {\r\n stack.push( rule.next );\r\n }\r\n else if ( rule.pop )\r\n {\r\n const popCount = typeof rule.pop === 'number' ? rule.pop : 1;\r\n for ( let i = 0; i < popCount && stack.length > 1; i++ )\r\n {\r\n stack.pop();\r\n }\r\n }\r\n\r\n matched = true;\r\n break;\r\n }\r\n }\r\n\r\n if ( !matched )\r\n {\r\n // No rule matched, consume one character as text either merged or as a new token\r\n const lastToken = tokens[ tokens.length - 1 ];\r\n if ( lastToken && lastToken.type === 'text' )\r\n {\r\n lastToken.value += line[ pos ];\r\n }\r\n else\r\n {\r\n tokens.push( { type: 'text', value: line[ pos ] } );\r\n }\r\n pos++;\r\n }\r\n }\r\n\r\n const merged = Tokenizer._mergeTokens( tokens );\r\n\r\n return { tokens: merged, state: { stack } };\r\n }\r\n\r\n /**\r\n * Merge consecutive tokens with the same type into one.\r\n */\r\n private static _mergeTokens( tokens: Token[] ): Token[]\r\n {\r\n if ( tokens.length === 0 ) return tokens;\r\n\r\n const result: Token[] = [ tokens[0] ];\r\n\r\n for ( let i = 1; i < tokens.length; i++ )\r\n {\r\n const prev = result[ result.length - 1 ];\r\n if ( tokens[i].type === prev.type )\r\n {\r\n prev.value += tokens[i].value;\r\n }\r\n else\r\n {\r\n result.push( tokens[i] );\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n}\r\n\r\nLX.Tokenizer = Tokenizer;\r\n\r\n// __ _____ _ \r\n// | | ___ ___ ___ _ _ ___ ___ ___ | | |___| |___ ___ ___ ___ \r\n// | |__| .'| | . | | | .'| . | -_| | | -_| | . | -_| _|_ -|\r\n// |_____|__,|_|_|_ |___|__,|_ |___| |__|__|___|_| _|___|_| |___|\r\n// |___| |___| |_|\r\n\r\n/**\r\n * Build a word-boundary regex from a list of words to use as a language rule \"match\".\r\n * e.g. words(['const', 'let', 'var']) → /\\b(?:const|let|var)\\b/\r\n */\r\nfunction words( list: string[] ): RegExp\r\n{\r\n return new RegExp( '\\\\b(?:' + list.join( '|' ) + ')\\\\b' );\r\n}\r\n\r\n/**\r\n * Common state rules reusable across C-like languages.\r\n */\r\nconst CommonStates: Record<string, TokenRule[]> = {\r\n blockComment: [\r\n { match: /\\*\\//, type: 'comment', pop: true },\r\n { match: /[^*]+/, type: 'comment' },\r\n { match: /\\*/, type: 'comment' },\r\n ],\r\n doubleString: [\r\n { match: /\\\\./, type: 'string' },\r\n { match: /\"/, type: 'string', pop: true },\r\n { match: /[^\"\\\\]+/, type: 'string' },\r\n ],\r\n singleString: [\r\n { match: /\\\\./, type: 'string' },\r\n { match: /'/, type: 'string', pop: true },\r\n { match: /[^'\\\\]+/, type: 'string' },\r\n ],\r\n};\r\n\r\n/** Common number rules for C-like languages. */\r\nconst NumberRules: TokenRule[] = [\r\n // Binary: 0b1010, 0B1010\r\n { match: /0[bB][01]+(?:[uU][lL]{0,2}|[lL]{1,2}[uU]?)?\\b/, type: 'number' },\r\n // Hex: 0xFF, 0xDEADBEEF, 0xFFu, 0xFFul, 0xFFull\r\n { match: /0[xX][0-9a-fA-F]+(?:[uU][lL]{0,2}|[lL]{1,2}[uU]?)?\\b/, type: 'number' },\r\n // Octal: 0o77, 0O77\r\n { match: /0[oO][0-7]+(?:[uU][lL]{0,2}|[lL]{1,2}[uU]?)?\\b/, type: 'number' },\r\n // Decimal with optional suffix: 123, 123.456, 1.23e10, 0.5f, 16u, 100L, 42ul, 3.14d, 100m\r\n { match: /\\d+\\.?\\d*(?:[eE][+-]?\\d+)?(?:[fFdDmMlLuUiI]|[uU][lL]{0,2}|[lL]{1,2}[uU]?)?\\b/, type: 'number' },\r\n // Decimal starting with dot: .123, .5f\r\n { match: /\\.\\d+(?:[eE][+-]?\\d+)?(?:[fFdDmM])?\\b/, type: 'number' },\r\n];\r\n\r\n/** Common tail rules: method detection, identifiers, symbols, whitespace. */\r\nconst TailRules: TokenRule[] = [\r\n { match: /[a-zA-Z_$]\\w*(?=\\s*[<(])/, type: 'method' }, // function/method names (followed by < or ()\r\n { match: /[a-zA-Z_$]\\w*/, type: 'text' },\r\n { match: /[{}()\\[\\];,.:?!&|<>=+\\-*/%^~@#]/, type: 'symbol' },\r\n { match: /\\s+/, type: 'text' },\r\n];\r\n\r\n/** Template string states for JS/TS. */\r\nfunction templateStringStates( exprKeywords: string[] ): Record<string, TokenRule[]>\r\n{\r\n return {\r\n templateString: [\r\n { match: /\\\\./, type: 'string' },\r\n { match: /`/, type: 'string', pop: true },\r\n { match: /\\$\\{/, type: 'symbol', next: 'templateExpr' },\r\n { match: /[^`\\\\$]+/, type: 'string' },\r\n { match: /\\$/, type: 'string' },\r\n ],\r\n templateExpr: [\r\n { match: /\\}/, type: 'symbol', pop: true },\r\n { match: /\\/\\*/, type: 'comment', next: 'blockComment' },\r\n { match: /\\/\\/.*/, type: 'comment' },\r\n { match: /\"/, type: 'string', next: 'doubleString' },\r\n { match: /'/, type: 'string', next: 'singleString' },\r\n { match: /`/, type: 'string', next: 'templateString' },\r\n ...NumberRules,\r\n { match: words( exprKeywords ), type: 'keyword' },\r\n ...TailRules,\r\n ],\r\n };\r\n}\r\n\r\n// __ ____ ___ _ _ _ _ \r\n// | | ___ ___ ___ _ _ ___ ___ ___ | \\ ___| _|_|___|_| |_|_|___ ___ ___ \r\n// | |__| .'| | . | | | .'| . | -_| | | | -_| _| | | | _| | . | |_ -|\r\n// |_____|__,|_|_|_ |___|__,|_ |___| |____/|___|_| |_|_|_|_|_| |_|___|_|_|___|\r\n// |___| |___|\r\n\r\nTokenizer.registerLanguage( {\r\n name: 'Plain Text',\r\n extensions: [ 'txt' ],\r\n states: {\r\n root: [\r\n { match: /.+/, type: 'text' }\r\n ]\r\n },\r\n reservedWords: [],\r\n icon: 'FileText text-neutral-500'\r\n} );\r\n\r\n// JavaScript\r\n\r\nconst jsKeywords = [\r\n 'var', 'let', 'const', 'this', 'in', 'of', 'true', 'false', 'null', 'undefined',\r\n 'new', 'function', 'class', 'extends', 'super', 'import', 'export', 'from',\r\n 'default', 'async', 'typeof', 'instanceof', 'void', 'delete', 'debugger', 'NaN',\r\n 'static', 'constructor', 'Infinity', 'abstract'\r\n];\r\n\r\nconst jsStatements = [\r\n 'for', 'if', 'else', 'switch', 'case', 'return', 'while', 'do', 'continue', 'break',\r\n 'await', 'yield', 'throw', 'try', 'catch', 'finally', 'with'\r\n];\r\n\r\nconst jsBuiltins = [\r\n 'document', 'console', 'window', 'navigator', 'performance',\r\n 'Math', 'JSON', 'Promise', 'Array', 'Object', 'String', 'Number', 'Boolean',\r\n 'RegExp', 'Error', 'Map', 'Set', 'WeakMap', 'WeakSet', 'Symbol', 'Proxy', 'Reflect'\r\n];\r\n\r\nTokenizer.registerLanguage( {\r\n name: 'JavaScript',\r\n extensions: [ 'js', 'mjs', 'cjs' ],\r\n lineComment: '//',\r\n states: {\r\n root: [\r\n { match: /\\/\\*/, type: 'comment', next: 'blockComment' },\r\n { match: /\\/\\/.*/, type: 'comment' },\r\n { match: /`/, type: 'string', next: 'templateString' },\r\n { match: /\"/, type: 'string', next: 'doubleString' },\r\n { match: /'/, type: 'string', next: 'singleString' },\r\n ...NumberRules,\r\n { match: words( jsKeywords ), type: 'keyword' },\r\n { match: words( jsBuiltins ), type: 'builtin' },\r\n { match: words( jsStatements ), type: 'statement' },\r\n { match: /(?<=\\b(?:class|enum)\\s+)[A-Z][a-zA-Z0-9_]*/, type: 'type' }, // class/enum names\r\n ...TailRules,\r\n ],\r\n ...CommonStates,\r\n ...templateStringStates( [ 'var', 'let', 'const', 'this', 'true', 'false', 'null', 'undefined', 'new', 'typeof', 'instanceof', 'void' ] ),\r\n },\r\n reservedWords: [ ...jsKeywords, ...jsStatements, ...jsBuiltins ],\r\n icon: 'Js text-yellow-500'\r\n} );\r\n\r\n// TypeScript\r\n\r\nconst tsKeywords = [\r\n ...jsKeywords,\r\n 'as', 'interface', 'type', 'enum', 'namespace', 'declare', 'private', 'protected',\r\n 'implements', 'readonly', 'keyof', 'infer', 'is', 'asserts', 'override', 'satisfies'\r\n];\r\n\r\nconst tsTypes = [\r\n 'string', 'number', 'boolean', 'any', 'unknown', 'never', 'void', 'null',\r\n 'undefined', 'object', 'symbol', 'bigint', 'Promise',\r\n 'Record', 'Partial', 'Required', 'Readonly', 'Pick', 'Omit', 'Exclude',\r\n 'Extract', 'NonNullable', 'ReturnType', 'Parameters', 'ConstructorParameters',\r\n 'InstanceType', 'Awaited'\r\n];\r\n\r\nTokenizer.registerLanguage( {\r\n name: 'TypeScript',\r\n extensions: [ 'ts', 'tsx' ],\r\n lineComment: '//',\r\n states: {\r\n root: [\r\n { match: /\\/\\*/, type: 'comment', next: 'blockComment' },\r\n { match: /\\/\\/.*/, type: 'comment' },\r\n { match: /`/, type: 'string', next: 'templateString' },\r\n { match: /\"/, type: 'string', next: 'doubleString' },\r\n { match: /'/, type: 'string', next: 'singleString' },\r\n ...NumberRules,\r\n { match: words( tsKeywords ), type: 'keyword' },\r\n { match: words( tsTypes ), type: 'type' },\r\n { match: words( jsBuiltins ), type: 'builtin' },\r\n { match: words( jsStatements ), type: 'statement' },\r\n { match: /(?<=\\b(?:class|enum|interface|type|extends|implements)\\s+)[A-Z][a-zA-Z0-9_]*/, type: 'type' }, // class/enum/interface/type names\r\n { match: /(?<=<\\s*)[A-Z][a-zA-Z0-9_]*(?=\\s*(?:[,>]|extends|=))/, type: 'type' }, // type parameters in generics <T>\r\n { match: /(?<=,\\s*)[A-Z][a-zA-Z0-9_]*(?=\\s*(?:[,>]|extends|=))/, type: 'type' }, // type parameters after comma <T, K>\r\n { match: /(?<=:\\s*)[A-Z][a-zA-Z0-9_]*/, type: 'type' }, // type annotations after colon\r\n ...TailRules,\r\n ],\r\n ...CommonStates,\r\n ...templateStringStates( [ 'var', 'let', 'const', 'this', 'true', 'false', 'null', 'undefined', 'new', 'typeof', 'instanceof', 'void' ] ),\r\n },\r\n reservedWords: [ ...tsKeywords, ...tsTypes, ...jsBuiltins, ...jsStatements ],\r\n icon: 'Ts text-blue-600'\r\n} );\r\n\r\n// WGSL (WebGPU Shading Language)\r\n\r\nconst wgslKeywords = [\r\n 'bool', 'i32', 'u32', 'f16', 'f32', 'vec2', 'vec3', 'vec4', 'vec2i', 'vec3i', 'vec4i',\r\n 'vec2u', 'vec3u', 'vec4u', 'vec2f', 'vec3f', 'vec4f', 'mat2x2f', 'mat2x3f', 'mat2x4f', 'mat3x2f', 'mat3x3f',\r\n 'mat3x4f', 'mat4x2f', 'mat4x3f', 'mat4x4f', 'array', 'struct', 'ptr', 'atomic', 'sampler', 'sampler_comparison',\r\n 'texture_1d', 'texture_2d', 'texture_2d_array', 'texture_3d', 'texture_cube', 'texture_cube_array', 'texture_multisampled_2d',\r\n 'texture_depth_2d', 'texture_depth_2d_array', 'texture_depth_cube', 'texture_depth_cube_array',\r\n 'texture_depth_multisampled_2d', 'texture_storage_1d', 'texture_storage_2d', 'texture_storage_2d_array',\r\n 'texture_storage_3d', 'texture_external', 'var', 'let', 'const', 'override', 'fn', 'type', 'alias',\r\n 'true', 'false'\r\n];\r\n\r\nconst wgslStatements = [\r\n 'if', 'else', 'switch', 'case', 'default', 'for', 'loop', 'while', 'break', 'continue', 'discard',\r\n 'return', 'function', 'private', 'workgroup', 'uniform', 'storage', 'read', 'write', 'read_write', 'bitcast'\r\n];\r\n\r\nconst wgslBuiltins = [\r\n 'position', 'vertex_index', 'instance_index', 'front_facing', 'frag_depth',\r\n 'local_invocation_id', 'local_invocation_index', 'global_invocation_id', 'workgroup_id', 'num_workgroups',\r\n 'abs', 'acos', 'acosh', 'asin', 'asinh', 'atan', 'atanh', 'atan2', 'ceil', 'clamp', 'cos', 'cosh',\r\n 'cross', 'degrees', 'determinant', 'distance', 'dot', 'exp', 'exp2', 'floor', 'fma', 'fract', 'inverseSqrt',\r\n 'length', 'log', 'log2', 'max', 'min', 'mix', 'normalize', 'pow', 'radians', 'reflect', 'refract', 'round',\r\n 'saturate', 'sign', 'sin', 'sinh', 'smoothstep', 'sqrt', 'step', 'tan', 'tanh', 'transpose', 'trunc',\r\n 'textureSample', 'textureSampleBias', 'textureSampleLevel', 'textureSampleGrad',\r\n 'textureSampleCompare', 'textureSampleCompareLevel', 'textureSampleBaseClampToEdge',\r\n 'textureLoad', 'textureStore', 'textureGather', 'textureGatherCompare',\r\n 'textureDimensions', 'textureNumLayers', 'textureNumLevels', 'textureNumSamples',\r\n 'pack4x8snorm', 'pack4x8unorm', 'pack2x16snorm', 'pack2x16unorm', 'pack2x16float',\r\n 'unpack4x8snorm', 'unpack4x8unorm', 'unpack2x16snorm', 'unpack2x16unorm', 'unpack2x16float',\r\n 'atomicLoad', 'atomicStore', 'atomicAdd', 'atomicSub', 'atomicMax', 'atomicMin',\r\n 'atomicAnd', 'atomicOr', 'atomicXor', 'atomicExchange', 'atomicCompareExchangeWeak',\r\n 'dpdx', 'dpdxCoarse', 'dpdxFine', 'dpdy', 'dpdyCoarse', 'dpdyFine', 'fwidth', 'fwidthCoarse', 'fwidthFine',\r\n 'select', 'arrayLength', 'countLeadingZeros', 'countOneBits', 'countTrailingZeros',\r\n 'extractBits', 'firstLeadingBit', 'firstTrailingBit', 'insertBits', 'reverseBits',\r\n 'storageBarrier', 'workgroupBarrier', 'workgroupUniformLoad'\r\n];\r\n\r\nTokenizer.registerLanguage( {\r\n name: 'WGSL',\r\n extensions: [ 'wgsl' ],\r\n lineComment: '//',\r\n states: {\r\n root: [\r\n { match: /\\/\\*/, type: 'comment', next: 'blockComment' },\r\n { match: /\\/\\/.*/, type: 'comment' },\r\n { match: /#\\w+/, type: 'preprocessor' },\r\n ...NumberRules,\r\n { match: words( wgslKeywords ), type: 'keyword' },\r\n { match: words( wgslBuiltins ), type: 'builtin' },\r\n { match: words( wgslStatements ), type: 'statement' },\r\n { match: /@\\w+/, type: 'text' },\r\n ...TailRules,\r\n ],\r\n ...CommonStates\r\n },\r\n reservedWords: [ ...wgslKeywords, ...wgslBuiltins, ...wgslStatements ],\r\n icon: 'AlignLeft text-orange-500'\r\n} );\r\n\r\n// GLSL (OpenGL/WebGL Shading Language)\r\n\r\nconst glslKeywords = [\r\n 'true', 'false', 'int', 'float', 'double', 'bool', 'void', 'uint', 'struct', 'mat2', 'mat3',\r\n 'mat4', 'mat2x2', 'mat2x3', 'mat2x4', 'mat3x2', 'mat3x3', 'mat3x4', 'mat4x2', 'mat4x3', 'mat4x4',\r\n 'vec2', 'vec3', 'vec4', 'ivec2', 'ivec3', 'ivec4', 'uvec2', 'uvec3', 'uvec4', 'dvec2', 'dvec3',\r\n 'dvec4', 'bvec2', 'bvec3', 'bvec4', 'sampler1D', 'sampler2D', 'sampler3D', 'samplerCube',\r\n 'sampler2DShadow', 'samplerCubeShadow', 'sampler2DArray', 'sampler2DArrayShadow',\r\n 'samplerCubeArray', 'samplerCubeArrayShadow', 'isampler2D', 'usampler2D', 'isampler3D',\r\n 'usampler3D', 'lowp', 'mediump', 'highp', 'precision', 'in', 'out', 'inout', 'uniform',\r\n 'varying', 'attribute', 'const', 'layout', 'centroid', 'flat', 'smooth', 'noperspective',\r\n 'patch', 'sample', 'buffer', 'shared', 'coherent', 'volatile', 'restrict', 'readonly', 'writeonly'\r\n];\r\n\r\nconst glslStatements = [\r\n 'if', 'else', 'switch', 'case', 'default', 'for', 'while', 'do', 'break', 'continue',\r\n 'return', 'discard'\r\n];\r\n\r\nconst glslBuiltins = [\r\n 'radians', 'degrees', 'sin', 'cos', 'tan', 'asin', 'acos', 'atan', 'pow', 'exp', 'log',\r\n 'exp2', 'log2', 'sqrt', 'inversesqrt', 'abs', 'sign', 'floor', 'ceil', 'fract',\r\n 'mod', 'min', 'max', 'clamp', 'mix', 'step', 'smoothstep', 'length', 'distance',\r\n 'dot', 'cross', 'normalize', 'reflect', 'refract', 'matrixCompMult',\r\n 'lessThan', 'lessThanEqual', 'greaterThan', 'greaterThanEqual',\r\n 'equal', 'notEqual', 'any', 'all', 'not', 'texture', 'textureProj',\r\n 'textureLod', 'textureGrad', 'texelFetch'\r\n];\r\n\r\nTokenizer.registerLanguage( {\r\n name: 'GLSL',\r\n extensions: [ 'glsl' ],\r\n lineComment: '//',\r\n states: {\r\n root: [\r\n { match: /\\/\\*/, type: 'comment', next: 'blockComment' },\r\n { match: /\\/\\/.*/, type: 'comment' },\r\n { match: /#\\w+/, type: 'preprocessor' },\r\n ...NumberRules,\r\n { match: words( glslKeywords ), type: 'keyword' },\r\n { match: words( glslBuiltins ), type: 'builtin' },\r\n { match: words( glslStatements ), type: 'statement' },\r\n ...TailRules,\r\n ],\r\n ...CommonStates\r\n },\r\n reservedWords: [ ...glslKeywords, ...glslBuiltins, ...glslStatements ],\r\n icon: 'AlignLeft text-neutral-500'\r\n} );\r\n\r\n// HLSL (DirectX Shader Language)\r\n\r\nconst hlslKeywords = [\r\n 'bool', 'int', 'uint', 'dword', 'half', 'float', 'double', 'min16float', 'min10float', 'min16int', 'min12int', 'min16uint',\r\n 'float1', 'float2', 'float3', 'float4', 'int1', 'int2', 'int3', 'int4', 'uint1', 'uint2', 'uint3', 'uint4',\r\n 'bool1', 'bool2', 'bool3', 'bool4', 'half1', 'half2', 'half3', 'half4',\r\n 'float1x1', 'float1x2', 'float1x3', 'float1x4', 'float2x1', 'float2x2', 'float2x3', 'float2x4',\r\n 'float3x1', 'float3x2', 'float3x3', 'float3x4', 'float4x1', 'float4x2', 'float4x3', 'float4x4',\r\n 'vector', 'matrix', 'string', 'void', 'struct', 'class', 'interface', 'true', 'false',\r\n 'sampler', 'sampler1D', 'sampler2D', 'sampler3D', 'samplerCUBE', 'sampler_state',\r\n 'Texture1D', 'Texture2D', 'Texture3D', 'TextureCube', 'Texture1DArray', 'Texture2DArray', 'TextureCubeArray',\r\n 'Buffer', 'AppendStructuredBuffer', 'ConsumeStructuredBuffer', 'StructuredBuffer', 'RWStructuredBuffer',\r\n 'ByteAddressBuffer', 'RWByteAddressBuffer', 'RWTexture1D', 'RWTexture2D', 'RWTexture3D', 'RWTexture1DArray', 'RWTexture2DArray',\r\n 'cbuffer', 'tbuffer', 'in', 'out', 'inout', 'uniform', 'extern', 'static', 'volatile', 'precise', 'shared', 'groupshared',\r\n 'linear', 'centroid', 'nointerpolation', 'noperspective', 'sample', 'const', 'row_major', 'column_major'\r\n];\r\n\r\nconst hlslStatements = [\r\n 'if', 'else', 'for', 'while', 'do', 'switch', 'case', 'default', 'break', 'continue', 'discard', 'return',\r\n 'typedef', 'register', 'packoffset'\r\n];\r\n\r\nconst hlslBuiltins = [\r\n 'SV_Position', 'SV_Target', 'SV_Depth', 'SV_VertexID', 'SV_InstanceID', 'SV_PrimitiveID', 'SV_DispatchThreadID',\r\n 'SV_GroupID', 'SV_GroupThreadID', 'SV_GroupIndex', 'SV_Coverage', 'SV_IsFrontFace', 'SV_RenderTargetArrayIndex',\r\n 'POSITION', 'NORMAL', 'TEXCOORD', 'COLOR', 'TANGENT', 'BINORMAL'\r\n];\r\n\r\nTokenizer.registerLanguage( {\r\n name: 'HLSL',\r\n extensions: [ 'hlsl', 'fx', 'fxh', 'vsh', 'psh' ],\r\n lineComment: '//',\r\n states: {\r\n root: [\r\n { match: /\\/\\*/, type: 'comment', next: 'blockComment' },\r\n { match: /\\/\\/.*/, type: 'comment' },\r\n { match: /#\\w+/, type: 'preprocessor' },\r\n ...NumberRules,\r\n { match: words( hlslKeywords ), type: 'keyword' },\r\n { match: words( hlslBuiltins ), type: 'builtin' },\r\n { match: words( hlslStatements ), type: 'statement' },\r\n ...TailRules,\r\n ],\r\n ...CommonStates\r\n },\r\n reservedWords: [ ...hlslKeywords, ...hlslBuiltins, ...hlslStatements ],\r\n icon: 'AlignLeft text-purple-500'\r\n} );\r\n\r\n// Python\r\n\r\nconst pyKeywords = [\r\n 'False', 'def', 'None', 'True', 'in', 'is', 'and', 'lambda', 'nonlocal', 'not', 'or'\r\n];\r\n\r\nconst pyStatements = [\r\n 'if', 'elif', 'else', 'for', 'while', 'try', 'except', 'finally', 'with', 'match', 'case',\r\n 'break', 'continue', 'return', 'raise', 'pass', 'import', 'from', 'as', 'global', 'nonlocal',\r\n 'assert', 'del', 'yield'\r\n];\r\n\r\nconst pyBuiltins = [\r\n 'abs', 'all', 'any', 'ascii', 'bin', 'bool', 'bytearray', 'bytes', 'callable', 'chr', 'classmethod',\r\n 'compile', 'complex', 'delattr', 'dict', 'dir', 'divmod', 'enumerate', 'eval', 'exec', 'filter',\r\n 'float', 'format', 'frozenset', 'getattr', 'globals', 'hasattr', 'hash', 'help', 'hex', 'id',\r\n 'input', 'int', 'isinstance', 'issubclass', 'iter', 'len', 'list', 'locals', 'map', 'max',\r\n 'memoryview', 'min', 'next', 'object', 'oct', 'open', 'ord', 'pow', 'print', 'property',\r\n 'range', 'repr', 'reversed', 'round', 'set', 'setattr', 'slice', 'sorted', 'staticmethod',\r\n 'str', 'sum', 'super', 'tuple', 'type', 'vars', 'zip'\r\n];\r\n\r\nconst pyTypes = [\r\n 'int', 'float', 'complex', 'bool', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset',\r\n 'dict', 'object', 'type', 'ArithmeticError', 'AssertionError', 'AttributeError', 'BaseException',\r\n 'BufferError', 'EOFError', 'Exception', 'FloatingPointError', 'GeneratorExit', 'ImportError',\r\n 'ModuleNotFoundError', 'IndentationError', 'IndexError', 'KeyError', 'KeyboardInterrupt',\r\n 'LookupError', 'MemoryError', 'NameError', 'NotImplementedError', 'OSError', 'OverflowError',\r\n 'RecursionError', 'ReferenceError', 'RuntimeError', 'StopAsyncIteration', 'StopIteration',\r\n 'SyntaxError', 'TabError', 'SystemError', 'SystemExit', 'TypeError', 'UnboundLocalError',\r\n 'UnicodeError', 'UnicodeEncodeError', 'UnicodeDecodeError', 'UnicodeTranslateError',\r\n 'ValueError', 'ZeroDivisionError'\r\n];\r\n\r\nTokenizer.registerLanguage( {\r\n name: 'Python',\r\n extensions: [ 'py' ],\r\n lineComment: '#',\r\n states: {\r\n root: [\r\n { match: /\\/\\*/, type: 'comment', next: 'blockComment' },\r\n { match: /#.*/, type: 'comment' },\r\n { match: /\"/, type: 'string', next: 'doubleString' },\r\n { match: /'/, type: 'string', next: 'singleString' },\r\n ...NumberRules,\r\n { match: words( pyKeywords ), type: 'keyword' },\r\n { match: words( pyTypes ), type: 'type' },\r\n { match: words( pyBuiltins ), type: 'builtin' },\r\n { match: words( pyStatements ), type: 'statement' },\r\n ...TailRules,\r\n ],\r\n ...CommonStates\r\n },\r\n reservedWords: [ ...pyKeywords, ...pyTypes, ...pyBuiltins, ...pyStatements ],\r\n icon: 'Python text-cyan-600'\r\n} );\r\n\r\n// PHP\r\n\r\nconst phpKeywords = [\r\n 'abstract', 'and', 'array', 'as', 'callable', 'class', 'clone', 'const',\r\n 'enum', 'extends', 'final', 'fn', 'function', 'global',\r\n 'implements', 'include', 'include_once', 'instanceof',\r\n 'insteadof', 'interface', 'namespace', 'new', 'null', 'or',\r\n 'private', 'protected', 'public', 'readonly', 'require',\r\n 'require_once', 'static', 'trait', 'use', 'var', 'xor',\r\n 'from', '$this'\r\n];\r\n\r\nconst phpStatements = [\r\n 'if', 'else', 'elseif', 'endif', 'switch', 'case', 'default', 'endswitch',\r\n 'for', 'endfor', 'foreach', 'endforeach', 'while', 'endwhile', 'do',\r\n 'break', 'continue', 'return', 'try', 'catch', 'finally', 'throw',\r\n 'declare', 'enddeclare', 'goto', 'yield', 'match'\r\n];\r\n\r\nconst phpTypes = [\r\n 'int', 'float', 'string', 'bool', 'array', 'object', 'callable', 'iterable',\r\n 'void', 'never', 'mixed', 'static', 'self', 'parent',\r\n 'Exception', 'Error', 'Throwable', 'DateTime', 'DateTimeImmutable',\r\n 'Closure', 'Generator', 'JsonSerializable'\r\n];\r\n\r\nconst phpBuiltins = [\r\n 'echo', 'print', 'isset', 'empty', 'unset', 'eval', 'die', 'exit',\r\n 'count', 'sizeof', 'in_array', 'array_merge', 'array_push', 'array_pop',\r\n 'strlen', 'strpos', 'substr', 'str_replace', 'explode', 'implode',\r\n 'json_encode', 'json_decode', 'var_dump', 'print_r'\r\n];\r\n\r\n\r\nTokenizer.registerLanguage( {\r\n name: 'PHP',\r\n extensions: [ 'php' ],\r\n lineComment: '//',\r\n states: {\r\n root: [\r\n { match: /\\/\\*/, type: 'comment', next: 'blockComment' },\r\n { match: /\\/\\/.*/, type: 'comment' },\r\n { match: /\"/, type: 'string', next: 'doubleString' },\r\n { match: /'/, type: 'string', next: 'singleString' },\r\n ...NumberRules,\r\n { match: words( phpKeywords ), type: 'keyword' },\r\n { match: words( phpTypes ), type: 'type' },\r\n { match: words( phpBuiltins ), type: 'builtin' },\r\n { match: words( phpStatements ), type: 'statement' },\r\n ...TailRules,\r\n ],\r\n ...CommonStates\r\n },\r\n reservedWords: [ ...phpKeywords, ...phpTypes, ...phpBuiltins, ...phpStatements ],\r\n icon: 'Php text-purple-700'\r\n} );\r\n\r\n// C\r\n\r\nconst cKeywords = [\r\n 'int', 'float', 'double', 'bool', 'long', 'short', 'char', 'void', 'const', 'enum', 'extern', 'register', 'sizeof', 'static',\r\n 'struct', 'typedef', 'union', 'volatile', 'true', 'false'\r\n];\r\n\r\nconst cStatements = [\r\n 'break', 'continue', 'do', 'else', 'for', 'goto', 'if', 'return', 'switch', 'while'\r\n];\r\n\r\nTokenizer.registerLanguage({\r\n name: 'C',\r\n extensions: [ 'c', 'h' ],\r\n lineComment: '//',\r\n states: {\r\n root: [\r\n { match: /\\/\\*/, type: 'comment', next: 'blockComment' },\r\n { match: /\\/\\/.*/, type: 'comment' },\r\n { match: /#\\w+/, type: 'preprocessor' },\r\n { match: /\"/, type: 'string', next: 'doubleString' },\r\n { match: /'/, type: 'string', next: 'singleString' },\r\n ...NumberRules,\r\n { match: words( cKeywords ), type: 'keyword' },\r\n { match: words( cStatements ), type: 'statement' },\r\n ...TailRules,\r\n ],\r\n ...CommonStates\r\n },\r\n reservedWords: [ ...cKeywords, ...cStatements ],\r\n icon: { 'c': 'C text-sky-400', 'h': 'C text-fuchsia-500' }\r\n});\r\n\r\n// C++\r\n\r\nconst cppKeywords = [\r\n ...cKeywords, 'wchar_t', 'static_cast', 'dynamic_cast', 'new', 'delete', 'auto', 'class', 'nullptr', 'NULL', 'signed',\r\n 'unsigned', 'namespace', 'static', 'private', 'public'\r\n];\r\n\r\nconst cppStatements = [\r\n ...cStatements, 'case', 'using', 'glm', 'spdlog', 'default'\r\n];\r\n\r\nconst cppTypes = [\r\n 'uint8_t', 'uint16_t', 'uint32_t', 'uint64_t', 'int8_t', 'int16_t', 'int32_t', 'int64_t', 'size_t', 'ptrdiff_t'\r\n];\r\n\r\nconst cppBuiltins = [\r\n 'std', 'string', 'vector', 'map', 'set', 'unordered_map', 'unordered_set', 'array', 'tuple', 'optional', 'variant',\r\n 'cout', 'cin', 'cerr', 'clog'\r\n];\r\n\r\nTokenizer.registerLanguage({\r\n name: 'C++',\r\n extensions: [ 'cpp', 'hpp' ],\r\n lineComment: '//',\r\n states: {\r\n root: [\r\n { match: /\\/\\*/, type: 'comment', next: 'blockComment' },\r\n { match: /\\/\\/.*/, type: 'comment' },\r\n { match: /#\\w+/, type: 'preprocessor' },\r\n { match: /\"/, type: 'string', next: 'doubleString' },\r\n { match: /'/, type: 'string', next: 'singleString' },\r\n ...NumberRules,\r\n { match: words( cppKeywords ), type: 'keyword' },\r\n { match: words( cppTypes ), type: 'type' },\r\n { match: words( cppBuiltins ), type: 'builtin' },\r\n { match: words( cppStatements ), type: 'statement' },\r\n ...TailRules,\r\n ],\r\n ...CommonStates\r\n },\r\n reservedWords: [ ...cppKeywords, ...cppTypes, ...cppBuiltins, ...cppStatements ],\r\n icon: { 'cpp': 'CPlusPlus text-sky-400', 'hpp': 'CPlusPlus text-fuchsia-500' }\r\n});\r\n\r\n// JSON\r\n\r\nTokenizer.registerLanguage({\r\n name: 'JSON',\r\n extensions: [ 'json', 'jsonc', 'bml' ],\r\n states: {\r\n root: [\r\n { match: /\"/, type: 'string', next: 'doubleString' },\r\n { match: /\\btrue\\b|\\bfalse\\b|\\bnull\\b/, type: 'keyword' },\r\n { match: /-?\\d+\\.?\\d*(?:[eE][+-]?\\d+)?/, type: 'number' },\r\n { match: /[{}[\\]:,]/, type: 'symbol' },\r\n { match: /\\s+/, type: 'text' },\r\n ],\r\n ...CommonStates\r\n },\r\n reservedWords: [],\r\n icon: 'Json text-yellow-600'\r\n});\r\n\r\n// XML\r\n\r\nTokenizer.registerLanguage({\r\n name: 'XML',\r\n extensions: [ 'xml', 'xaml', 'xsd', 'xsl' ],\r\n lineComment: '<!--',\r\n states: {\r\n root: [\r\n { match: /<!--/, type: 'comment', next: 'xmlComment' },\r\n { match: /<\\?/, type: 'preprocessor', next: 'processingInstruction' },\r\n { match: /<\\/[a-zA-Z][\\w:-]*>/, type: 'keyword' },\r\n { match: /<[a-zA-Z][\\w:-]*/, type: 'keyword', next: 'tag' },\r\n { match: /[^<]+/, type: 'text' },\r\n ],\r\n tag: [\r\n { match: /\\/?>/, type: 'keyword', pop: true },\r\n { match: /[a-zA-Z][\\w:-]*(?==)/, type: 'type' },\r\n { match: /\"/, type: 'string', next: 'doubleString' },\r\n { match: /'/, type: 'string', next: 'singleString' },\r\n { match: /[^\"'>/]+/, type: 'text' },\r\n ],\r\n xmlComment: [\r\n { match: /-->/, type: 'comment', pop: true },\r\n { match: /[^-]+/, type: 'comment' },\r\n { match: /-/, type: 'comment' },\r\n ],\r\n processingInstruction: [\r\n { match: /\\?>/, type: 'preprocessor', pop: true },\r\n { match: /[^?]+/, type: 'preprocessor' },\r\n { match: /\\?/, type: 'preprocessor' },\r\n ],\r\n ...CommonStates\r\n },\r\n reservedWords: [],\r\n icon: 'Rss text-orange-600'\r\n});\r\n\r\n// HTML\r\n\r\nconst htmlTags = [\r\n 'html', 'head', 'body', 'title', 'meta', 'link', 'script', 'style',\r\n 'div', 'span', 'p', 'a', 'img', 'ul', 'ol', 'li', 'table', 'tr', 'td', 'th',\r\n 'form', 'input', 'button', 'select', 'option', 'textarea', 'label',\r\n 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'header', 'footer', 'nav', 'section', 'article',\r\n 'aside', 'main', 'figure', 'figcaption', 'video', 'audio', 'source', 'canvas', 'svg'\r\n];\r\n\r\nTokenizer.registerLanguage({\r\n name: 'HTML',\r\n extensions: [ 'html' ],\r\n lineComment: '<!--',\r\n states: {\r\n root: [\r\n { match: /<!--/, type: 'comment', next: 'xmlComment' },\r\n { match: /<!DOCTYPE/i, type: 'preprocessor' },\r\n { match: /<\\/[a-zA-Z][\\w-]*>/, type: 'keyword' },\r\n { match: /<script\\b/i, type: 'keyword', next: 'scriptTag' },\r\n { match: /<style\\b/i, type: 'keyword', next: 'styleTag' },\r\n { match: /<[a-zA-Z][\\w-]*/, type: 'keyword', next: 'tag' },\r\n { match: /[^<]+/, type: 'text' },\r\n ],\r\n tag: [\r\n { match: /\\/?>/, type: 'keyword', pop: true },\r\n { match: /[a-zA-Z][\\w-]*(?==)/, type: 'type' },\r\n { match: /\"/, type: 'string', next: 'doubleString' },\r\n { match: /'/, type: 'string', next: 'singleString' },\r\n { match: /[^\"'>/]+/, type: 'text' },\r\n ],\r\n scriptTag: [\r\n { match: /\\/>/, type: 'keyword', pop: true },\r\n { match: />/, type: 'keyword', next: 'scriptContent' },\r\n { match: /[a-zA-Z][\\w-]*(?==)/, type: 'type' },\r\n { match: /\"/, type: 'string', next: 'doubleString' },\r\n { match: /'/, type: 'string', next: 'singleString' },\r\n { match: /[^\"'>/]+/, type: 'text' },\r\n ],\r\n scriptContent: [\r\n { match: /<\\/script>/i, type: 'keyword', pop: 2 },\r\n { match: /[^<]+/, type: 'text' },\r\n { match: /</, type: 'text' },\r\n ],\r\n styleTag: [\r\n { match: /\\/>/, type: 'keyword', pop: true },\r\n { match: />/, type: 'keyword', next: 'styleContent' },\r\n { match: /[a-zA-Z][\\w-]*(?==)/, type: 'type' },\r\n { match: /\"/, type: 'string', next: 'doubleString' },\r\n { match: /'/, type: 'string', next: 'singleString' },\r\n { match: /[^\"'>/]+/, type: 'text' },\r\n ],\r\n styleContent: [\r\n { match: /<\\/style>/i, type: 'keyword', pop: 2 },\r\n { match: /[^<]+/, type: 'text' },\r\n { match: /</, type: 'text' },\r\n ],\r\n xmlComment: [\r\n { match: /-->/, type: 'comment', pop: true },\r\n { match: /[^-]+/, type: 'comment' },\r\n { match: /-/, type: 'comment' },\r\n ],\r\n ...CommonStates\r\n },\r\n reservedWords: [ ...htmlTags ],\r\n icon: 'Code text-orange-500'\r\n});\r\n\r\n// CSS\r\n\r\nconst cssProperties = [\r\n 'color', 'background', 'border', 'margin', 'padding', 'font', 'display', 'position',\r\n 'width', 'height', 'top', 'left', 'right', 'bottom', 'flex', 'grid', 'z-index',\r\n 'opacity', 'transform', 'transition', 'animation', 'content', 'visibility'\r\n];\r\n\r\nconst cssPropertyValues = [\r\n 'inherit', 'initial', 'unset', 'revert', 'revert-layer', 'auto', 'none', 'hidden', 'visible', 'collapse',\r\n 'block', 'inline', 'inline-block', 'flex', 'inline-flex', 'grid', 'inline-grid', 'contents', 'list-item',\r\n 'static', 'relative', 'absolute', 'fixed', 'sticky', 'solid', 'dashed', 'dotted', 'double', 'groove', 'ridge',\r\n 'inset', 'outset', 'bold', 'bolder', 'lighter', 'normal', 'italic', 'oblique', 'uppercase', 'lowercase', 'capitalize',\r\n 'left', 'right', 'center', 'top', 'bottom', 'start', 'end', 'stretch', 'space-between', 'space-around', 'space-evenly',\r\n 'repeat', 'no-repeat', 'repeat-x', 'repeat-y', 'cover', 'contain', 'pointer', 'default', 'move', 'text', 'not-allowed',\r\n 'transparent', 'currentColor'\r\n];\r\n\r\nconst cssPseudos = [\r\n 'hover', 'active', 'focus', 'visited', 'link', 'before', 'after', 'first-child',\r\n 'last-child', 'nth-child', 'not', 'root', 'disabled', 'checked'\r\n];\r\n\r\nTokenizer.registerLanguage({\r\n name: 'CSS',\r\n extensions: [ 'css', 'scss', 'sass', 'less' ],\r\n lineComment: '//',\r\n states: {\r\n root: [\r\n { match: /\\/\\*/, type: 'comment', next: 'blockComment' },\r\n { match: /\\/\\/.*/, type: 'comment' }, // SCSS/Less\r\n { match: /@[\\w-]+/, type: 'statement' }, // @media, @import, @keyframes, etc.\r\n { match: /#[\\w-]+/, type: 'keyword' }, // ID selectors\r\n { match: /\\.[\\w-]+/, type: 'keyword' }, // class selectors\r\n { match: /::?[\\w-]+(?:\\([^)]*\\))?/, type: 'keyword' }, // pseudo-classes/elements\r\n { match: /\\[[\\w-]+(?:[~|^$*]?=(?:\"[^\"]*\"|'[^']*'|[\\w-]+))?\\]/, type: 'type' }, // attribute selectors\r\n { match: /{/, type: 'symbol', next: 'properties' },\r\n { match: /}/, type: 'symbol' },\r\n { match: /[,>+~*]/, type: 'symbol' }, // combinators\r\n { match: /[\\w-]+/, type: 'keyword' }, // element selectors\r\n { match: /\\s+/, type: 'text' },\r\n ],\r\n properties: [\r\n { match: /\\/\\*/, type: 'comment', next: 'blockComment' },\r\n { match: /\\/\\/.*/, type: 'comment' }, // SCSS/Less\r\n { match: /}/, type: 'symbol', pop: true },\r\n { match: /[\\w-]+(?=\\s*:)/, type: 'type' }, // property names\r\n { match: /:/, type: 'symbol' },\r\n { match: words( cssPropertyValues ), type: 'string' },\r\n { match: /;/, type: 'symbol' },\r\n { match: /\"/, type: 'string', next: 'doubleString' },\r\n { match: /'/, type: 'string', next: 'singleString' },\r\n { match: /#[a-fA-F0-9]{3,8}\\b/, type: 'string' }, // hex colors\r\n { match: /-?\\d+\\.?\\d*(?:px|em|rem|%|vh|vw|vmin|vmax|pt|cm|mm|in|pc|ex|ch|fr|deg|rad|grad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?/, type: 'number' },\r\n { match: /!important\\b/, type: 'builtin' },\r\n { match: /[\\w-]+\\(/, type: 'method' }, // functions: rgb(), calc(), var(), url()\r\n { match: /--[\\w-]+/, type: 'type' }, // vars --\r\n { match: /[(),]/, type: 'symbol' },\r\n { match: /{/, type: 'symbol', next: 'properties' }, // nested rules (SCSS/Less)\r\n { match: /[\\w-]+/, type: 'text' },\r\n { match: /\\s+/, type: 'text' },\r\n ],\r\n ...CommonStates\r\n },\r\n reservedWords: [ ...cssProperties, ...cssPropertyValues, ...cssPseudos ],\r\n icon: 'Hash text-blue-500'\r\n});\r\n\r\n// Markdown\r\n\r\nTokenizer.registerLanguage({\r\n name: 'Markdown',\r\n extensions: [ 'md', 'markdown' ],\r\n states: {\r\n root: [\r\n { match: /^#{1,6}\\s+.+/, type: 'keyword' },\r\n { match: /^\\*\\*\\*.+$/, type: 'symbol' },\r\n { match: /\\*\\*[^*]+\\*\\*/, type: 'keyword' },\r\n { match: /\\*[^*]+\\*/, type: 'type' },\r\n { match: /__[^_]+__/, type: 'keyword' },\r\n { match: /_[^_]+_/, type: 'type' },\r\n { match: /`[^`]+`/, type: 'string' },\r\n { match: /```/, type: 'comment', next: 'codeBlock' },\r\n { match: /^\\s*[-*+]\\s+/, type: 'symbol' },\r\n { match: /^\\s*\\d+\\.\\s+/, type: 'symbol' },\r\n { match: /\\[([^\\]]+)\\]\\(([^)]+)\\)/, type: 'builtin' },\r\n { match: /^>\\s+/, type: 'comment' },\r\n { match: /.+/, type: 'text' },\r\n ],\r\n codeBlock: [\r\n { match: /```/, type: 'comment', pop: true },\r\n { match: /.+/, type: 'string' },\r\n ]\r\n },\r\n reservedWords: [],\r\n icon: 'Markdown text-red-500'\r\n});\r\n\r\n// Batch\r\n\r\nconst batchKeywords = [\r\n 'if', 'else', 'for', 'in', 'do', 'goto', 'call', 'exit', 'setlocal', 'endlocal',\r\n 'set', 'echo', 'rem', 'pause', 'cd', 'pushd', 'popd', 'shift', 'start'\r\n];\r\n\r\nconst batchBuiltins = [\r\n 'dir', 'copy', 'move', 'del', 'ren', 'md', 'rd', 'type', 'find', 'findstr',\r\n 'tasklist', 'taskkill', 'ping', 'ipconfig', 'netstat', 'cls', 'title', 'color'\r\n];\r\n\r\nTokenizer.registerLanguage({\r\n name: 'Batch',\r\n extensions: [ 'bat', 'cmd' ],\r\n lineComment: 'rem',\r\n states: {\r\n root: [\r\n { match: /^rem\\s+.*/i, type: 'comment' },\r\n { match: /^::.*/, type: 'comment' },\r\n { match: /\"/, type: 'string', next: 'doubleString' },\r\n { match: /%[\\w]+%/, type: 'type' },\r\n { match: /\\b\\d+\\b/, type: 'number' },\r\n { match: words( [ ...batchKeywords, ...batchKeywords.map( w => w.toUpperCase() ) ] ), type: 'keyword' },\r\n { match: words( batchBuiltins ), type: 'builtin' },\r\n { match: /@echo/, type: 'statement' },\r\n { match: /[a-zA-Z_]\\w*/, type: 'text' },\r\n { match: /[<>|&()@]/, type: 'symbol' },\r\n { match: /\\s+/, type: 'text' },\r\n ],\r\n ...CommonStates\r\n },\r\n reservedWords: [ ...batchKeywords, ...batchBuiltins ],\r\n icon: 'Terminal text-gray-300'\r\n});\r\n\r\n// CMake\r\n\r\nconst cmakeCommands = [\r\n 'project', 'cmake_minimum_required', 'add_executable', 'add_library', 'target_link_libraries',\r\n 'target_include_directories', 'set', 'option', 'if', 'else', 'elseif', 'endif', 'foreach',\r\n 'endforeach', 'while', 'endwhile', 'function', 'endfunction', 'macro', 'endmacro',\r\n 'find_package', 'include', 'message', 'install', 'add_subdirectory', 'configure_file'\r\n];\r\n\r\nTokenizer.registerLanguage({\r\n name: 'CMake',\r\n extensions: [ 'cmake', 'txt', 'cmake-cache' ],\r\n lineComment: '#',\r\n states: {\r\n root: [\r\n { match: /#.*/, type: 'comment' },\r\n { match: /\"/, type: 'string', next: 'doubleString' },\r\n { match: /\\$\\{[^}]+\\}/, type: 'type' },\r\n { match: /\\b\\d+\\.?\\d*\\b/, type: 'number' },\r\n { match: words( [ ...cmakeCommands, ...cmakeCommands.map( w => w.toUpperCase() ) ] ), type: 'keyword' },\r\n { match: /\\b[A-Z_][A-Z0-9_]*\\b/, type: 'builtin' },\r\n { match: /[a-zA-Z_]\\w*/, type: 'text' },\r\n { match: /[(){}]/, type: 'symbol' },\r\n { match: /\\s+/, type: 'text' },\r\n ],\r\n ...CommonStates\r\n },\r\n reservedWords: [ ...cmakeCommands ],\r\n icon: 'AlignLeft text-neutral-500'\r\n});\r\n\r\n// Rust\r\n\r\nconst rustKeywords = [\r\n 'as', 'break', 'const', 'continue', 'crate', 'else', 'enum', 'extern', 'false', 'fn',\r\n 'for', 'if', 'impl', 'in', 'let', 'loop', 'match', 'mod', 'move', 'mut', 'pub', 'ref',\r\n 'return', 'self', 'Self', 'static', 'struct', 'super', 'trait', 'true', 'type', 'unsafe',\r\n 'use', 'where', 'while', 'async', 'await', 'dyn', 'abstract', 'become', 'box', 'do',\r\n 'final', 'macro', 'override', 'priv', 'typeof', 'unsized', 'virtual', 'yield'\r\n];\r\n\r\nconst rustTypes = [\r\n 'i8', 'i16', 'i32', 'i64', 'i128', 'isize', 'u8', 'u16', 'u32', 'u64', 'u128', 'usize',\r\n 'f32', 'f64', 'bool', 'char', 'str', 'String', 'Vec', 'Option', 'Result', 'Box'\r\n];\r\n\r\nconst rustBuiltins = [\r\n 'println', 'print', 'eprintln', 'eprint', 'format', 'panic', 'assert', 'assert_eq',\r\n 'assert_ne', 'debug_assert', 'vec', 'Some', 'None', 'Ok', 'Err'\r\n];\r\n\r\nTokenizer.registerLanguage({\r\n name: 'Rust',\r\n extensions: [ 'rs' ],\r\n lineComment: '//',\r\n states: {\r\n root: [\r\n { match: /\\/\\*/, type: 'comment', next: 'blockComment' },\r\n { match: /\\/\\/.*/, type: 'comment' },\r\n { match: /\"/, type: 'string', next: 'doubleString' },\r\n { match: /'(?:\\\\.|[^'])+'/, type: 'string' },\r\n { match: /r#*\"/, type: 'string', next: 'rawString' },\r\n ...NumberRules,\r\n { match: /#\\[[\\w:]+\\]/, type: 'preprocessor' },\r\n { match: words( rustKeywords ), type: 'keyword' },\r\n { match: words( rustTypes ), type: 'type' },\r\n { match: words( rustBuiltins ), type: 'builtin' },\r\n { match: /![a-zA-Z_]\\w*/, type: 'preprocessor' },\r\n ...TailRules,\r\n ],\r\n rawString: [\r\n { match: /\"#*/, type: 'string', pop: true },\r\n { match: /[^\"]+/, type: 'string' },\r\n { match: /\"/, type: 'string' },\r\n ],\r\n ...CommonStates\r\n },\r\n reservedWords: [ ...rustKeywords, ...rustTypes, ...rustBuiltins ],\r\n icon: 'Rust text-orange-400'\r\n});\r\n\r\n// ____ _\r\n// | \\ ___ ___ _ _ _____ ___ ___| |_\r\n// | | | . | _| | | | -_| | _|\r\n// |____/|___|___|___|_|_|_|___|_|_|_|\r\n\r\nclass CodeDocument\r\n{\r\n private onChange: ( ( doc: CodeDocument ) => void ) | undefined = undefined;\r\n private _lines: string[] = [ '' ];\r\n\r\n get lineCount(): number\r\n {\r\n return this._lines.length;\r\n }\r\n\r\n constructor( onChange?: ( doc: CodeDocument ) => void )\r\n {\r\n this.onChange = onChange;\r\n }\r\n\r\n getLine( n: number ): string\r\n {\r\n return this._lines[ n ] ?? '';\r\n }\r\n\r\n getText( separator: string = '\\n' ): string\r\n {\r\n return this._lines.join( separator );\r\n }\r\n\r\n setText( text: string ): void\r\n {\r\n this._lines = text.split( /\\r?\\n/ );\r\n if ( this._lines.length === 0 )\r\n {\r\n this._lines = [ '' ];\r\n }\r\n\r\n if( this.onChange ) this.onChange( this );\r\n }\r\n\r\n getCharAt( line: number, col: number ): string | undefined\r\n {\r\n const l = this._lines[ line ];\r\n if ( !l || col < 0 || col >= l.length ) return undefined;\r\n return l[ col ];\r\n }\r\n\r\n /**\r\n * Get the word at a given position. Returns [word, startCol, endCol].\r\n */\r\n getWordAt( line: number, col: number ): [ string, number, number ]\r\n {\r\n const l = this._lines[ line ];\r\n if ( !l || col < 0 || col > l.length ) return [ '', col, col ];\r\n\r\n // Expand left\r\n let start = col;\r\n while ( start > 0 && isWord( l[ start - 1 ] ) )\r\n {\r\n start--;\r\n }\r\n\r\n // Expand right\r\n let end = col;\r\n while ( end < l.length && isWord( l[ end ] ) )\r\n {\r\n end++;\r\n }\r\n\r\n return [ l.substring( start, end ), start, end ];\r\n }\r\n\r\n /**\r\n * Get the indentation level (number of leading spaces) of a line.\r\n */\r\n getIndent( line: number ): number\r\n {\r\n const idx = firstNonspaceIndex( this._lines[ line ] ?? '' );\r\n return idx === -1 ? ( this._lines[ line ]?.length ?? 0 ) : idx;\r\n }\r\n\r\n /**\r\n * Find the next occurrence of 'text' starting after (line, col). Returns null if no match.\r\n */\r\n findNext( text: string, startLine: number, startCol: number ): { line: number, col: number } | null\r\n {\r\n if ( !text ) return null;\r\n\r\n // Search from startLine:startCol forward\r\n for ( let i = startLine; i < this._lines.length; i++ )\r\n {\r\n const searchFrom = i === startLine ? startCol : 0;\r\n const idx = this._lines[i].indexOf( text, searchFrom );\r\n if ( idx !== -1 ) return { line: i, col: idx };\r\n }\r\n\r\n // Wrap around from beginning\r\n for ( let i = 0; i <= startLine; i++ )\r\n {\r\n const searchUntil = i === startLine ? startCol : this._lines[i].length;\r\n const idx = this._lines[i].indexOf( text );\r\n if ( idx !== -1 && idx < searchUntil ) return { line: i, col: idx };\r\n }\r\n\r\n return null;\r\n }\r\n\r\n // Mutations (return EditOperations for undo):\r\n\r\n /**\r\n * Insert text at a position (handles newlines in the inserted text).\r\n */\r\n insert( line: number, col: number, text: string ): EditOperation\r\n {\r\n const parts = text.split( /\\r?\\n/ );\r\n const currentLine = this._lines[ line ] ?? '';\r\n const before = currentLine.substring( 0, col );\r\n const after = currentLine.substring( col );\r\n\r\n if ( parts.length === 1 )\r\n {\r\n this._lines[ line ] = before + parts[0] + after;\r\n }\r\n else\r\n {\r\n this._lines[ line ] = before + parts[0];\r\n for ( let i = 1; i < parts.length - 1; i++ )\r\n {\r\n this._lines.splice( line + i, 0, parts[i] );\r\n }\r\n this._lines.splice( line + parts.length - 1, 0, parts[ parts.length - 1 ] + after );\r\n }\r\n\r\n if( this.onChange ) this.onChange( this );\r\n\r\n return { type: 'insert', line, col, text };\r\n }\r\n\r\n /**\r\n * Delete `length` characters forward from a position (handles crossing line boundaries).\r\n */\r\n delete( line: number, col: number, length: number ): EditOperation\r\n {\r\n let remaining = length;\r\n let deletedText = '';\r\n let currentLine = line;\r\n let currentCol = col;\r\n\r\n while ( remaining > 0 && currentLine < this._lines.length )\r\n {\r\n const l = this._lines[ currentLine ];\r\n const available = l.length - currentCol;\r\n\r\n if ( remaining <= available )\r\n {\r\n deletedText += l.substring( currentCol, currentCol + remaining );\r\n this._lines[ currentLine ] = l.substring( 0, currentCol ) + l.substring( currentCol + remaining );\r\n remaining = 0;\r\n }\r\n else\r\n {\r\n // Delete rest of this line + the newline\r\n deletedText += l.substring( currentCol ) + '\\n';\r\n remaining -= ( available + 1 ); // +1 for the newline\r\n\r\n // Merge next line into current\r\n const nextContent = this._lines[ currentLine + 1 ] ?? '';\r\n this._lines[ currentLine ] = l.substring( 0, currentCol ) + nextContent;\r\n this._lines.splice( currentLine + 1, 1 );\r\n }\r\n }\r\n\r\n if( this.onChange ) this.onChange( this );\r\n\r\n return { type: 'delete', line, col, text: deletedText };\r\n }\r\n\r\n /**\r\n * Insert a new line after 'afterLine'. If afterLine is -1, inserts at the beginning.\r\n */\r\n insertLine( afterLine: number, text: string = '' ): EditOperation\r\n {\r\n const insertAt = afterLine + 1;\r\n this._lines.splice( insertAt, 0, text );\r\n\r\n if( this.onChange ) this.onChange( this );\r\n\r\n return { type: 'insert', line: Math.max( afterLine, 0 ), col: afterLine >= 0 ? this._lines[ afterLine ]?.length ?? 0 : 0, text: '\\n' + text };\r\n }\r\n\r\n /**\r\n * Remove an entire line and its trailing newline.\r\n */\r\n removeLine( line: number ): EditOperation\r\n {\r\n const text = this._lines[ line ];\r\n this._lines.splice( line, 1 );\r\n if ( this._lines.length === 0 )\r\n {\r\n this._lines = [ '' ];\r\n }\r\n\r\n if( this.onChange ) this.onChange( this );\r\n\r\n return { type: 'delete', line: Math.max( line - 1, 0 ), col: line > 0 ? ( this._lines[ line - 1 ]?.length ?? 0 ) : 0, text: '\\n' + text };\r\n }\r\n\r\n replaceLine( line: number, newText: string ): EditOperation\r\n {\r\n const oldText = this._lines[ line ];\r\n this._lines[ line ] = newText;\r\n\r\n if( this.onChange ) this.onChange( this );\r\n\r\n return { type: 'replaceLine', line, col: 0, text: newText, oldText };\r\n }\r\n\r\n /**\r\n * Apply an edit operation (used by undo/redo).\r\n */\r\n applyInverse( op: EditOperation ): EditOperation\r\n {\r\n if ( op.type === 'insert' )\r\n {\r\n return this.delete( op.line, op.col, op.text.length );\r\n }\r\n else if ( op.type === 'replaceLine' )\r\n {\r\n return this.replaceLine( op.line, op.oldText! );\r\n }\r\n else\r\n {\r\n return this.insert( op.line, op.col, op.text );\r\n }\r\n }\r\n}\r\n\r\n// _____ _ _ _ _____ _ _ _| |_ _____ _ _____ \r\n// | __|_| |_| |_ | |___ ___ ___ ___| |_|_|___ ___ ___ | __| | | |___ _| |___ | |___ ___ ___ ___ ___ ___ \r\n// | __| . | | _| | | | . | -_| _| .'| _| | . | |_ -| | __| | | | | . | . | | | | | .'| | .'| . | -_| _|\r\n// |_____|___|_|_| |_____| _|___|_| |__,|_| |_|___|_|_|___| |_ _| |_____|_|_|___|___| |_|_|_|__,|_|_|__,|_ |___|_| \r\n// |_| |_| |___|\r\n\r\ninterface EditOperation\r\n{\r\n type: 'insert' | 'delete' | 'replaceLine';\r\n line: number;\r\n col: number;\r\n text: string;\r\n oldText?: string; // used by replaceLine to store previous content\r\n}\r\n\r\ninterface UndoEntry\r\n{\r\n operations: EditOperation[];\r\n cursorsBefore: CursorPosition[];\r\n cursorsAfter: CursorPosition[];\r\n}\r\n\r\nclass UndoManager\r\n{\r\n private _undoStack: UndoEntry[] = [];\r\n private _redoStack: UndoEntry[] = [];\r\n private _pendingOps: EditOperation[] = [];\r\n private _pendingCursorsBefore: CursorPosition[] = [];\r\n private _pendingCursorsAfter: CursorPosition[] = [];\r\n private _lastPushTime: number = 0;\r\n private _groupThresholdMs: number;\r\n private _maxSteps: number;\r\n\r\n constructor( groupThresholdMs: number = 2000, maxSteps: number = 200 )\r\n {\r\n this._groupThresholdMs = groupThresholdMs;\r\n this._maxSteps = maxSteps;\r\n }\r\n\r\n /**\r\n * Record an edit operation. Consecutive operations within the time threshold\r\n * are grouped into a single undo step.\r\n */\r\n record( op: EditOperation, cursors: CursorPosition[] ): void\r\n {\r\n const now = Date.now();\r\n const elapsed = now - this._lastPushTime;\r\n\r\n if ( elapsed > this._groupThresholdMs && this._pendingOps.length > 0 )\r\n {\r\n this._flush();\r\n }\r\n\r\n if ( this._pendingOps.length === 0 )\r\n {\r\n this._pendingCursorsBefore = cursors.map( c => ( { ...c } ) );\r\n }\r\n\r\n this._pendingOps.push( op );\r\n this._pendingCursorsAfter = cursors.map( c => ( { ...c } ) );\r\n this._lastPushTime = now;\r\n\r\n // New edits clear the redo stack\r\n this._redoStack.length = 0;\r\n }\r\n\r\n /**\r\n * Force-flush pending operations into a final undo step.\r\n */\r\n flush( cursorsAfter?: CursorPosition[] ): void\r\n {\r\n if ( cursorsAfter && this._pendingOps.length > 0 )\r\n {\r\n this._pendingCursorsAfter = cursorsAfter.map( c => ( { ...c } ) );\r\n }\r\n this._flush();\r\n }\r\n\r\n /**\r\n * Undo the last step. Stores the operations to apply inversely, and returns the cursor state to restore.\r\n */\r\n undo( doc: CodeDocument, currentCursors?: CursorPosition[] ): { cursors: CursorPosition[] } | null\r\n {\r\n this.flush( currentCursors );\r\n\r\n const entry = this._undoStack.pop();\r\n if ( !entry ) return null;\r\n\r\n // Apply in reverse order\r\n const redoOps: EditOperation[] = [];\r\n for ( let i = entry.operations.length - 1; i >= 0; i-- )\r\n {\r\n const inverseOp = doc.applyInverse( entry.operations[i] );\r\n redoOps.unshift( inverseOp );\r\n }\r\n\r\n this._redoStack.push( { operations: redoOps, cursorsBefore: entry.cursorsBefore, cursorsAfter: entry.cursorsAfter } );\r\n\r\n return { cursors: entry.cursorsBefore };\r\n }\r\n\r\n /**\r\n * Redo the last undone step. Returns the cursor state to restore.\r\n */\r\n redo( doc: CodeDocument ): { cursors: CursorPosition[] } | null\r\n {\r\n const entry = this._redoStack.pop();\r\n if ( !entry ) return null;\r\n\r\n // Apply in forward order (redo entries are already in correct order)\r\n const undoOps: EditOperation[] = [];\r\n for ( let i = 0; i < entry.operations.length; i++ )\r\n {\r\n const inverseOp = doc.applyInverse( entry.operations[i] );\r\n undoOps.push( inverseOp );\r\n }\r\n\r\n this._undoStack.push( { operations: undoOps, cursorsBefore: entry.cursorsBefore, cursorsAfter: entry.cursorsAfter } );\r\n\r\n return { cursors: entry.cursorsAfter };\r\n }\r\n\r\n canUndo(): boolean\r\n {\r\n return this._undoStack.length > 0 || this._pendingOps.length > 0;\r\n }\r\n\r\n canRedo(): boolean\r\n {\r\n return this._redoStack.length > 0;\r\n }\r\n\r\n clear(): void\r\n {\r\n this._undoStack.length = 0;\r\n this._redoStack.length = 0;\r\n this._pendingOps.length = 0;\r\n this._lastPushTime = 0;\r\n }\r\n\r\n private _flush(): void\r\n {\r\n if ( this._pendingOps.length === 0 ) return;\r\n\r\n this._undoStack.push( {\r\n operations: [ ...this._pendingOps ],\r\n cursorsBefore: [ ...this._pendingCursorsBefore ],\r\n cursorsAfter: [ ...this._pendingCursorsAfter ]\r\n } );\r\n\r\n this._pendingOps.length = 0;\r\n this._pendingCursorsBefore = [];\r\n this._pendingCursorsAfter = [];\r\n\r\n // Limit stack size\r\n while ( this._undoStack.length > this._maxSteps )\r\n {\r\n this._undoStack.shift();\r\n }\r\n }\r\n}\r\n\r\n// _____ _| |_ _____ _ _ _ \r\n// | |_ _ ___ ___ ___ ___ | __| | __|___| |___ ___| |_|_|___ ___ \r\n// | --| | | _|_ -| . | _| | __| |__ | -_| | -_| _| _| | . | |\r\n// |_____|___|_| |___|___|_| |_ _| |_____|___|_|___|___|_| |_|___|_|_|\r\n// |_|\r\n\r\ninterface CursorPosition\r\n{\r\n line: number;\r\n col: number;\r\n}\r\n\r\ninterface Selection\r\n{\r\n anchor: CursorPosition; // where selection started\r\n head: CursorPosition; // where cursor is (moves during selection)\r\n}\r\n\r\nfunction posEqual( a: CursorPosition, b: CursorPosition ): boolean\r\n{\r\n return a.line === b.line && a.col === b.col;\r\n}\r\n\r\nfunction posBefore( a: CursorPosition, b: CursorPosition ): boolean\r\n{\r\n return a.line < b.line || ( a.line === b.line && a.col < b.col );\r\n}\r\n\r\nfunction selectionStart( sel: Selection ): CursorPosition\r\n{\r\n return posBefore( sel.anchor, sel.head ) ? sel.anchor : sel.head;\r\n}\r\n\r\nfunction selectionEnd( sel: Selection ): CursorPosition\r\n{\r\n return posBefore( sel.anchor, sel.head ) ? sel.head : sel.anchor;\r\n}\r\n\r\nfunction selectionIsEmpty( sel: Selection ): boolean\r\n{\r\n return posEqual( sel.anchor, sel.head );\r\n}\r\n\r\nclass CursorSet\r\n{\r\n cursors: Selection[] = [];\r\n\r\n constructor()\r\n {\r\n // Start with one cursor at 0,0\r\n this.cursors = [ { anchor: { line: 0, col: 0 }, head: { line: 0, col: 0 } } ];\r\n }\r\n\r\n getPrimary(): Selection\r\n {\r\n return this.cursors[0];\r\n }\r\n\r\n /**\r\n * Set a single cursor position. Clears all secondary cursors and selections.\r\n */\r\n set( line: number, col: number ): void\r\n {\r\n this.cursors = [ { anchor: { line, col }, head: { line, col } } ];\r\n }\r\n\r\n // Movement:\r\n\r\n moveLeft( doc: CodeDocument, selecting: boolean = false ): void\r\n {\r\n for ( const sel of this.cursors )\r\n {\r\n this._moveHead( sel, doc, -1, 0, selecting );\r\n }\r\n this._merge();\r\n }\r\n\r\n moveRight( doc: CodeDocument, selecting: boolean = false ): void\r\n {\r\n for ( const sel of this.cursors )\r\n {\r\n this._moveHead( sel, doc, 1, 0, selecting );\r\n }\r\n this._merge();\r\n }\r\n\r\n moveUp( doc: CodeDocument, selecting: boolean = false ): void\r\n {\r\n for ( const sel of this.cursors )\r\n {\r\n this._moveVertical( sel, doc, -1, selecting );\r\n }\r\n this._merge();\r\n }\r\n\r\n moveDown( doc: CodeDocument, selecting: boolean = false ): void\r\n {\r\n for ( const sel of this.cursors )\r\n {\r\n this._moveVertical( sel, doc, 1, selecting );\r\n }\r\n this._merge();\r\n }\r\n\r\n moveToLineStart( doc: CodeDocument, selecting: boolean = false, noIndent: boolean = false ): void\r\n {\r\n for ( const sel of this.cursors )\r\n {\r\n const line = sel.head.line;\r\n const indent = doc.getIndent( line );\r\n // Toggle between indent and column 0\r\n const targetCol = ( sel.head.col === indent || noIndent ) ? 0 : indent;\r\n sel.head = { line, col: targetCol };\r\n if ( !selecting ) sel.anchor = { ...sel.head };\r\n }\r\n this._merge();\r\n }\r\n\r\n moveToLineEnd( doc: CodeDocument, selecting: boolean = false ): void\r\n {\r\n for ( const sel of this.cursors )\r\n {\r\n const line = sel.head.line;\r\n sel.head = { line, col: doc.getLine( line ).length };\r\n if ( !selecting ) sel.anchor = { ...sel.head };\r\n }\r\n this._merge();\r\n }\r\n\r\n moveWordLeft( doc: CodeDocument, selecting: boolean = false ): void\r\n {\r\n for ( const sel of this.cursors )\r\n {\r\n const { line, col } = sel.head;\r\n if ( col === 0 && line > 0 )\r\n {\r\n // Jump to end of previous line\r\n sel.head = { line: line - 1, col: doc.getLine( line - 1 ).length };\r\n }\r\n else\r\n {\r\n const l = doc.getLine( line );\r\n let c = col;\r\n // Skip whitespace\r\n while ( c > 0 && /\\s/.test( l[ c - 1 ] ) ) c--;\r\n // Skip word or symbols\r\n if ( c > 0 && isWord( l[ c - 1 ] ) )\r\n {\r\n while ( c > 0 && isWord( l[ c - 1 ] ) ) c--;\r\n }\r\n else if ( c > 0 )\r\n {\r\n while ( c > 0 && isSymbol( l[ c - 1 ] ) ) c--;\r\n }\r\n sel.head = { line, col: c };\r\n }\r\n if ( !selecting ) sel.anchor = { ...sel.head };\r\n }\r\n this._merge();\r\n }\r\n\r\n moveWordRight( doc: CodeDocument, selecting: boolean = false ): void\r\n {\r\n for ( const sel of this.cursors )\r\n {\r\n const { line, col } = sel.head;\r\n const l = doc.getLine( line );\r\n if ( col >= l.length && line < doc.lineCount - 1 )\r\n {\r\n // Jump to start of next line\r\n sel.head = { line: line + 1, col: 0 };\r\n }\r\n else\r\n {\r\n let c = col;\r\n // Skip leading whitespace first\r\n while ( c < l.length && /\\s/.test( l[ c ] ) ) c++;\r\n // Then skip word or symbols to end of group\r\n if ( c < l.length && isWord( l[ c ] ) )\r\n {\r\n while ( c < l.length && isWord( l[ c ] ) ) c++;\r\n }\r\n else if ( c < l.length && isSymbol( l[ c ] ) )\r\n {\r\n while ( c < l.length && isSymbol( l[ c ] ) ) c++;\r\n }\r\n sel.head = { line, col: c };\r\n }\r\n if ( !selecting ) sel.anchor = { ...sel.head };\r\n }\r\n this._merge();\r\n }\r\n\r\n selectAll( doc: CodeDocument ): void\r\n {\r\n const lastLine = doc.lineCount - 1;\r\n this.cursors = [ {\r\n anchor: { line: 0, col: 0 },\r\n head: { line: lastLine, col: doc.getLine( lastLine ).length }\r\n } ];\r\n }\r\n\r\n // Multi-cursor:\r\n\r\n addCursor( line: number, col: number ): void\r\n {\r\n this.cursors.push( { anchor: { line, col }, head: { line, col } } );\r\n this._merge();\r\n }\r\n\r\n removeSecondaryCursors(): void\r\n {\r\n this.cursors = [ this.cursors[0] ];\r\n }\r\n\r\n /**\r\n * Returns cursor indices sorted by head position, bottom-to-top (last in doc first)\r\n * to ensure earlier cursors' positions stay valid.\r\n */\r\n sortedIndicesBottomUp(): number[]\r\n {\r\n return this.cursors\r\n .map( ( _, i ) => i )\r\n .sort( ( a, b ) =>\r\n {\r\n const ah = this.cursors[a].head;\r\n const bh = this.cursors[b].head;\r\n return bh.line !== ah.line ? bh.line - ah.line : bh.col - ah.col;\r\n } );\r\n }\r\n\r\n /**\r\n * After editing at (line, col), shift all other cursors on the same line\r\n * that are at or after `afterCol` by `colDelta`. Also handles line shifts\r\n * for multi-line inserts/deletes via `lineDelta`.\r\n */\r\n adjustOthers( skipIdx: number, line: number, afterCol: number, colDelta: number, lineDelta: number = 0 ): void\r\n {\r\n for ( let i = 0; i < this.cursors.length; i++ )\r\n {\r\n if ( i === skipIdx ) continue;\r\n const c = this.cursors[i];\r\n\r\n // Adjust head\r\n if ( lineDelta !== 0 && c.head.line > line )\r\n {\r\n c.head = { line: c.head.line + lineDelta, col: c.head.col };\r\n }\r\n else if ( c.head.line === line && c.head.col >= afterCol )\r\n {\r\n c.head = { line: c.head.line + lineDelta, col: c.head.col + colDelta };\r\n }\r\n\r\n // Adjust anchor\r\n if ( lineDelta !== 0 && c.anchor.line > line )\r\n {\r\n c.anchor = { line: c.anchor.line + lineDelta, col: c.anchor.col };\r\n }\r\n else if ( c.anchor.line === line && c.anchor.col >= afterCol )\r\n {\r\n c.anchor = { line: c.anchor.line + lineDelta, col: c.anchor.col + colDelta };\r\n }\r\n }\r\n }\r\n\r\n // Queries:\r\n\r\n hasSelection( index: number = 0 ): boolean\r\n {\r\n const sel = this.cursors[ index ];\r\n return sel ? !posEqual( sel.anchor, sel.head ) : false;\r\n }\r\n\r\n getSelectedText( doc: CodeDocument, index: number = 0 ): string\r\n {\r\n const sel = this.cursors[ index ];\r\n if ( !sel || selectionIsEmpty( sel ) ) return '';\r\n\r\n const start = selectionStart( sel );\r\n const end = selectionEnd( sel );\r\n\r\n if ( start.line === end.line )\r\n {\r\n return doc.getLine( start.line ).substring( start.col, end.col );\r\n }\r\n\r\n const lines: string[] = [];\r\n lines.push( doc.getLine( start.line ).substring( start.col ) );\r\n for ( let i = start.line + 1; i < end.line; i++ )\r\n {\r\n lines.push( doc.getLine( i ) );\r\n }\r\n lines.push( doc.getLine( end.line ).substring( 0, end.col ) );\r\n return lines.join( '\\n' );\r\n }\r\n\r\n getCursorPositions(): CursorPosition[]\r\n {\r\n return this.cursors.map( s => ( { ...s.head } ) );\r\n }\r\n\r\n private _moveHead( sel: Selection, doc: CodeDocument, dx: number, _dy: number, selecting: boolean ): void\r\n {\r\n const { line, col } = sel.head;\r\n\r\n // If there's a selection and we're not extending it, collapse to the edge\r\n if ( !selecting && !selectionIsEmpty( sel ) )\r\n {\r\n const target = dx < 0 ? selectionStart( sel ) : selectionEnd( sel );\r\n sel.head = { ...target };\r\n sel.anchor = { ...target };\r\n return;\r\n }\r\n\r\n if ( dx < 0 )\r\n {\r\n if ( col > 0 )\r\n {\r\n sel.head = { line, col: col - 1 };\r\n }\r\n else if ( line > 0 )\r\n {\r\n sel.head = { line: line - 1, col: doc.getLine( line - 1 ).length };\r\n }\r\n }\r\n else if ( dx > 0 )\r\n {\r\n const lineLen = doc.getLine( line ).length;\r\n if ( col < lineLen )\r\n {\r\n sel.head = { line, col: col + 1 };\r\n }\r\n else if ( line < doc.lineCount - 1 )\r\n {\r\n sel.head = { line: line + 1, col: 0 };\r\n }\r\n }\r\n\r\n if ( !selecting ) sel.anchor = { ...sel.head };\r\n }\r\n\r\n private _moveVertical( sel: Selection, doc: CodeDocument, direction: number, selecting: boolean ): void\r\n {\r\n const { line, col } = sel.head;\r\n const newLine = line + direction;\r\n\r\n if ( newLine < 0 || newLine >= doc.lineCount ) return;\r\n\r\n const newLineLen = doc.getLine( newLine ).length;\r\n sel.head = { line: newLine, col: Math.min( col, newLineLen ) };\r\n\r\n if ( !selecting ) sel.anchor = { ...sel.head };\r\n }\r\n\r\n /**\r\n * Merge overlapping cursors/selections. Keeps the first one when duplicates exist.\r\n */\r\n private _merge(): void\r\n {\r\n if ( this.cursors.length <= 1 ) return;\r\n\r\n // Sort by head position\r\n this.cursors.sort( ( a, b ) => {\r\n if ( a.head.line !== b.head.line ) return a.head.line - b.head.line;\r\n return a.head.col - b.head.col;\r\n } );\r\n\r\n const merged: Selection[] = [ this.cursors[0] ];\r\n\r\n for ( let i = 1; i < this.cursors.length; i++ )\r\n {\r\n const prev = merged[ merged.length - 1 ];\r\n const curr = this.cursors[i];\r\n\r\n if ( posEqual( prev.head, curr.head ) )\r\n {\r\n // Same position — skip duplicate\r\n continue;\r\n }\r\n\r\n merged.push( curr );\r\n }\r\n\r\n this.cursors = merged;\r\n }\r\n}\r\n\r\n// _____ _ _\r\n// | __|_ _ _____| |_ ___| |___\r\n// |__ | | | | . | . | |_ -|\r\n// |_____|_ |_|_|_|___|___|_|___|\r\n// |___|\r\n\r\ninterface Symbol\r\n{\r\n name: string;\r\n kind: string; // class | function | method | variable | interface | type | enum | struct | property | constructor-call | method-call\r\n scope: string;\r\n line: number;\r\n col?: number;\r\n}\r\n\r\ninterface ScopeInfo\r\n{\r\n name: string;\r\n type: string; // global | class | function | method | enum | struct | interface | anonymous\r\n line: number; // Line where scope opened\r\n}\r\n\r\n/**\r\n * Strips string literals and single-line comments from a line of code,\r\n * leaving only the structural characters (braces, operators, keywords etc).\r\n */\r\nfunction stripLiteralsAndComments( line: string ): string\r\n{\r\n let result = '';\r\n let i = 0;\r\n while ( i < line.length )\r\n {\r\n const ch = line[ i ];\r\n\r\n // Remove single-line comment\r\n if ( ch === '/' && line[ i + 1 ] === '/' )\r\n {\r\n break;\r\n }\r\n\r\n // Block comment (same line): skip to closing */\r\n if ( ch === '/' && line[ i + 1 ] === '*' )\r\n {\r\n i += 2;\r\n while ( i < line.length && !( line[ i ] === '*' && line[ i + 1 ] === '/' ) ) i++;\r\n i += 2;\r\n continue;\r\n }\r\n\r\n // Remove strings (single, double, template)\r\n if ( ch === '\"' || ch === \"'\" || ch === '`' )\r\n {\r\n const quote = ch;\r\n i++;\r\n while ( i < line.length )\r\n {\r\n if ( line[ i ] === '\\\\' ) { i += 2; continue; } // escaped char\r\n if ( line[ i ] === quote ) { i++; break; } // closing quote\r\n i++;\r\n }\r\n continue;\r\n }\r\n\r\n result += ch;\r\n i++;\r\n }\r\n return result;\r\n}\r\n\r\n/**\r\n * Manages code symbols for autocomplete, navigation, and outlining.\r\n * Incrementally updates as lines change.\r\n */\r\nclass SymbolTable\r\n{\r\n private _symbols: Map<string, Symbol[]> = new Map(); // name -> symbols[]\r\n private _lineSymbols: Symbol[][] = []; // [lineNum] -> symbols declared on that line\r\n private _scopeStack: ScopeInfo[] = [{ name: 'global', type: 'global', line: 0 }];\r\n private _lineScopes: ScopeInfo[][] = []; // [lineNum] -> scope stack at start of that line\r\n private _lineScopesEnd: ScopeInfo[][] = []; // [lineNum] -> scope stack at end of that line\r\n\r\n get currentScope(): string\r\n {\r\n return this._scopeStack[this._scopeStack.length - 1]?.name ?? 'global';\r\n }\r\n\r\n get currentScopeType(): string\r\n {\r\n return this._scopeStack[this._scopeStack.length - 1]?.type ?? 'global';\r\n }\r\n\r\n getScopeAtLine( line: number ): ScopeInfo[]\r\n {\r\n return this._lineScopes[line] ?? [{ name: 'global', type: 'global', line: 0 }];\r\n }\r\n\r\n getLineScopeEnd( line: number ): ScopeInfo[]\r\n {\r\n return this._lineScopesEnd[line] ?? [{ name: 'global', type: 'global', line: 0 }];\r\n }\r\n\r\n getSymbols( name: string ): Symbol[]\r\n {\r\n return this._symbols.get( name ) ?? [];\r\n }\r\n\r\n getAllSymbolNames(): string[]\r\n {\r\n return Array.from( this._symbols.keys() );\r\n }\r\n\r\n getAllSymbols(): Symbol[]\r\n {\r\n const all: Symbol[] = [];\r\n for ( const symbols of this._symbols.values() )\r\n {\r\n all.push( ...symbols );\r\n }\r\n return all;\r\n }\r\n\r\n getLineSymbols( line: number ): Symbol[]\r\n {\r\n return this._lineSymbols[line] ?? [];\r\n }\r\n\r\n /** Update scope stack for a line (call before parsing symbols) */\r\n updateScopeForLine( line: number, lineText: string ): void\r\n {\r\n if ( line === 0 )\r\n {\r\n this._scopeStack = [{ name: 'global', type: 'global', line: 0 }];\r\n }\r\n else if ( this._lineScopesEnd[line - 1] )\r\n {\r\n this._scopeStack = [ ...this._lineScopesEnd[line - 1] ];\r\n }\r\n\r\n const stripped = stripLiteralsAndComments( lineText );\r\n const openBraces = ( stripped.match( /\\{/g ) || [] ).length;\r\n const closeBraces = ( stripped.match( /\\}/g ) || [] ).length;\r\n\r\n this._lineScopes[line] = [ ...this._scopeStack ];\r\n\r\n // Pop scopes for closing braces\r\n for ( let i = 0; i < closeBraces; i++ )\r\n {\r\n if ( this._scopeStack.length > 1 ) this._scopeStack.pop();\r\n }\r\n\r\n // Push scopes for opening braces (symbol detection will name them later)\r\n for ( let i = 0; i < openBraces; i++ )\r\n {\r\n this._scopeStack.push( { name: 'anonymous', type: 'anonymous', line } );\r\n }\r\n\r\n this._lineScopesEnd[line] = [ ...this._scopeStack ];\r\n }\r\n\r\n /** Name the most recent anonymous scope (called when detecting class/function) */\r\n nameCurrentScope( name: string, type: string ): void\r\n {\r\n if ( this._scopeStack.length > 0 )\r\n {\r\n const current = this._scopeStack[this._scopeStack.length - 1];\r\n if ( current.name === 'anonymous' || current.type === 'anonymous' )\r\n {\r\n current.name = name;\r\n current.type = type;\r\n }\r\n }\r\n }\r\n\r\n /** Remove symbols from a line (before reparsing) */\r\n removeLineSymbols( line: number ): void\r\n {\r\n const oldSymbols = this._lineSymbols[line];\r\n if ( !oldSymbols ) return;\r\n\r\n for ( const symbol of oldSymbols )\r\n {\r\n const list = this._symbols.get( symbol.name );\r\n if ( !list ) continue;\r\n\r\n // Remove this specific symbol from the name's list\r\n const index = list.findIndex( s => s.line === line && s.kind === symbol.kind && s.scope === symbol.scope );\r\n if ( index !== -1 ) list.splice( index, 1 );\r\n\r\n if ( list.length === 0 ) this._symbols.delete( symbol.name );\r\n }\r\n\r\n this._lineSymbols[line] = [];\r\n }\r\n\r\n addSymbol( symbol: Symbol ): void\r\n {\r\n if ( !this._symbols.has( symbol.name ) )\r\n {\r\n this._symbols.set( symbol.name, [] );\r\n }\r\n this._symbols.get( symbol.name )!.push( symbol );\r\n\r\n if ( !this._lineSymbols[symbol.line] )\r\n {\r\n this._lineSymbols[symbol.line] = [];\r\n }\r\n this._lineSymbols[symbol.line].push( symbol );\r\n }\r\n\r\n /** Reset scope stack (e.g. when document structure changes significantly) */\r\n resetScopes(): void\r\n {\r\n this._scopeStack = [{ name: 'global', type: 'global', line: 0 }];\r\n this._lineScopes = [];\r\n this._lineScopesEnd = [];\r\n }\r\n\r\n clear(): void\r\n {\r\n this._symbols.clear();\r\n this._lineSymbols = [];\r\n this.resetScopes();\r\n }\r\n}\r\n\r\n/**\r\n * Parse symbols from a line of code using token types and text patterns to detect declarations.\r\n */\r\nfunction parseSymbolsFromLine( lineText: string, tokens: Token[], line: number, symbolTable: SymbolTable ): Symbol[]\r\n{\r\n const symbols: Symbol[] = [];\r\n\r\n // Use the scope snapshot from the START of this line, not currentScope/currentScopeType \r\n // which will reflect state AFTER updateScopeForLine already pushed/popped braces on this line...\r\n const lineScopes = symbolTable.getScopeAtLine( line );\r\n const lineScope = lineScopes[ lineScopes.length - 1 ];\r\n const scope = lineScope?.name ?? 'global';\r\n const scopeType = lineScope?.type ?? 'global';\r\n\r\n const reservedWords = new Set<string>();\r\n for ( const token of tokens )\r\n {\r\n if ( [ 'keyword', 'statement', 'builtin', 'preprocessor' ].includes( token.type ) )\r\n {\r\n reservedWords.add( token.value );\r\n }\r\n }\r\n\r\n // Track added symbols by name and approximate position using 5 chars tolerance to avoid duplicates\r\n const addedSymbols = new Set<string>();\r\n\r\n const addSymbol = ( name: string, kind: string, col: number = 0 ) =>\r\n {\r\n if ( !name || !name.match( /^[a-zA-Z_$][\\w$]*$/ ) ) return; // Valid identifier check\r\n if ( reservedWords.has( name ) ) return;\r\n\r\n const posKey = `${name}@${Math.floor( col / 5 ) * 5}`;\r\n if ( addedSymbols.has( posKey ) ) return; // Already added\r\n\r\n symbols.push( { name, kind, scope, line, col } );\r\n addedSymbols.add( posKey );\r\n };\r\n\r\n // Top-level declaration patterns (only one per line, checked with anchors)\r\n const topLevelPatterns = [\r\n { regex: /^\\s*class\\s+([A-Z_]\\w*)/i, kind: 'class' },\r\n { regex: /^\\s*struct\\s+([A-Z_]\\w*)/i, kind: 'struct' },\r\n { regex: /^\\s*interface\\s+([A-Z_]\\w*)/i, kind: 'interface' },\r\n { regex: /^\\s*enum\\s+([A-Z_]\\w*)/i, kind: 'enum' },\r\n { regex: /^\\s*type\\s+([A-Z_]\\w*)\\s*=/i, kind: 'type' },\r\n { regex: /^\\s*(?:export\\s+)?(?:async\\s+)?function\\s+(\\w+)/i, kind: 'function' },\r\n { regex: /^\\s*(?:const|let|var)\\s+(\\w+)\\s*=\\s*(?:async\\s+)?\\([^)]*\\)\\s*=>/i, kind: 'function' },\r\n { regex: /^\\s*(?:static\\s+|const\\s+|virtual\\s+|inline\\s+|extern\\s+|pub\\s+|async\\s+)*(?!\\b(?:await|return|if|else|while|for|switch|case|throw|new|delete|typeof|yield)\\b)(\\w+[\\w\\s\\*&:<>,]*?)\\s+(\\w+)\\s*\\([^)]*\\)\\s*[{;]/i, kind: 'typed-function' },\r\n { regex: /^\\s*(?:(?:public|private|protected|static|readonly|async|override)\\s+)*(\\w+)\\s*\\([^)]*\\)\\s*[:{]/i, kind: scopeType === 'class' ? 'method' : 'function' }\r\n ];\r\n\r\n const multiPatterns = [\r\n { regex: /(?:const|let|var)\\s+(\\w+)/gi, kind: 'variable' },\r\n { regex: /(\\w+)\\s*:\\s*(?:function|[A-Z]\\w*)/gi, kind: 'variable' },\r\n { regex: /this\\.(\\w+)\\s*=/gi, kind: 'property' },\r\n { regex: /\\b(?:private|protected|public)\\s+(?:(?:static|readonly)\\s+)*(\\w+)\\s*[=:;]/gi, kind: 'property' },\r\n { regex: /new\\s+([A-Z]\\w+)/gi, kind: 'constructor-call' },\r\n { regex: /(\\w+)\\s*\\(/gi, kind: 'method-call' }\r\n ];\r\n\r\n let foundTopLevel = false;\r\n for ( const pattern of topLevelPatterns )\r\n {\r\n const match = lineText.match( pattern.regex );\r\n if ( match )\r\n {\r\n let name: string;\r\n let kind = pattern.kind;\r\n\r\n if ( pattern.kind === 'typed-function' && match[2] )\r\n {\r\n name = match[2];\r\n kind = scopeType === 'class' ? 'method' : 'function';\r\n }\r\n else if ( match[1] )\r\n {\r\n name = match[1];\r\n }\r\n else\r\n {\r\n continue;\r\n }\r\n\r\n const col = lineText.indexOf( name );\r\n addSymbol( name, kind, col );\r\n\r\n if ( [ 'class', 'function', 'method', 'enum', 'struct', 'interface' ].includes( kind ) )\r\n {\r\n symbolTable.nameCurrentScope( name, kind );\r\n }\r\n\r\n foundTopLevel = true;\r\n break;\r\n }\r\n }\r\n\r\n // If no top-level declaration, check for multiple occurrences\r\n if ( !foundTopLevel )\r\n {\r\n for ( const pattern of multiPatterns )\r\n {\r\n const matches = lineText.matchAll( pattern.regex );\r\n for ( const match of matches )\r\n {\r\n if ( match[1] )\r\n {\r\n const name = match[1];\r\n const col = match.index ?? 0;\r\n addSymbol( name, pattern.kind, col );\r\n }\r\n }\r\n }\r\n }\r\n\r\n if ( scopeType === 'enum' )\r\n {\r\n const enumValueMatch = lineText.match( /^\\s*(\\w+)\\s*[,=]?/ );\r\n if ( enumValueMatch && enumValueMatch[1] && !lineText.includes( 'enum' ) )\r\n {\r\n addSymbol( enumValueMatch[1], 'enum-value', lineText.indexOf( enumValueMatch[1] ) );\r\n }\r\n }\r\n\r\n return symbols;\r\n}\r\n\r\n// _____ _ _____ _ _ _ ____ _____ _____ \r\n// | |___ _| |___| __|_| |_| |_ ___ ___ | \\| | |\r\n// | --| . | . | -_| __| . | | _| . | _| | | | | | | | |\r\n// |_____|___|___|___|_____|___|_|_| |___|_| |____/|_____|_|_|_|\r\n\r\nconst g = globalThis as any;\r\nconst TOKEN_CLASS_MAP: Record<string, string> = {\r\n 'keyword': 'cm-kwd',\r\n 'statement': 'cm-std',\r\n 'type': 'cm-typ',\r\n 'builtin': 'cm-bln',\r\n 'string': 'cm-str',\r\n 'comment': 'cm-com',\r\n 'number': 'cm-dec',\r\n 'method': 'cm-mtd',\r\n 'symbol': 'cm-sym',\r\n 'enum': 'cm-enu',\r\n 'preprocessor': 'cm-ppc',\r\n 'variable': 'cm-var',\r\n};\r\n\r\nconst Area = LX.Area;\r\nconst Panel = LX.Panel;\r\nconst Tabs = LX.Tabs;\r\nconst NodeTree = LX.NodeTree;\r\n\r\ninterface CodeTab\r\n{\r\n name: string;\r\n dom: HTMLElement;\r\n doc: CodeDocument;\r\n cursorSet: CursorSet;\r\n undoManager: UndoManager;\r\n language: string;\r\n title?: string;\r\n path?: string;\r\n}\r\n\r\nexport interface CodeSuggestion\r\n{\r\n label: string;\r\n kind?: string;\r\n scope?: string;\r\n detail?: string;\r\n insertText?: string;\r\n filterText?: string;\r\n sortText?: string;\r\n icon?: string;\r\n iconClass?: string;\r\n}\r\n\r\nexport interface HoverSymbolInfo\r\n{\r\n word: string;\r\n tokenType: string; // keyword | type | method | number | string | comment | text …\r\n symbols: Symbol[]; // matching entries from the symbol table\r\n}\r\n\r\n/** Matches hex color literals: #rgb #rgba #rrggbb #rrggbbaa */\r\nconst HEX_COLOR_RE = /#(?:[0-9a-fA-F]{8}|[0-9a-fA-F]{6}|[0-9a-fA-F]{4}|[0-9a-fA-F]{3})\\b/g;\r\n\r\n/**\r\n * Scans a raw token value for hex color literals and returns HTML with each\r\n * color wrapped in a swatch span. Non-color text is HTML-escaped.\r\n */\r\nfunction injectColorSpans( raw: string, lineIndex: number, colOffset: number ): string\r\n{\r\n HEX_COLOR_RE.lastIndex = 0;\r\n let result = '';\r\n let lastIndex = 0;\r\n let match: RegExpExecArray | null;\r\n\r\n const esc = ( s: string ) =>\r\n s.replace( /&/g, '&amp;' ).replace( /</g, '&lt;' ).replace( />/g, '&gt;' );\r\n\r\n while ( ( match = HEX_COLOR_RE.exec( raw ) ) !== null )\r\n {\r\n result += esc( raw.slice( lastIndex, match.index ) );\r\n const color = match[0];\r\n const col = colOffset + match.index;\r\n result += `<span class=\"code-color\" data-color=\"${color}\" data-line=\"${lineIndex}\" data-col=\"${col}\" style=\"--code-color:${color}\"><span class=\"code-color-swatch\"></span>${esc( color )}</span>`;\r\n lastIndex = match.index + color.length;\r\n }\r\n\r\n result += esc( raw.slice( lastIndex ) );\r\n return result;\r\n}\r\n\r\n// _____ _ _ _____\r\n// | __|___ ___ ___| | | __ |___ ___\r\n// |__ | _| _| . | | | __ -| .'| _|\r\n// |_____|___|_| |___|_|_|_____|__,|_|\r\n\r\nclass ScrollBar\r\n{\r\n static SIZE = 10;\r\n\r\n root: HTMLElement;\r\n thumb: HTMLElement;\r\n\r\n private _vertical: boolean;\r\n private _thumbPos: number = 0; // current thumb offset in px\r\n private _thumbRatio: number = 0; // thumb size as fraction of track (0..1)\r\n private _lastMouse: number = 0;\r\n private _onDrag: ( ( delta: number ) => void ) | null = null;\r\n\r\n get visible(): boolean { return !this.root.classList.contains( 'hidden' ); }\r\n get isVertical(): boolean { return this._vertical; }\r\n\r\n constructor( vertical: boolean, onDrag: ( delta: number ) => void )\r\n {\r\n this._vertical = vertical;\r\n this._onDrag = onDrag;\r\n\r\n this.root = LX.makeElement( 'div', `lexcodescrollbar hidden ${vertical ? 'vertical' : 'horizontal'}` );\r\n\r\n this.thumb = LX.makeElement( 'div' );\r\n this.thumb.addEventListener( 'mousedown', ( e: MouseEvent ) => this._onMouseDown( e ) );\r\n this.root.appendChild( this.thumb );\r\n }\r\n\r\n setThumbRatio( ratio: number ): void\r\n {\r\n this._thumbRatio = LX.clamp( ratio, 0, 1 );\r\n const needed = this._thumbRatio < 1;\r\n this.root.classList.toggle( 'hidden', !needed );\r\n\r\n if ( needed )\r\n {\r\n if ( this._vertical )\r\n this.thumb.style.height = ( this._thumbRatio * 100 ) + '%';\r\n else\r\n this.thumb.style.width = ( this._thumbRatio * 100 ) + '%';\r\n }\r\n }\r\n\r\n syncToScroll( scrollPos: number, scrollMax: number ): void\r\n {\r\n if ( scrollMax <= 0 ) return;\r\n const trackSize = this._vertical ? this.root.offsetHeight : this.root.offsetWidth;\r\n const thumbSize = this._vertical ? this.thumb.offsetHeight : this.thumb.offsetWidth;\r\n const available = trackSize - thumbSize;\r\n if ( available <= 0 ) return;\r\n\r\n this._thumbPos = ( scrollPos / scrollMax ) * available;\r\n this._applyPosition();\r\n }\r\n\r\n applyDragDelta( delta: number, scrollMax: number ): number\r\n {\r\n const trackSize = this._vertical ? this.root.offsetHeight : this.root.offsetWidth;\r\n const thumbSize = this._vertical ? this.thumb.offsetHeight : this.thumb.offsetWidth;\r\n const available = trackSize - thumbSize;\r\n if ( available <= 0 ) return 0;\r\n\r\n this._thumbPos = LX.clamp( this._thumbPos + delta, 0, available );\r\n this._applyPosition();\r\n\r\n return ( this._thumbPos / available ) * scrollMax;\r\n }\r\n\r\n private _applyPosition(): void\r\n {\r\n if ( this._vertical )\r\n this.thumb.style.top = this._thumbPos + 'px';\r\n else\r\n this.thumb.style.left = this._thumbPos + 'px';\r\n }\r\n\r\n private _onMouseDown( e: MouseEvent ): void\r\n {\r\n const doc = document;\r\n this._lastMouse = this._vertical ? e.clientY : e.clientX;\r\n\r\n const onMouseMove = ( e: MouseEvent ) =>\r\n {\r\n const current = this._vertical ? e.clientY : e.clientX;\r\n const delta = current - this._lastMouse;\r\n this._lastMouse = current;\r\n this._onDrag?.( delta );\r\n e.stopPropagation();\r\n e.preventDefault();\r\n };\r\n\r\n const onMouseUp = () =>\r\n {\r\n doc.removeEventListener( 'mousemove', onMouseMove );\r\n doc.removeEventListener( 'mouseup', onMouseUp );\r\n };\r\n\r\n doc.addEventListener( 'mousemove', onMouseMove );\r\n doc.addEventListener( 'mouseup', onMouseUp );\r\n e.stopPropagation();\r\n e.preventDefault();\r\n }\r\n}\r\n\r\n/**\r\n * @class CodeEditor\r\n * The main editor class. Wires Document, Tokenizer, CursorSet, UndoManager\r\n * together with the DOM.\r\n */\r\nexport class CodeEditor\r\n{\r\n static __instances: CodeEditor[] = [];\r\n\r\n language: LanguageDef;\r\n symbolTable: SymbolTable;\r\n\r\n // DOM:\r\n area: typeof Area;\r\n baseArea: typeof Area;\r\n codeArea: typeof Area;\r\n explorerArea: typeof Area;\r\n tabs: typeof Tabs;\r\n root: HTMLElement;\r\n codeScroller: HTMLElement;\r\n codeSizer: HTMLElement;\r\n cursorsLayer: HTMLElement;\r\n selectionsLayer: HTMLElement;\r\n lineGutter: HTMLElement;\r\n vScrollbar!: ScrollBar;\r\n hScrollbar!: ScrollBar;\r\n searchBox: HTMLElement | null = null;\r\n searchLineBox: HTMLElement | null = null;\r\n autocomplete: HTMLElement | null = null;\r\n currentTab: CodeTab | null = null;\r\n statusPanel: typeof Panel;\r\n leftStatusPanel: typeof Panel;\r\n rightStatusPanel: typeof Panel;\r\n explorer: typeof NodeTree | null = null;\r\n\r\n // Measurements:\r\n charWidth: number = 0;\r\n lineHeight: number = 0;\r\n fontSize: number = 0;\r\n xPadding: number = 64; // 4rem left padding in pixels\r\n private _cachedTabsHeight: number = 0;\r\n private _cachedStatusPanelHeight: number = 0;\r\n\r\n // Editor options:\r\n skipInfo: boolean = false;\r\n disableEdition: boolean = false;\r\n skipTabs: boolean = false;\r\n useFileExplorer: boolean = false;\r\n useAutoComplete: boolean = true;\r\n allowAddScripts: boolean = true;\r\n allowClosingTabs: boolean = true;\r\n allowLoadingFiles: boolean = true;\r\n tabSize: number = 4;\r\n highlight: string = 'Plain Text';\r\n newTabOptions: any[] | null = null;\r\n customSuggestions: CodeSuggestion[] = [];\r\n explorerName: string = 'EXPLORER';\r\n\r\n // Editor callbacks:\r\n onSave: ( text: string, editor: CodeEditor ) => void;\r\n onRun: ( text: string, editor: CodeEditor ) => void;\r\n onCtrlSpace: ( text: string, editor: CodeEditor ) => void;\r\n onCreateStatusPanel: ( panel: typeof Panel, editor: CodeEditor ) => void;\r\n onContextMenu: any;\r\n onNewTab: ( event: MouseEvent ) => void;\r\n onSelectTab: ( name: string, editor: CodeEditor ) => void;\r\n onReady: ( ( editor: CodeEditor ) => void ) | undefined;\r\n onCreateFile: ( ( editor: CodeEditor ) => void ) | undefined;\r\n onCodeChange: ( ( doc: CodeDocument ) => void ) | undefined;\r\n onHoverSymbol: ( ( info: HoverSymbolInfo, editor: CodeEditor ) => string | HTMLElement | null | undefined ) | undefined;\r\n\r\n private _inputArea!: HTMLTextAreaElement;\r\n\r\n // State:\r\n private _lineStates: TokenizerState[] = []; // tokenizer state at end of each line\r\n private _lineElements: HTMLElement[] = []; // <pre> element per line\r\n private _bracketOpenLine: number = -1; // line of the { opening current scope\r\n private _bracketCloseLine: number = -1; // line of the } closing current scope\r\n private _hoverTimer: ReturnType<typeof setTimeout> | null = null;\r\n private _hoverPopup: HTMLElement | null = null;\r\n private _hoverWord: string = '';\r\n private _colorPopover: any = null; // active color picker popover\r\n private _openedTabs: Record<string, CodeTab> = {};\r\n private _loadedTabs: Record<string, CodeTab> = {};\r\n private _storedTabs: Record<string, any> = {};\r\n private _focused: boolean = false;\r\n private _composing: boolean = false;\r\n private _keyChain: string | null = null;\r\n private _wasPaired: boolean = false;\r\n private _lastAction: string = '';\r\n private _blinkerInterval: ReturnType<typeof setInterval> | null = null;\r\n private _cursorVisible: boolean = true;\r\n private _cursorBlinkRate: number = 550;\r\n private _clickCount: number = 0;\r\n private _lastClickTime: number = 0;\r\n private _lastClickLine: number = -1;\r\n private _isSearchBoxActive: boolean = false;\r\n private _isSearchLineBoxActive: boolean = false;\r\n private _searchMatchCase: boolean = false;\r\n private _lastTextFound: string = '';\r\n private _lastSearchPos: { line: number, col: number } | null = null;\r\n private _discardScroll: boolean = false;\r\n private _isReady: boolean = false;\r\n private _lastMaxLineLength: number = 0;\r\n private _lastLineCount: number = 0;\r\n private _isAutoCompleteActive: boolean = false;\r\n private _selectedAutocompleteIndex: number = 0;\r\n private _displayObservers: { intersectionObserver: IntersectionObserver, resizeObserver: ResizeObserver } | undefined;\r\n\r\n private static readonly CODE_MIN_FONT_SIZE = 9;\r\n private static readonly CODE_MAX_FONT_SIZE = 22;\r\n private static readonly PAIR_KEYS: Record<string, string> = { '\"': '\"', \"'\": \"'\", '`': '`', '(': ')', '{': '}', '[': ']' };\r\n\r\n get doc(): CodeDocument\r\n {\r\n return this.currentTab!.doc;\r\n }\r\n\r\n get undoManager(): UndoManager\r\n {\r\n return this.currentTab!.undoManager;\r\n }\r\n\r\n get cursorSet(): CursorSet\r\n {\r\n return this.currentTab!.cursorSet;\r\n }\r\n\r\n get codeContainer(): HTMLElement\r\n {\r\n return this.currentTab!.dom;\r\n }\r\n\r\n static getInstances()\r\n {\r\n return CodeEditor.__instances;\r\n }\r\n\r\n constructor( area: typeof Area, options: Record<string, any> = {} )\r\n {\r\n g.editor = this;\r\n\r\n CodeEditor.__instances.push( this );\r\n\r\n this.skipInfo = options.skipInfo ?? this.skipInfo;\r\n this.disableEdition = options.disableEdition ?? this.disableEdition;\r\n this.skipTabs = options.skipTabs ?? this.skipTabs;\r\n this.useFileExplorer = ( options.fileExplorer ?? this.useFileExplorer ) && !this.skipTabs;\r\n this.useAutoComplete = options.autocomplete ?? this.useAutoComplete;\r\n this.allowAddScripts = options.allowAddScripts ?? this.allowAddScripts;\r\n this.allowClosingTabs = options.allowClosingTabs ?? this.allowClosingTabs;\r\n this.allowLoadingFiles = options.allowLoadingFiles ?? this.allowLoadingFiles;\r\n this.highlight = options.highlight ?? this.highlight;\r\n this.newTabOptions = options.newTabOptions;\r\n this.customSuggestions = options.customSuggestions ?? [];\r\n this.explorerName = options.explorerName ?? this.explorerName;\r\n\r\n // Editor callbacks\r\n this.onSave = options.onSave;\r\n this.onRun = options.onRun;\r\n this.onCtrlSpace = options.onCtrlSpace;\r\n this.onCreateStatusPanel = options.onCreateStatusPanel;\r\n this.onContextMenu = options.onContextMenu;\r\n this.onNewTab = options.onNewTab;\r\n this.onSelectTab = options.onSelectTab;\r\n this.onReady = options.onReady;\r\n this.onCodeChange = options.onCodeChange;\r\n this.onHoverSymbol = options.onHoverSymbol;\r\n\r\n this.language = Tokenizer.getLanguage( this.highlight ) ?? Tokenizer.getLanguage( 'Plain Text' )!;\r\n this.symbolTable = new SymbolTable();\r\n\r\n // File explorer\r\n if ( this.useFileExplorer )\r\n {\r\n let [ explorerArea, editorArea ] = area.split( { sizes: [ '15%', '85%' ] } );\r\n // explorerArea.setLimitBox( 180, 20, 512 );\r\n this.explorerArea = explorerArea;\r\n\r\n let panel = new LX.Panel();\r\n\r\n panel.addTitle( this.explorerName );\r\n\r\n let sceneData: any[] = [];\r\n\r\n this.explorer = panel.addTree( null, sceneData, {\r\n filter: false,\r\n rename: false,\r\n skipDefaultIcon: true\r\n } );\r\n\r\n this.explorer.on( 'dblClick', ( event: any ) => {\r\n const node = event.items[0];\r\n const name = node.id;\r\n this.loadTab( name );\r\n } );\r\n\r\n this.explorer.on( 'beforeDelete', ( event: any, resolve: Function ) => {\r\n return;\r\n } );\r\n\r\n explorerArea.attach( panel );\r\n\r\n // Update area\r\n area = editorArea;\r\n }\r\n\r\n // Full editor\r\n area.root.className = LX.mergeClass( area.root.className, 'codebasearea overflow-hidden flex relative' );\r\n\r\n this.baseArea = area;\r\n this.area = new LX.Area( {\r\n className: 'lexcodeeditor flex flex-col outline-none overflow-hidden size-full select-none bg-inherit relative',\r\n skipAppend: true\r\n } );\r\n\r\n const codeAreaClassName = 'lexcodearea scrollbar-hidden flex flex-row flex-auto-fill';\r\n\r\n if ( !this.skipTabs )\r\n {\r\n this.tabs = this.area.addTabs( { contentClass: codeAreaClassName, onclose: ( name: string ) => {\r\n // this.closeTab triggers this onclose!\r\n delete this._openedTabs[name];\r\n } } );\r\n\r\n LX.addClass( this.tabs.root.parentElement, 'rounded-t-lg' );\r\n\r\n if ( !this.disableEdition )\r\n {\r\n this.tabs.root.parentElement.addEventListener( 'dblclick', ( e: MouseEvent ) => {\r\n if ( !this.allowAddScripts ) return;\r\n e.preventDefault();\r\n this._onCreateNewFile();\r\n } );\r\n }\r\n\r\n this.codeArea = this.tabs.area;\r\n }\r\n else\r\n {\r\n this.codeArea = new LX.Area( { className: codeAreaClassName, skipAppend: true } );\r\n this.area.attach( this.codeArea );\r\n }\r\n\r\n this.root = this.area.root;\r\n area.attach( this.root );\r\n\r\n this.codeScroller = this.codeArea.root;\r\n // Add Line numbers gutter, only the container, line numbers are in the same line div\r\n this.lineGutter = LX.makeElement( 'div', `w-16 overflow-hidden absolute top-0 bg-inherit z-10 ${this.skipTabs ? '' : 'mt-8'}`, null, this.codeScroller );\r\n // Add code sizer, which will have the code elements\r\n this.codeSizer = LX.makeElement( 'div', 'pseudoparent-tabs w-full', null, this.codeScroller );\r\n\r\n // Cursors and selections\r\n this.cursorsLayer = LX.makeElement( 'div', 'cursors', null, this.codeSizer );\r\n this.selectionsLayer = LX.makeElement( 'div', 'selections', null, this.codeSizer );\r\n\r\n // Custom scrollbars\r\n if ( !this.disableEdition )\r\n {\r\n this.vScrollbar = new ScrollBar( true, ( delta ) => {\r\n const scrollMax = this.codeScroller.scrollHeight - this.codeScroller.clientHeight;\r\n this.codeScroller.scrollTop = this.vScrollbar.applyDragDelta( delta, scrollMax );\r\n this._discardScroll = true;\r\n } );\r\n this.root.appendChild( this.vScrollbar.root );\r\n\r\n this.hScrollbar = new ScrollBar( false, ( delta ) => {\r\n const scrollMax = this.codeScroller.scrollWidth - this.codeScroller.clientWidth;\r\n this.codeScroller.scrollLeft = this.hScrollbar.applyDragDelta( delta, scrollMax );\r\n this._discardScroll = true;\r\n } );\r\n this.root.appendChild( this.hScrollbar.root );\r\n\r\n // Sync scrollbar thumbs on native scroll\r\n this.codeScroller.addEventListener( 'scroll', () => {\r\n if ( this._discardScroll )\r\n {\r\n this._discardScroll = false;\r\n return;\r\n }\r\n this._syncScrollBars();\r\n } );\r\n\r\n // Touch events for native scrolling on mobile\r\n let touchStartX = 0;\r\n let touchStartY = 0;\r\n\r\n this.codeScroller.addEventListener( 'touchstart', ( e: TouchEvent ) => {\r\n touchStartX = e.touches[0].clientX;\r\n touchStartY = e.touches[0].clientY;\r\n }, { passive: true } );\r\n\r\n this.codeScroller.addEventListener( 'touchmove', ( e: TouchEvent ) => {\r\n const touchX = e.touches[0].clientX;\r\n const touchY = e.touches[0].clientY;\r\n\r\n const deltaX = touchStartX - touchX;\r\n const deltaY = touchStartY - touchY;\r\n\r\n this.codeScroller.scrollLeft += deltaX;\r\n this.codeScroller.scrollTop += deltaY;\r\n\r\n touchStartX = touchX;\r\n touchStartY = touchY;\r\n }, { passive: true } );\r\n\r\n // Wheel: Ctrl+Wheel for font zoom, Shift+Wheel for horizontal scroll\r\n this.codeScroller.addEventListener( 'wheel', ( e: WheelEvent ) => {\r\n if ( e.ctrlKey )\r\n {\r\n e.preventDefault();\r\n this._applyFontSizeOffset( e.deltaY < 0 ? 1 : -1 );\r\n return;\r\n }\r\n\r\n if ( e.shiftKey )\r\n {\r\n this.codeScroller.scrollLeft += e.deltaY > 0 ? 10 : -10;\r\n }\r\n }, { passive: false } );\r\n }\r\n\r\n // Resize observer\r\n const codeResizeObserver = new ResizeObserver( () => {\r\n if ( !this.currentTab ) return;\r\n this.resize( true );\r\n } );\r\n codeResizeObserver.observe( this.codeArea.root );\r\n\r\n if ( !this.disableEdition )\r\n {\r\n // Add autocomplete box\r\n if( this.useAutoComplete )\r\n {\r\n this.autocomplete = LX.makeElement( 'div','autocomplete' );\r\n this.codeArea.attach( this.autocomplete );\r\n }\r\n\r\n const searchBoxClass = 'searchbox bg-card min-w-96 absolute z-100 top-8 right-2 rounded-lg border-color overflow-y-scroll opacity-0';\r\n\r\n // Add search box\r\n {\r\n const box = LX.makeElement( 'div', searchBoxClass, null, this.codeArea );\r\n const searchPanel = new LX.Panel();\r\n box.appendChild( searchPanel.root );\r\n\r\n searchPanel.sameLine();\r\n const textComponent = searchPanel.addText( null, '', null, { placeholder: 'Find', inputClass: 'bg-secondary' } );\r\n searchPanel.addButton( null, 'MatchCaseButton', ( v: boolean ) => {\r\n this._searchMatchCase = v;\r\n this._doSearch();\r\n }, { icon: 'CaseSensitive', selectable: true, buttonClass: 'link', title: 'Match Case',\r\n tooltip: true } );\r\n searchPanel.addButton( null, 'up', () => this._doSearch( null, true ), { icon: 'ArrowUp', buttonClass: 'ghost', title: 'Previous Match',\r\n tooltip: true } );\r\n searchPanel.addButton( null, 'down', () => this._doSearch(), { icon: 'ArrowDown', buttonClass: 'ghost', title: 'Next Match',\r\n tooltip: true } );\r\n searchPanel.addButton( null, 'x', this._doHideSearch.bind( this ), { icon: 'X', buttonClass: 'ghost', title: 'Close',\r\n tooltip: true } );\r\n searchPanel.endLine();\r\n\r\n const searchInput = textComponent.root.querySelector( 'input' );\r\n searchInput?.addEventListener( 'keyup', ( e: KeyboardEvent ) => {\r\n if ( e.key == 'Escape' ) this._doHideSearch();\r\n else if ( e.key == 'Enter' ) this._doSearch( ( e.target as HTMLInputElement ).value, !!e.shiftKey );\r\n } );\r\n\r\n this.searchBox = box;\r\n }\r\n\r\n // Add search LINE box\r\n {\r\n const box = LX.makeElement( 'div', searchBoxClass, null, this.codeArea );\r\n const searchPanel = new LX.Panel();\r\n box.appendChild( searchPanel.root );\r\n\r\n searchPanel.sameLine();\r\n const textComponent = searchPanel.addText( null, '', ( value: string ) => {\r\n searchInput.value = ':' + value.replaceAll( ':', '' );\r\n this._doGotoLine( parseInt( searchInput.value.slice( 1 ) ) );\r\n }, { className: 'flex-auto-fill', placeholder: 'Go to line', trigger: 'input' } );\r\n searchPanel.addButton( null, 'x', this._doHideSearch.bind( this ), { icon: 'X', title: 'Close', buttonClass: 'ghost',\r\n tooltip: true } );\r\n searchPanel.endLine();\r\n\r\n const searchInput = textComponent.root.querySelector( 'input' );\r\n searchInput.addEventListener( 'keyup', ( e: KeyboardEvent ) => {\r\n if ( e.key == 'Escape' ) this._doHideSearch();\r\n } );\r\n\r\n searchPanel.addText( null, 'Type a line number to go to (from 0 to 0).', null,\r\n { disabled: true, inputClass: 'text-xs bg-none', signal: '@line-number-range' } );\r\n\r\n this.searchLineBox = box;\r\n }\r\n }\r\n\r\n // Hidden textarea for capturing keyboard input (dead keys, IME, etc.)\r\n this._inputArea = LX.makeElement( 'textarea', 'absolute opacity-0 w-[1px] h-[1px] top-0 left-0 overflow-hidden resize-none', '', this.root );\r\n this._inputArea.setAttribute( 'autocorrect', 'off' );\r\n this._inputArea.setAttribute( 'autocapitalize', 'off' );\r\n this._inputArea.setAttribute( 'spellcheck', 'false' );\r\n this._inputArea.tabIndex = 0;\r\n\r\n // Events:\r\n this._inputArea.addEventListener( 'keydown', this._onKeyDown.bind( this ) );\r\n this._inputArea.addEventListener( 'compositionstart', () => this._composing = true );\r\n this._inputArea.addEventListener( 'compositionend', ( e: CompositionEvent ) => {\r\n this._composing = false;\r\n this._inputArea.value = '';\r\n if ( e.data ) this._doInsertChar( e.data );\r\n } );\r\n this._inputArea.addEventListener( 'input', () => {\r\n if ( this._composing ) return;\r\n const val = this._inputArea.value;\r\n if ( val )\r\n {\r\n this._inputArea.value = '';\r\n this._doInsertChar( val );\r\n }\r\n } );\r\n this._inputArea.addEventListener( 'focus', () => this._setFocused( true ) );\r\n this._inputArea.addEventListener( 'blur', () => this._setFocused( false ) );\r\n this.codeArea.root.addEventListener( 'mousedown', this._onMouseDown.bind( this ) );\r\n this.codeArea.root.addEventListener( 'contextmenu', this._onMouseDown.bind( this ) );\r\n\r\n this.codeArea.root.addEventListener( 'mouseover', ( e: MouseEvent ) => {\r\n const link = ( e.target as HTMLElement ).closest( '.code-link' ) as HTMLElement | null;\r\n if ( link && e.ctrlKey ) link.classList.add( 'hovered' );\r\n } );\r\n this.codeArea.root.addEventListener( 'mouseout', ( e: MouseEvent ) => {\r\n const link = ( e.target as HTMLElement ).closest( '.code-link' ) as HTMLElement | null;\r\n if ( link ) link.classList.remove( 'hovered' );\r\n } );\r\n this.codeArea.root.addEventListener( 'mousemove', ( e: MouseEvent ) => {\r\n const link = ( e.target as HTMLElement ).closest( '.code-link' ) as HTMLElement | null;\r\n if ( link ) link.classList.toggle( 'hovered', e.ctrlKey );\r\n this._onCodeAreaMouseMove( e );\r\n } );\r\n this.codeArea.root.addEventListener( 'mouseleave', () => {\r\n this._clearHoverPopup();\r\n } );\r\n this.codeArea.root.addEventListener( 'click', ( e: MouseEvent ) => {\r\n this._onColorSwatchClick( e );\r\n } );\r\n\r\n // Bottom status panel\r\n this.statusPanel = this._createStatusPanel( options );\r\n if ( this.statusPanel )\r\n {\r\n // Don't do this.area.attach here, since it will append to the tabs area.\r\n this.area.root.appendChild( this.statusPanel.root );\r\n }\r\n\r\n if ( this.allowAddScripts )\r\n {\r\n this.onCreateFile = options.onCreateFile;\r\n this.addTab( '+', {\r\n selected: false,\r\n title: 'Create file'\r\n } );\r\n }\r\n\r\n // Starter code tab container\r\n if( options.defaultTab ?? true )\r\n {\r\n this.addTab( options.name || 'untitled', {\r\n language: this.highlight,\r\n title: options.title\r\n } );\r\n\r\n // Initial render\r\n this._renderAllLines();\r\n this._renderCursors();\r\n }\r\n \r\n this._init();\r\n }\r\n\r\n private _init()\r\n {\r\n if ( this._displayObservers ) return;\r\n\r\n this._isReady = false;\r\n\r\n const root = this.root;\r\n\r\n const _isVisible = () => {\r\n return (\r\n root.offsetParent !== null\r\n && root.clientWidth > 0\r\n && root.clientHeight > 0\r\n );\r\n };\r\n\r\n const _tryPrepare = async () => {\r\n if ( this._isReady ) return;\r\n if ( !_isVisible() ) return;\r\n\r\n // Stop observing once prepared\r\n intersectionObserver.disconnect();\r\n resizeObserver.disconnect();\r\n\r\n await this._setupEditorWhenVisible();\r\n };\r\n\r\n // IntersectionObserver (for viewport)\r\n const intersectionObserver = new IntersectionObserver( ( entries ) => {\r\n for ( const entry of entries )\r\n {\r\n if ( entry.isIntersecting )\r\n {\r\n _tryPrepare();\r\n }\r\n }\r\n } );\r\n intersectionObserver.observe( root );\r\n\r\n // ResizeObserver (for display property changes)\r\n const resizeObserver = new ResizeObserver( () => {\r\n _tryPrepare();\r\n } );\r\n resizeObserver.observe( root );\r\n\r\n // Fallback polling (don't use it for now)\r\n // const interval = setInterval( () => {\r\n // if ( this._isReady ) {\r\n // clearInterval( interval );\r\n // return;\r\n // }\r\n // _tryPrepare();\r\n // }, 250 );\r\n\r\n this._displayObservers = {\r\n intersectionObserver,\r\n resizeObserver\r\n // interval,\r\n };\r\n }\r\n\r\n clear()\r\n {\r\n console.assert( this.rightStatusPanel && this.leftStatusPanel, 'No panels to clear.' );\r\n this.rightStatusPanel.clear();\r\n this.leftStatusPanel.clear();\r\n }\r\n\r\n addExplorerItem( item: any )\r\n {\r\n if ( !this.explorer )\r\n {\r\n return;\r\n }\r\n\r\n if ( !this.explorer.innerTree.data.find( ( value: any, index: number ) => value.id === item.id ) )\r\n {\r\n this.explorer.innerTree.data.push( item );\r\n }\r\n };\r\n\r\n setText( text: string, language?: string, detectLang: boolean = false ): void\r\n {\r\n if( !this.currentTab ) return;\r\n\r\n this.doc.setText( this._normalizeText( text ) );\r\n this.cursorSet.set( 0, 0 );\r\n this.undoManager.clear();\r\n this._lineStates = [];\r\n\r\n if ( language )\r\n {\r\n this.setLanguage( language );\r\n }\r\n else if ( detectLang )\r\n {\r\n const detected = this._detectLanguage( text );\r\n if ( detected ) this.setLanguage( detected );\r\n }\r\n\r\n this._renderAllLines();\r\n this._renderCursors();\r\n this._renderSelections();\r\n this.resize( true );\r\n }\r\n\r\n private _detectLanguage( text: string ): string | null\r\n {\r\n const scores: Record<string, number> = {};\r\n const add = ( lang: string, pts: number ) => { scores[lang] = ( scores[lang] ?? 0 ) + pts; };\r\n\r\n // Score using reservedWords from each registered language\r\n const textWords = new Set( text.match( /\\b\\w+\\b/g ) ?? [] );\r\n const totalWords = Math.max( textWords.size, 1 );\r\n for ( const langName of Tokenizer.getRegisteredLanguages() )\r\n {\r\n const langDef = Tokenizer.getLanguage( langName );\r\n if ( !langDef?.reservedWords?.length ) continue;\r\n let hits = 0;\r\n for ( const word of langDef.reservedWords )\r\n {\r\n if ( textWords.has( word ) ) hits++;\r\n }\r\n if ( hits > 0 )\r\n {\r\n const vocabRatio = hits / langDef.reservedWords.length;\r\n const textRatio = hits / totalWords;\r\n add( langName, Math.round( ( vocabRatio + textRatio ) * 40 ) );\r\n }\r\n }\r\n\r\n // Add scores based on \"important\" structural words only\r\n\r\n // HTML\r\n if ( /<!DOCTYPE\\s+html/i.test( text ) ) add( 'HTML', 20 );\r\n if ( /<html[\\s>]/i.test( text ) ) add( 'HTML', 15 );\r\n if ( /<\\/?(div|span|body|head|script|style|meta)\\b/i.test( text ) ) add( 'HTML', 8 );\r\n\r\n // JSON — must come before JS checks (starts with { or [)\r\n if ( /^\\s*[\\[{]/.test( text ) && /\"\\s*:\\s*/.test( text ) && !/function|=>|const|var|let/.test( text ) )\r\n add( 'JSON', 15 );\r\n\r\n // CSS\r\n if ( /[\\w-]+\\s*:\\s*[\\w#\\d\"'(]+.*;/.test( text ) && /[{}]/.test( text ) && !/<\\w+/.test( text ) )\r\n add( 'CSS', 10 );\r\n if ( /@(media|keyframes|import|charset|font-face)\\b/.test( text ) ) add( 'CSS', 15 );\r\n\r\n // WGSL\r\n if ( /@(vertex|fragment|compute|group|binding|builtin)\\b/.test( text ) ) add( 'WGSL', 20 );\r\n if ( /\\bfn\\s+\\w+\\s*\\(/.test( text ) && /\\bvar\\b/.test( text ) ) add( 'WGSL', 10 );\r\n if ( /\\b(vec2f|vec3f|vec4f|mat4x4f|f32|u32|i32)\\b/.test( text ) ) add( 'WGSL', 12 );\r\n\r\n // GLSL\r\n if ( /\\b(gl_Position|gl_FragColor|gl_FragCoord)\\b/.test( text ) ) add( 'GLSL', 20 );\r\n if ( /\\b(uniform|varying|attribute)\\s+\\w/.test( text ) ) add( 'GLSL', 10 );\r\n if ( /\\b(vec2|vec3|vec4|mat4|sampler2D)\\b/.test( text ) && !/vec2f|vec3f/.test( text ) )\r\n add( 'GLSL', 8 );\r\n\r\n // HLSL\r\n if ( /\\b(SV_Position|SV_Target|SV_Depth)\\b/.test( text ) ) add( 'HLSL', 20 );\r\n if ( /\\b(cbuffer|tbuffer|float4|float3|float2|Texture2D)\\b/.test( text ) ) add( 'HLSL', 12 );\r\n\r\n // Python\r\n if ( /^\\s*def\\s+\\w+\\s*\\(/m.test( text ) ) add( 'Python', 15 );\r\n if ( /^\\s*import\\s+\\w/m.test( text ) && !/\\bfrom\\s+['\"]/.test( text ) ) add( 'Python', 8 );\r\n if ( /^\\s*class\\s+\\w+(\\s*\\(.*\\))?:/m.test( text ) ) add( 'Python', 10 );\r\n if ( /\\bprint\\s*\\(/.test( text ) && /:\\s*$/.test( text ) ) add( 'Python', 5 );\r\n if ( /elif\\b|lambda\\b|self\\.\\w/.test( text ) ) add( 'Python', 8 );\r\n\r\n // Rust\r\n if ( /\\bfn\\s+\\w+\\s*\\(/.test( text ) && /\\blet\\s+mut\\b/.test( text ) ) add( 'Rust', 15 );\r\n if ( /\\b(impl|trait|enum|struct)\\s+\\w+/.test( text ) && /\\bfn\\b/.test( text ) )\r\n add( 'Rust', 12 );\r\n if ( /use\\s+std::|use\\s+\\w+::\\w+/.test( text ) ) add( 'Rust', 10 );\r\n if ( /println!\\s*\\(/.test( text ) ) add( 'Rust', 8 );\r\n\r\n // C++\r\n if ( /#include\\s*<[\\w./]+>/.test( text ) ) add( 'C++', 15 );\r\n if ( /\\bstd::\\w+/.test( text ) ) add( 'C++', 12 );\r\n if ( /\\b(class|template|namespace|nullptr|new\\s+\\w)\\b/.test( text ) ) add( 'C++', 8 );\r\n if ( /(::|->)\\w+/.test( text ) ) add( 'C++', 6 );\r\n\r\n // C\r\n if ( /#include\\s*<[\\w.]+\\.h>/.test( text ) ) add( 'C', 12 );\r\n if ( /\\bint\\s+main\\s*\\(/.test( text ) ) add( 'C', 15 );\r\n if ( /\\b(printf|scanf|malloc|free|sizeof)\\s*\\(/.test( text ) ) add( 'C', 10 );\r\n\r\n // TypeScript — before JS (is a superset)\r\n if ( /:\\s*(string|number|boolean|void|any|never|unknown)\\b/.test( text ) ) add( 'TypeScript', 12 );\r\n if ( /\\binterface\\s+\\w+/.test( text ) ) add( 'TypeScript', 12 );\r\n if ( /\\btype\\s+\\w+\\s*=/.test( text ) ) add( 'TypeScript', 10 );\r\n if ( /\\bas\\s+(string|number|any|unknown)\\b/.test( text ) ) add( 'TypeScript', 8 );\r\n if ( /\\benum\\s+\\w+\\s*\\{/.test( text ) ) add( 'TypeScript', 8 );\r\n\r\n // JavaScript\r\n if ( /\\b(const|let|var)\\s+\\w+\\s*=/.test( text ) ) add( 'JavaScript', 8 );\r\n if ( /=>\\s*[\\w{(]/.test( text ) ) add( 'JavaScript', 6 );\r\n if ( /\\b(import|export)\\s+(default|{|\\*)/.test( text ) ) add( 'JavaScript', 8 );\r\n if ( /\\bconsole\\.(log|warn|error)\\b/.test( text ) ) add( 'JavaScript', 6 );\r\n\r\n // Markdown\r\n if ( /^#{1,6}\\s+\\S/m.test( text ) ) add( 'Markdown', 12 );\r\n if ( /\\*\\*\\w.*?\\*\\*/.test( text ) || /\\[.+\\]\\(.+\\)/.test( text ) ) add( 'Markdown', 8 );\r\n if ( /^```\\w*/m.test( text ) ) add( 'Markdown', 10 );\r\n\r\n const best = Object.entries( scores ).sort( ( a, b ) => b[1] - a[1] )[0];\r\n return best && best[1] >= 8 ? best[0] : null;\r\n }\r\n\r\n appendText( text: string ): void\r\n {\r\n const cursor = this.cursorSet.getPrimary();\r\n const { line, col } = cursor.head;\r\n\r\n const op = this.doc.insert( line, col, text );\r\n this.undoManager.record( op, this.cursorSet.getCursorPositions() );\r\n\r\n // Move cursor to end of inserted text\r\n const lines = text.split( /\\r?\\n/ );\r\n if ( lines.length === 1 )\r\n {\r\n cursor.head = { line, col: col + text.length };\r\n }\r\n else\r\n {\r\n cursor.head = { line: line + lines.length - 1, col: lines[ lines.length - 1 ].length };\r\n }\r\n cursor.anchor = { ...cursor.head };\r\n\r\n this._rebuildLines();\r\n this._renderCursors();\r\n this._renderSelections();\r\n this.resize();\r\n this._scrollCursorIntoView();\r\n }\r\n\r\n getText(): string\r\n {\r\n return this.doc.getText();\r\n }\r\n\r\n setLanguage( name: string, extension?: string ): void\r\n {\r\n const lang = Tokenizer.getLanguage( name );\r\n if ( !lang ) return;\r\n\r\n this.language = lang;\r\n\r\n if ( this.currentTab )\r\n {\r\n this.currentTab.language = name;\r\n\r\n if( !this.skipTabs )\r\n {\r\n this.tabs.setIcon( this.currentTab.name, getLanguageIcon( lang, extension ) );\r\n }\r\n }\r\n\r\n this._lineStates = [];\r\n this._renderAllLines();\r\n LX.emitSignal( '@highlight', name );\r\n }\r\n\r\n focus(): void\r\n {\r\n this._inputArea.focus();\r\n }\r\n\r\n addTab( name: string, options: Record<string, any> = {} ): CodeTab\r\n {\r\n const isNewTabButton = name === '+';\r\n const dom = LX.makeElement( 'div', 'code' );\r\n const langName = options.language ?? 'Plain Text';\r\n const langDef = Tokenizer.getLanguage( langName );\r\n const extension = LX.getExtension( name );\r\n const icon = isNewTabButton ? null : getLanguageIcon( langDef, extension );\r\n const selected = options.selected ?? true;\r\n\r\n const codeTab : CodeTab = {\r\n name,\r\n dom,\r\n doc: new CodeDocument( this.onCodeChange ),\r\n cursorSet: new CursorSet(),\r\n undoManager: new UndoManager(),\r\n language: langName,\r\n title: options.title ?? name\r\n };\r\n \r\n this._openedTabs[name] = codeTab;\r\n this._loadedTabs[name] = codeTab;\r\n\r\n if ( this.useFileExplorer && !isNewTabButton )\r\n {\r\n this.addExplorerItem( { id: name, skipVisibility: true, icon } );\r\n this.explorer.innerTree.frefresh( name );\r\n }\r\n\r\n if( !this.skipTabs )\r\n {\r\n this.tabs.add( name, dom, {\r\n selected,\r\n icon,\r\n fixed: isNewTabButton,\r\n title: codeTab.title,\r\n onSelect: this._onSelectTab.bind( this, isNewTabButton ),\r\n onContextMenu: this._onContextMenuTab.bind( this, isNewTabButton ),\r\n allowDelete: this.allowClosingTabs,\r\n indexOffset: options.indexOffset\r\n } );\r\n }\r\n\r\n // Move into the sizer..\r\n this.codeSizer.appendChild( dom );\r\n\r\n if( options.text )\r\n {\r\n codeTab.doc.setText( options.text );\r\n codeTab.cursorSet.set( 0, 0 );\r\n codeTab.undoManager.clear();\r\n this._renderAllLines();\r\n this._renderCursors();\r\n this._renderSelections();\r\n this._resetGutter();\r\n }\r\n\r\n if ( selected )\r\n {\r\n this.currentTab = codeTab;\r\n this._updateDataInfoPanel( '@tab-name', name );\r\n this.setLanguage( langName, extension );\r\n }\r\n\r\n return codeTab;\r\n }\r\n\r\n loadTab( name: string )\r\n {\r\n if ( this._openedTabs[name] )\r\n {\r\n this.tabs.select( name );\r\n return;\r\n }\r\n\r\n const tab = this._loadedTabs[name];\r\n if( tab )\r\n {\r\n this._openedTabs[name] = tab;\r\n\r\n this.tabs.add( name, tab.dom, {\r\n selected: true,\r\n // icon,\r\n title: tab.title,\r\n onSelect: this._onSelectTab.bind( this ),\r\n onContextMenu: this._onContextMenuTab.bind( this ),\r\n allowDelete: this.allowClosingTabs\r\n } );\r\n\r\n // Move into the sizer..\r\n this.codeSizer.appendChild( tab.dom );\r\n\r\n this.currentTab = tab;\r\n this._updateDataInfoPanel( '@tab-name', name );\r\n return;\r\n }\r\n \r\n this.addTab( name, this._storedTabs[name] ?? null );\r\n }\r\n\r\n closeTab( name: string )\r\n {\r\n if ( !this.allowClosingTabs ) return;\r\n\r\n this.tabs.delete( name );\r\n const tab = this._openedTabs[name];\r\n if ( tab )\r\n {\r\n tab.dom.remove();\r\n delete this._openedTabs[name];\r\n }\r\n\r\n // If we closed the current tab, switch to the first available\r\n if ( this.currentTab?.name === name )\r\n {\r\n const remaining = Object.keys( this._openedTabs ).filter( k => k !== '+' );\r\n if ( remaining.length > 0 )\r\n {\r\n this.tabs.select( remaining[0] );\r\n }\r\n else\r\n {\r\n this.currentTab = null;\r\n }\r\n }\r\n }\r\n\r\n setCustomSuggestions( suggestions: CodeSuggestion[] | string[] )\r\n {\r\n if( !suggestions || suggestions.constructor !== Array )\r\n {\r\n console.warn( 'suggestions should be an array!' );\r\n return;\r\n }\r\n\r\n this.customSuggestions = ( suggestions as any[] ).map( s =>\r\n typeof s === 'string' ? { label: s } : s as CodeSuggestion\r\n );\r\n }\r\n\r\n loadFile( file: File | string, options: Record<string, any> = {} ): void\r\n {\r\n const onLoad = ( text: string, name: string ) =>\r\n {\r\n text = this._normalizeText( text );\r\n\r\n const ext = LX.getExtension( name );\r\n const lang = options.language ?? ( Tokenizer.getLanguage( options.language )\r\n ?? ( Tokenizer.getLanguageByExtension( ext ) ?? Tokenizer.getLanguage( 'Plain Text' )! ) );\r\n const langName = lang.name;\r\n\r\n if ( this.useFileExplorer || this.skipTabs )\r\n {\r\n this._storedTabs[name] = {\r\n text,\r\n title: options.title ?? name,\r\n language: langName,\r\n ...options\r\n };\r\n\r\n if ( this.useFileExplorer )\r\n {\r\n this.addExplorerItem( { id: name, skipVisibility: true, icon: getLanguageIcon( lang, ext ) } );\r\n this.explorer.innerTree.frefresh( name );\r\n }\r\n }\r\n else\r\n {\r\n this.addTab( name, {\r\n selected: true,\r\n title: options.title ?? name,\r\n language: langName\r\n } );\r\n \r\n this.doc.setText( text );\r\n this.setLanguage( langName, ext );\r\n this.cursorSet.set( 0, 0 );\r\n this.undoManager.clear();\r\n this._renderCursors();\r\n this._renderSelections();\r\n this._resetGutter();\r\n }\r\n\r\n if ( options.callback )\r\n {\r\n options.callback( name, text );\r\n }\r\n };\r\n\r\n if ( typeof file === 'string' )\r\n {\r\n const url = file;\r\n const name = options.filename ?? url.substring( url.lastIndexOf( '/' ) + 1 );\r\n\r\n LX.request( { url, success: ( text: string ) => {\r\n onLoad( text, name );\r\n } } );\r\n }\r\n else\r\n {\r\n const fr = new FileReader();\r\n fr.readAsText( file );\r\n fr.onload = ( e ) => {\r\n const text = ( e.currentTarget as any ).result;\r\n onLoad( text, file.name );\r\n };\r\n }\r\n }\r\n\r\n async loadFiles( files: string[], onComplete?: ( editor: CodeEditor, results: any[], total: number ) => void, async: boolean = false )\r\n {\r\n if ( !files || files.length === 0 )\r\n {\r\n onComplete?.( this, [], 0 );\r\n return;\r\n }\r\n\r\n const results: any[] = [];\r\n\r\n for ( const filePath of files )\r\n {\r\n try\r\n {\r\n const text = await LX.requestFileAsync( filePath, 'text' );\r\n\r\n // Process the loaded file\r\n const name = filePath.substring( filePath.lastIndexOf( '/' ) + 1 );\r\n const processedText = text.replaceAll( '\\r', '' ).replaceAll( /\\t|\\\\t/g, ' '.repeat( this.tabSize ) );\r\n\r\n const ext = LX.getExtension( name );\r\n const lang = Tokenizer.getLanguageByExtension( ext ) ?? Tokenizer.getLanguage( 'Plain Text' )!;\r\n const langName = lang.name;\r\n\r\n if ( this.useFileExplorer || this.skipTabs )\r\n {\r\n this._storedTabs[name] = {\r\n text: processedText,\r\n title: name,\r\n language: langName\r\n };\r\n\r\n if ( this.useFileExplorer )\r\n {\r\n this.addExplorerItem( { id: name, skipVisibility: true, icon: getLanguageIcon( lang, ext ) } );\r\n this.explorer.innerTree.frefresh( name );\r\n }\r\n }\r\n else\r\n {\r\n this.addTab( name, {\r\n selected: results.length === 0, // Select first tab only\r\n title: name,\r\n language: langName\r\n } );\r\n\r\n if ( results.length === 0 )\r\n {\r\n this.doc.setText( processedText );\r\n this.setLanguage( langName, ext );\r\n this.cursorSet.set( 0, 0 );\r\n this.undoManager.clear();\r\n this._renderCursors();\r\n this._renderSelections();\r\n this._resetGutter();\r\n }\r\n }\r\n\r\n results.push( { filePath, name, success: true } );\r\n }\r\n catch ( error )\r\n {\r\n console.error( `[LX.CodeEditor] Failed to load file: ${filePath}`, error );\r\n results.push( { filePath, success: false, error } );\r\n }\r\n }\r\n\r\n onComplete?.( this, results, results.length );\r\n }\r\n\r\n async _setupEditorWhenVisible()\r\n {\r\n // Load any font size from local storage\r\n // If not, use default size and make sure it's sync by not hardcoding a number by default here\r\n const savedFontSize = window.localStorage.getItem( 'lexcodeeditor-font-size' );\r\n if ( savedFontSize )\r\n {\r\n await this._setFontSize( parseInt( savedFontSize ), false );\r\n }\r\n else\r\n {\r\n const r: any = document.querySelector( ':root' );\r\n const s = getComputedStyle( r );\r\n this.fontSize = parseInt( s.getPropertyValue( '--code-editor-font-size' ) );\r\n await this._measureChar();\r\n }\r\n\r\n LX.emitSignal( '@font-size', this.fontSize );\r\n\r\n LX.doAsync( () => {\r\n \r\n if ( !this._isReady )\r\n {\r\n this._isReady = true;\r\n\r\n if ( this.onReady )\r\n {\r\n this.onReady( this );\r\n }\r\n\r\n console.log( `[LX.CodeEditor] Ready! (font size: ${this.fontSize}px, char size: ${this.charWidth}px)` );\r\n }\r\n }, 20 );\r\n }\r\n\r\n private _onSelectTab( isNewTabButton: boolean, event: MouseEvent, name: string ): void\r\n {\r\n if ( this.disableEdition )\r\n {\r\n return;\r\n }\r\n\r\n if ( isNewTabButton )\r\n {\r\n this._onNewTab( event );\r\n return;\r\n }\r\n\r\n this.currentTab = this._openedTabs[name];\r\n\r\n this._updateDataInfoPanel( '@tab-name', name );\r\n\r\n this.language = Tokenizer.getLanguage( this.currentTab.language ) ?? Tokenizer.getLanguage( 'Plain Text' )!;\r\n LX.emitSignal( '@highlight', this.currentTab.language );\r\n \r\n this._renderAllLines();\r\n this._afterCursorMove();\r\n\r\n if ( !isNewTabButton && this.onSelectTab )\r\n {\r\n this.onSelectTab( name, this );\r\n }\r\n }\r\n\r\n private _onNewTab( event: MouseEvent )\r\n {\r\n if ( this.onNewTab )\r\n {\r\n this.onNewTab( event );\r\n return;\r\n }\r\n\r\n const dmOptions = this.newTabOptions ?? [\r\n { name: 'Create file', icon: 'FilePlus', callback: this._onCreateNewFile.bind( this ) },\r\n { name: 'Load file', icon: 'FileUp', disabled: !this.allowLoadingFiles, callback: this._doLoadFromFile.bind( this ) }\r\n ];\r\n\r\n LX.addDropdownMenu( event.target, dmOptions, { side: 'bottom', align: 'start' } );\r\n }\r\n\r\n private _onCreateNewFile()\r\n {\r\n let options: any = {};\r\n\r\n if ( this.onCreateFile )\r\n {\r\n options = this.onCreateFile( this );\r\n // Skip adding new file\r\n if ( !options )\r\n { \r\n return;\r\n }\r\n }\r\n\r\n const name = options.name ?? 'unnamed.js';\r\n this.addTab( name, {\r\n selected: true,\r\n title: name,\r\n indexOffset: options.indexOffset,\r\n language: options.language ?? 'JavaScript'\r\n } );\r\n\r\n this._renderAllLines();\r\n this._renderCursors();\r\n this._renderSelections();\r\n this._resetGutter();\r\n }\r\n\r\n private _onContextMenuTab( isNewTabButton: boolean = false, event: any, name: string )\r\n {\r\n if ( isNewTabButton )\r\n {\r\n return;\r\n }\r\n\r\n LX.addDropdownMenu( event.target, [\r\n { name: 'Close', kbd: 'MWB', disabled: !this.allowClosingTabs, callback: () => {\r\n this.closeTab( name );\r\n } },\r\n { name: 'Close Others', disabled: !this.allowClosingTabs, callback: () => {\r\n for ( const key of Object.keys( this.tabs.tabs ) )\r\n {\r\n if ( key === '+' || key === name ) continue;\r\n this.closeTab( key );\r\n }\r\n } },\r\n { name: 'Close All', disabled: !this.allowClosingTabs, callback: () => {\r\n for ( const key of Object.keys( this.tabs.tabs ) )\r\n {\r\n if ( key === '+' ) continue;\r\n this.closeTab( key );\r\n }\r\n } },\r\n null,\r\n { name: 'Copy Path', icon: 'Copy', callback: () => {\r\n navigator.clipboard.writeText( this._openedTabs[name].path ?? '' );\r\n } }\r\n ], { side: 'bottom', align: 'start', event } );\r\n }\r\n\r\n private async _measureChar(): Promise<void>\r\n {\r\n const parentContainer = LX.makeContainer( null, 'lexcodeeditor', '', document.body );\r\n const container = LX.makeContainer( null, 'code', '', parentContainer );\r\n const line = document.createElement( 'pre' );\r\n container.appendChild( line );\r\n const measurer = document.createElement( 'span' );\r\n measurer.className = 'codechar';\r\n measurer.style.visibility = 'hidden';\r\n measurer.textContent = 'M';\r\n line.appendChild( measurer );\r\n\r\n // Force load the font before measuring\r\n const computedStyle = getComputedStyle( measurer );\r\n const fontFamily = computedStyle.fontFamily;\r\n const fontSize = computedStyle.fontSize;\r\n const fontWeight = computedStyle.fontWeight || 'normal';\r\n const fontStyle = computedStyle.fontStyle || 'normal';\r\n const fontString = `${fontStyle} ${fontWeight} ${fontSize} ${fontFamily}`;\r\n\r\n try\r\n {\r\n await document.fonts.load( fontString );\r\n }\r\n catch ( e )\r\n {\r\n console.warn( '[LX.CodeEditor] Failed to load font:', fontString, e );\r\n }\r\n\r\n // Use requestAnimationFrame to ensure the element is rendered\r\n requestAnimationFrame( () =>\r\n {\r\n const rect = measurer.getBoundingClientRect();\r\n this.charWidth = rect.width || 7;\r\n this.lineHeight = parseFloat( getComputedStyle( this.root ).getPropertyValue( '--code-editor-row-height' ) ) || 20;\r\n LX.deleteElement( parentContainer );\r\n\r\n // Re-render cursors with correct measurements\r\n this._renderCursors();\r\n this._renderSelections();\r\n this.resize( true );\r\n } );\r\n }\r\n\r\n private _createStatusPanel( options: Record<string, any> = {} )\r\n {\r\n if ( this.skipInfo )\r\n {\r\n return;\r\n }\r\n\r\n let panel = new LX.Panel( { className: 'lexcodetabinfo bg-inherit flex flex-row flex-auto-keep', height: 'auto' } );\r\n\r\n if ( this.onCreateStatusPanel )\r\n {\r\n this.onCreateStatusPanel( panel, this );\r\n }\r\n\r\n let leftStatusPanel = this.leftStatusPanel = new LX.Panel( { id: 'FontSizeZoomStatusComponent',\r\n className: 'pad-xs content-center items-center flex-auto-keep', width: 'auto', height: 'auto' } );\r\n leftStatusPanel.sameLine();\r\n\r\n // Zoom Component\r\n leftStatusPanel.addButton( null, 'ZoomOutButton', this._decreaseFontSize.bind( this ), { icon: 'ZoomOut', buttonClass: 'ghost sm',\r\n title: 'Zoom Out', tooltip: true } );\r\n leftStatusPanel.addLabel( this.fontSize, { fit: true, signal: '@font-size' } );\r\n leftStatusPanel.addButton( null, 'ZoomInButton', this._increaseFontSize.bind( this ), { icon: 'ZoomIn', buttonClass: 'ghost sm',\r\n title: 'Zoom In', tooltip: true } );\r\n leftStatusPanel.endLine( 'justify-start' );\r\n panel.attach( leftStatusPanel.root );\r\n\r\n // Filename cursor data\r\n let rightStatusPanel = this.rightStatusPanel = new LX.Panel( { className: 'pad-xs content-center items-center', height: 'auto' } );\r\n rightStatusPanel.sameLine();\r\n rightStatusPanel.addLabel( this.currentTab?.title ?? '', { id: 'EditorFilenameStatusComponent', fit: true, inputClass: 'text-xs',\r\n signal: '@tab-name' } );\r\n rightStatusPanel.addButton( null, 'Ln 1, Col 1', this._doOpenLineSearch.bind( this ), {\r\n id: 'EditorSelectionStatusComponent',\r\n buttonClass: 'outline xs',\r\n fit: true,\r\n signal: '@cursor-data'\r\n } );\r\n\r\n const tabSizeButton = rightStatusPanel.addButton( null, 'Spaces: ' + this.tabSize, ( value: any, event: any ) => {\r\n\r\n const _onNewTabSize = ( v: string ) => {\r\n this.tabSize = parseInt( v );\r\n this._rebuildLines();\r\n this._updateDataInfoPanel( '@tab-spaces', `Spaces: ${this.tabSize}` );\r\n }\r\n\r\n const dd = LX.addDropdownMenu(\r\n tabSizeButton.root,\r\n [ '2', '4', '8' ].map( ( v ) => { return { name: v, className: 'w-full place-content-center', callback: _onNewTabSize } } ),\r\n { side: 'top', align: 'end' }\r\n );\r\n LX.addClass( dd.root, 'min-w-16! items-center' );\r\n\r\n }, { id: 'EditorIndentationStatusComponent', buttonClass: 'outline xs', signal: '@tab-spaces' } );\r\n\r\n const langButton = rightStatusPanel.addButton( '<b>{ }</b>', this.highlight, ( value: any, event: any ) => {\r\n\r\n const dd = LX.addDropdownMenu(\r\n langButton.root,\r\n Tokenizer.getRegisteredLanguages().map( ( v ) => {\r\n const lang = Tokenizer.getLanguage( v );\r\n const icon: any = getLanguageIcon( lang );\r\n const iconData = icon ? icon.split( ' ' ) : [];\r\n return {\r\n name: v,\r\n icon: iconData[0],\r\n className: 'w-full text-xs px-3',\r\n svgClass: iconData.slice( 1 ).join( ' ' ),\r\n callback: ( v: string ) => this.setLanguage( v )\r\n };\r\n } ),\r\n { side: 'top', align: 'end' }\r\n );\r\n LX.addClass( dd.root, 'min-w-min! items-center' );\r\n\r\n }, { id: 'EditorLanguageStatusComponent', nameWidth: 'auto', buttonClass: 'outline xs', signal: '@highlight', title: '' } );\r\n\r\n rightStatusPanel.endLine( 'justify-end' );\r\n panel.attach( rightStatusPanel.root );\r\n\r\n const itemVisibilityMap: Record<string, boolean> = {\r\n 'Font Size Zoom': options.statusShowFontSizeZoom ?? true,\r\n 'Editor Filename': options.statusShowEditorFilename ?? true,\r\n 'Editor Selection': options.statusShowEditorSelection ?? true,\r\n 'Editor Indentation': options.statusShowEditorIndentation ?? true,\r\n 'Editor Language': options.statusShowEditorLanguage ?? true\r\n };\r\n\r\n const _setVisibility = ( itemName: string ) => {\r\n const b = panel.root.querySelector( `#${itemName.replaceAll( ' ', '' )}StatusComponent` );\r\n console.assert( b, `${itemName} has no status button!` );\r\n b.classList.toggle( 'hidden', !itemVisibilityMap[itemName] );\r\n };\r\n\r\n for ( const [ itemName, v ] of Object.entries( itemVisibilityMap ) )\r\n {\r\n _setVisibility( itemName );\r\n }\r\n\r\n panel.root.addEventListener( 'contextmenu', ( e: any ) => {\r\n if ( e.target\r\n && ( e.target.classList.contains( 'lexpanel' )\r\n || e.target.classList.contains( 'lexinlinecomponents' ) ) )\r\n {\r\n return;\r\n }\r\n\r\n const menuOptions = Object.keys( itemVisibilityMap ).map( ( itemName, idx ) => {\r\n const item: any = {\r\n name: itemName,\r\n icon: 'Check',\r\n callback: () => {\r\n itemVisibilityMap[itemName] = !itemVisibilityMap[itemName];\r\n _setVisibility( itemName );\r\n }\r\n };\r\n if ( !itemVisibilityMap[itemName] ) delete item.icon;\r\n return item;\r\n } );\r\n\r\n LX.addDropdownMenu( e.target, menuOptions, { side: 'top', align: 'start' } );\r\n } );\r\n\r\n return panel;\r\n }\r\n\r\n private _updateDataInfoPanel( signal: string, value: string )\r\n {\r\n if ( this.skipInfo ) return;\r\n\r\n if ( this.cursorSet.cursors.length > 1 )\r\n {\r\n value = '';\r\n }\r\n\r\n LX.emitSignal( signal, value );\r\n }\r\n\r\n /**\r\n * Tokenize a line and return its innerHTML with syntax highlighting spans.\r\n */\r\n private _tokenizeLine( lineIndex: number ): { html: string; endState: TokenizerState; tokens: Token[] }\r\n {\r\n const prevState = lineIndex > 0\r\n ? ( this._lineStates[ lineIndex - 1 ] ?? Tokenizer.initialState() )\r\n : Tokenizer.initialState();\r\n\r\n const lineText = this.doc.getLine( lineIndex );\r\n const result = Tokenizer.tokenizeLine( lineText, this.language, prevState );\r\n const langClass = this.language.name.toLowerCase().replace( /[^a-z]/g, '' );\r\n const URL_REGEX = /(https?:\\/\\/[^\\s\"'<>)\\]]+)/g;\r\n\r\n // Pre-compute which token index gets the bracket-highlight class\r\n let bracketTokenIdx = -1;\r\n if ( lineIndex === this._bracketOpenLine )\r\n {\r\n // Last '{' symbol token on this line\r\n for ( let i = result.tokens.length - 1; i >= 0; i-- )\r\n {\r\n if ( result.tokens[i].type === 'symbol' && result.tokens[i].value === '{' )\r\n {\r\n bracketTokenIdx = i;\r\n break;\r\n }\r\n }\r\n }\r\n else if ( lineIndex === this._bracketCloseLine )\r\n {\r\n // First '}' symbol token on this line\r\n for ( let i = 0; i < result.tokens.length; i++ )\r\n {\r\n if ( result.tokens[i].type === 'symbol' && result.tokens[i].value === '}' )\r\n {\r\n bracketTokenIdx = i;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n let html = '';\r\n let colOffset = 0;\r\n for ( let ti = 0; ti < result.tokens.length; ti++ )\r\n {\r\n const token = result.tokens[ti];\r\n const cls = TOKEN_CLASS_MAP[ token.type ];\r\n const tokenCol = colOffset;\r\n colOffset += token.value.length;\r\n\r\n let content: string;\r\n if ( token.type === 'comment' )\r\n {\r\n // Escape then inject clickable URL spans\r\n const escaped = token.value\r\n .replace( /&/g, '&amp;' ).replace( /</g, '&lt;' ).replace( />/g, '&gt;' );\r\n content = escaped.replace( URL_REGEX, `<span class=\"code-link\" data-url=\"$1\">$1</span>` );\r\n }\r\n else\r\n {\r\n // Escape and inject color swatches for hex color strings\r\n content = injectColorSpans( token.value, lineIndex, tokenCol );\r\n }\r\n\r\n const bracketClass = ti === bracketTokenIdx ? ' code-bracket-active' : '';\r\n\r\n if ( cls )\r\n {\r\n html += `<span class=\"${cls} ${langClass}${bracketClass}\">${content}</span>`;\r\n }\r\n else if ( bracketClass )\r\n {\r\n html += `<span class=\"${bracketClass.trim()}\">${content}</span>`;\r\n }\r\n else\r\n {\r\n html += content;\r\n }\r\n }\r\n\r\n return { html: html || '&nbsp;', endState: result.state, tokens: result.tokens };\r\n }\r\n\r\n /**\r\n * Update symbol table for a line.\r\n */\r\n private _updateSymbolsForLine( lineIndex: number ): void\r\n {\r\n const lineText = this.doc.getLine( lineIndex );\r\n\r\n this.symbolTable.updateScopeForLine( lineIndex, lineText );\r\n\r\n this.symbolTable.removeLineSymbols( lineIndex );\r\n\r\n const { tokens } = this._tokenizeLine( lineIndex );\r\n const symbols = parseSymbolsFromLine( lineText, tokens, lineIndex, this.symbolTable );\r\n for ( const symbol of symbols )\r\n {\r\n this.symbolTable.addSymbol( symbol );\r\n }\r\n }\r\n\r\n /**\r\n * Render all lines from scratch.\r\n */\r\n private _renderAllLines(): void\r\n {\r\n if ( !this.currentTab ) return;\r\n\r\n this.codeContainer.innerHTML = '';\r\n this._lineElements = [];\r\n this._lineStates = [];\r\n this.symbolTable.clear(); // Clear all symbols on full rebuild\r\n\r\n for ( let i = 0; i < this.doc.lineCount; i++ )\r\n {\r\n this._appendLineElement( i );\r\n }\r\n }\r\n\r\n /**\r\n * Gets the html for the line gutter.\r\n */\r\n private _getGutterHtml( lineIndex: number ): string\r\n {\r\n return `<span class=\"line-gutter\">${lineIndex + 1}</span>`;\r\n }\r\n\r\n /**\r\n * Create and append a <pre> element for a line.\r\n */\r\n private _appendLineElement( lineIndex: number ): void\r\n {\r\n const { html, endState } = this._tokenizeLine( lineIndex );\r\n this._lineStates[ lineIndex ] = endState;\r\n\r\n const pre = document.createElement( 'pre' );\r\n pre.innerHTML = this._getGutterHtml( lineIndex ) + html;\r\n this.codeContainer.appendChild( pre );\r\n this._lineElements[ lineIndex ] = pre;\r\n\r\n // Update symbols for this line\r\n this._updateSymbolsForLine( lineIndex );\r\n }\r\n\r\n /**\r\n * Re-render a single line's content (after editing).\r\n */\r\n private _updateLine( lineIndex: number ): void\r\n {\r\n const { html, endState } = this._tokenizeLine( lineIndex );\r\n const oldState = this._lineStates[ lineIndex ];\r\n this._lineStates[ lineIndex ] = endState;\r\n\r\n if ( this._lineElements[ lineIndex ] )\r\n {\r\n this._lineElements[ lineIndex ].innerHTML = this._getGutterHtml( lineIndex ) + html;\r\n }\r\n\r\n // Update symbols for this line\r\n this._updateSymbolsForLine( lineIndex );\r\n\r\n // If the tokenizer state changed (e.g. opened/closed a block comment),\r\n // re-render subsequent lines until states stabilize\r\n if ( !this._statesEqual( oldState, endState ) )\r\n {\r\n for ( let i = lineIndex + 1; i < this.doc.lineCount; i++ )\r\n {\r\n const { html: nextHtml, endState: nextEnd } = this._tokenizeLine( i );\r\n const nextOld = this._lineStates[ i ];\r\n this._lineStates[ i ] = nextEnd;\r\n if ( this._lineElements[ i ] )\r\n {\r\n this._lineElements[ i ].innerHTML = this._getGutterHtml( i ) + nextHtml;\r\n }\r\n this._updateSymbolsForLine( i ); // Update symbols for cascaded lines too\r\n if ( this._statesEqual( nextOld, nextEnd ) ) break;\r\n }\r\n }\r\n\r\n // Propagate/cascade scope updates to subsequent lines until the start-of-line scope stabilizes\r\n for ( let i = lineIndex + 1; i < this.doc.lineCount; i++ )\r\n {\r\n const oldStartDepth = this.symbolTable.getScopeAtLine( i ).length;\r\n this.symbolTable.updateScopeForLine( i, this.doc.getLine( i ) );\r\n if ( this.symbolTable.getScopeAtLine( i ).length === oldStartDepth ) break;\r\n }\r\n }\r\n\r\n /**\r\n * Rebuild line elements after structural changes (insert/delete lines).\r\n */\r\n private _rebuildLines(): void\r\n {\r\n // Diff: if count matches, just update content; otherwise full rebuild\r\n if ( this._lineElements.length === this.doc.lineCount )\r\n {\r\n for ( let i = 0; i < this.doc.lineCount; i++ )\r\n {\r\n this._updateLine( i );\r\n }\r\n }\r\n else\r\n {\r\n this._renderAllLines();\r\n }\r\n this.resize();\r\n }\r\n\r\n private _statesEqual( a: TokenizerState | undefined, b: TokenizerState ): boolean\r\n {\r\n if ( !a ) return false;\r\n if ( a.stack.length !== b.stack.length ) return false;\r\n for ( let i = 0; i < a.stack.length; i++ )\r\n {\r\n if ( a.stack[i] !== b.stack[i] ) return false;\r\n }\r\n return true;\r\n }\r\n\r\n private _updateActiveLine(): void\r\n {\r\n const hasSelection = this.cursorSet.hasSelection();\r\n const activeLine = this.cursorSet.getPrimary().head.line;\r\n const activeCol = this.cursorSet.getPrimary().head.col;\r\n for ( let i = 0; i < this._lineElements.length; i++ )\r\n {\r\n this._lineElements[i].classList.toggle( 'active-line', !hasSelection && i === activeLine );\r\n }\r\n\r\n this._updateDataInfoPanel( '@cursor-data', `Ln ${activeLine + 1}, Col ${activeCol + 1}` );\r\n }\r\n\r\n private _renderCursors(): void\r\n {\r\n if ( !this.currentTab ) return;\r\n\r\n this.cursorsLayer.innerHTML = '';\r\n\r\n for ( const sel of this.cursorSet.cursors )\r\n {\r\n const el = LX.makeElement( 'div', 'cursor', '&nbsp;', this.cursorsLayer );\r\n el.style.left = ( sel.head.col * this.charWidth + this.xPadding ) + 'px';\r\n el.style.top = ( sel.head.line * this.lineHeight ) + 'px';\r\n }\r\n\r\n this._updateActiveLine();\r\n }\r\n\r\n private _renderSelections(): void\r\n {\r\n if ( !this.currentTab ) return;\r\n\r\n this.selectionsLayer.innerHTML = '';\r\n\r\n for ( const sel of this.cursorSet.cursors )\r\n {\r\n if ( selectionIsEmpty( sel ) ) continue;\r\n\r\n const start = selectionStart( sel );\r\n const end = selectionEnd( sel );\r\n\r\n for ( let line = start.line; line <= end.line; line++ )\r\n {\r\n const lineText = this.doc.getLine( line );\r\n const fromCol = line === start.line ? start.col : 0;\r\n const toCol = line === end.line ? end.col : lineText.length;\r\n\r\n // Skip only when the selection ends exactly at col 0 of this line\r\n if ( fromCol === toCol && line === end.line ) continue;\r\n\r\n const width = fromCol === toCol\r\n ? Math.ceil( this.charWidth * 0.5 ) // minimum width for empty lines\r\n : ( toCol - fromCol ) * this.charWidth;\r\n\r\n const div = LX.makeElement( 'div', 'lexcodeselection', '', this.selectionsLayer );\r\n div.style.top = ( line * this.lineHeight ) + 'px';\r\n div.style.left = ( fromCol * this.charWidth + this.xPadding ) + 'px';\r\n div.style.width = width + 'px';\r\n }\r\n }\r\n }\r\n\r\n private _setFocused( focused: boolean ): void\r\n {\r\n this._focused = focused;\r\n\r\n if ( focused )\r\n {\r\n this.cursorsLayer.classList.add( 'show' );\r\n this.selectionsLayer.classList.add( 'show' );\r\n this.selectionsLayer.classList.remove( 'unfocused' );\r\n this._startBlinker();\r\n }\r\n else\r\n {\r\n this.cursorsLayer.classList.remove( 'show' );\r\n if ( !this._isSearchBoxActive )\r\n {\r\n this.selectionsLayer.classList.add( 'unfocused' );\r\n }\r\n else\r\n {\r\n this.selectionsLayer.classList.add( 'show' );\r\n }\r\n this._stopBlinker();\r\n }\r\n }\r\n\r\n private _startBlinker(): void\r\n {\r\n this._stopBlinker();\r\n this._cursorVisible = true;\r\n this._setCursorVisibility( true );\r\n\r\n this._blinkerInterval = setInterval( () =>\r\n {\r\n this._cursorVisible = !this._cursorVisible;\r\n this._setCursorVisibility( this._cursorVisible );\r\n }, this._cursorBlinkRate );\r\n }\r\n\r\n private _stopBlinker(): void\r\n {\r\n if ( this._blinkerInterval !== null )\r\n {\r\n clearInterval( this._blinkerInterval );\r\n this._blinkerInterval = null;\r\n }\r\n }\r\n\r\n private _resetBlinker(): void\r\n {\r\n if ( this._focused )\r\n {\r\n this._startBlinker();\r\n }\r\n }\r\n\r\n private _setCursorVisibility( visible: boolean ): void\r\n {\r\n const cursors = this.cursorsLayer.querySelectorAll( '.cursor' );\r\n for ( const c of cursors )\r\n {\r\n ( c as HTMLElement ).style.opacity = visible ? '0.6' : '0';\r\n }\r\n }\r\n\r\n // Keyboard input events:\r\n\r\n private _onKeyDown( e: KeyboardEvent ): void\r\n {\r\n if ( !this.currentTab ) return;\r\n\r\n // Ignore events during IME / dead key composition\r\n if ( this._composing || e.key === 'Dead' ) return;\r\n\r\n // Ignore modifier-only presses\r\n if ( [ 'Control', 'Shift', 'Alt', 'Meta' ].includes( e.key ) ) return;\r\n\r\n const ctrl = e.ctrlKey || e.metaKey;\r\n const shift = e.shiftKey;\r\n const alt = e.altKey;\r\n\r\n if ( this._keyChain )\r\n {\r\n const chain = this._keyChain;\r\n this._keyChain = null;\r\n e.preventDefault();\r\n\r\n if ( ctrl && chain === 'k' )\r\n {\r\n switch ( e.key.toLowerCase() )\r\n {\r\n case 'c': this._commentLines(); return;\r\n case 'u': this._uncommentLines(); return;\r\n }\r\n }\r\n return; // Unknown chord, just consume it\r\n }\r\n\r\n if ( ctrl )\r\n {\r\n switch ( e.key.toLowerCase() )\r\n {\r\n case 'a':\r\n e.preventDefault();\r\n this.cursorSet.selectAll( this.doc );\r\n this._afterCursorMove();\r\n return;\r\n case 'd':\r\n e.preventDefault();\r\n this._doFindNextOcurrence();\r\n return;\r\n case 'f':\r\n e.preventDefault();\r\n this._doOpenSearch();\r\n return;\r\n case 'g':\r\n e.preventDefault();\r\n this._doOpenLineSearch();\r\n return;\r\n case 'k':\r\n e.preventDefault();\r\n this._keyChain = 'k';\r\n return;\r\n case 's': // save\r\n e.preventDefault();\r\n if ( this.onSave )\r\n {\r\n this.onSave( this.getText(), this );\r\n }\r\n return;\r\n case 'z':\r\n e.preventDefault();\r\n shift ? this._doRedo() : this._doUndo();\r\n return;\r\n case 'y':\r\n e.preventDefault();\r\n this._doRedo();\r\n return;\r\n case 'c':\r\n e.preventDefault();\r\n this._doCopy();\r\n return;\r\n case 'x':\r\n e.preventDefault();\r\n this._doCut();\r\n return;\r\n case 'v':\r\n e.preventDefault();\r\n this._doPaste();\r\n return;\r\n case ' ':\r\n e.preventDefault();\r\n // Also call user callback if provided\r\n if ( this.onCtrlSpace )\r\n {\r\n this.onCtrlSpace( this.getText(), this );\r\n }\r\n return;\r\n }\r\n }\r\n\r\n switch ( e.key )\r\n {\r\n case 'ArrowLeft':\r\n e.preventDefault();\r\n this._wasPaired = false;\r\n if ( ctrl ) this.cursorSet.moveWordLeft( this.doc, shift );\r\n else this.cursorSet.moveLeft( this.doc, shift );\r\n this._afterCursorMove();\r\n return;\r\n case 'ArrowRight':\r\n e.preventDefault();\r\n this._wasPaired = false;\r\n if ( ctrl ) this.cursorSet.moveWordRight( this.doc, shift );\r\n else this.cursorSet.moveRight( this.doc, shift );\r\n this._afterCursorMove();\r\n return;\r\n case 'ArrowUp':\r\n e.preventDefault();\r\n if ( this._isAutoCompleteActive )\r\n {\r\n const items = this.autocomplete!.childNodes as NodeListOf<HTMLElement>;\r\n items[this._selectedAutocompleteIndex]?.classList.remove( 'selected' );\r\n this._selectedAutocompleteIndex = ( this._selectedAutocompleteIndex - 1 + items.length ) % items.length;\r\n items[this._selectedAutocompleteIndex]?.classList.add( 'selected' );\r\n items[this._selectedAutocompleteIndex]?.scrollIntoView( { block: 'nearest' } );\r\n return;\r\n }\r\n this._wasPaired = false;\r\n if ( alt && shift ) { this._duplicateLine( -1 ); return; }\r\n if ( alt ) { this._swapLine( -1 ); return; }\r\n this.cursorSet.moveUp( this.doc, shift );\r\n this._afterCursorMove();\r\n return;\r\n case 'ArrowDown':\r\n e.preventDefault();\r\n if ( this._isAutoCompleteActive )\r\n {\r\n const items = this.autocomplete!.childNodes as NodeListOf<HTMLElement>;\r\n items[this._selectedAutocompleteIndex]?.classList.remove( 'selected' );\r\n this._selectedAutocompleteIndex = ( this._selectedAutocompleteIndex + 1 ) % items.length;\r\n items[this._selectedAutocompleteIndex]?.classList.add( 'selected' );\r\n items[this._selectedAutocompleteIndex]?.scrollIntoView( { block: 'nearest' } );\r\n return;\r\n }\r\n this._wasPaired = false;\r\n if ( alt && shift ) { this._duplicateLine( 1 ); return; }\r\n if ( alt ) { this._swapLine( 1 ); return; }\r\n this.cursorSet.moveDown( this.doc, shift );\r\n this._afterCursorMove();\r\n return;\r\n case 'Home':\r\n e.preventDefault();\r\n this._wasPaired = false;\r\n this.cursorSet.moveToLineStart( this.doc, shift );\r\n this._afterCursorMove();\r\n return;\r\n case 'End':\r\n e.preventDefault();\r\n this._wasPaired = false;\r\n this.cursorSet.moveToLineEnd( this.doc, shift );\r\n this._afterCursorMove();\r\n return;\r\n case 'Escape':\r\n e.preventDefault();\r\n if( this._isAutoCompleteActive )\r\n {\r\n this._doHideAutocomplete();\r\n return;\r\n }\r\n if ( this._doHideSearch() ) return;\r\n this.cursorSet.removeSecondaryCursors();\r\n // Collapse selection\r\n const h = this.cursorSet.getPrimary().head;\r\n this.cursorSet.set( h.line, h.col );\r\n this._afterCursorMove();\r\n return;\r\n }\r\n\r\n switch ( e.key )\r\n {\r\n case 'Backspace':\r\n e.preventDefault();\r\n this._doBackspace( ctrl );\r\n return;\r\n case 'Delete':\r\n e.preventDefault();\r\n this._doDelete( ctrl );\r\n return;\r\n case 'Enter':\r\n e.preventDefault();\r\n this._doEnter( ctrl );\r\n return;\r\n case 'Tab':\r\n e.preventDefault();\r\n this._doTab( shift );\r\n return;\r\n }\r\n\r\n if ( e.key.length === 1 && !ctrl )\r\n {\r\n e.preventDefault();\r\n this._doInsertChar( e.key );\r\n }\r\n }\r\n\r\n private _flushIfActionChanged( action: string ): void\r\n {\r\n if ( this._lastAction !== action )\r\n {\r\n this.undoManager.flush( this.cursorSet.getCursorPositions() );\r\n this._lastAction = action;\r\n }\r\n }\r\n\r\n private _flushAction(): void\r\n {\r\n this.undoManager.flush( this.cursorSet.getCursorPositions() );\r\n this._lastAction = '';\r\n }\r\n\r\n private _doInsertChar( char: string ): void\r\n {\r\n // Enclose selection if applicable\r\n if ( char in CodeEditor.PAIR_KEYS && this.cursorSet.hasSelection() )\r\n {\r\n this._encloseSelection( char, CodeEditor.PAIR_KEYS[ char ] );\r\n return;\r\n }\r\n\r\n this._flushIfActionChanged( 'insert' );\r\n\r\n this._deleteSelectionIfAny();\r\n\r\n const changedLines = new Set<number>();\r\n let paired = false;\r\n\r\n for ( const idx of this.cursorSet.sortedIndicesBottomUp() )\r\n {\r\n const cursor = this.cursorSet.cursors[idx];\r\n const { line, col } = cursor.head;\r\n const nextChar = this.doc.getCharAt( line, col );\r\n\r\n // If we just auto-paired and the next char is the same closing char, skip over it\r\n if ( this._wasPaired && nextChar === char )\r\n {\r\n cursor.head = { line, col: col + 1 };\r\n cursor.anchor = { ...cursor.head };\r\n continue;\r\n }\r\n\r\n const op = this.doc.insert( line, col, char );\r\n this.undoManager.record( op, this.cursorSet.getCursorPositions() );\r\n\r\n const pairInserted = char in CodeEditor.PAIR_KEYS && ( !nextChar || /\\s/.test( nextChar ) );\r\n const charsInserted = pairInserted ? 2 : 1;\r\n\r\n // Auto-pair: insert closing char if next char is whitespace or end of line\r\n if ( pairInserted )\r\n {\r\n const closeOp = this.doc.insert( line, col + 1, CodeEditor.PAIR_KEYS[ char ] );\r\n this.undoManager.record( closeOp, this.cursorSet.getCursorPositions() );\r\n paired = true;\r\n }\r\n\r\n cursor.head = { line, col: col + 1 };\r\n cursor.anchor = { ...cursor.head };\r\n this.cursorSet.adjustOthers( idx, line, col, charsInserted );\r\n changedLines.add( line );\r\n }\r\n\r\n this._wasPaired = paired;\r\n for ( const line of changedLines ) this._updateLine( line );\r\n this._afterCursorMove();\r\n\r\n // Close autocomplete when typing most chars (except word chars which update it)\r\n if ( /[\\w$]/.test( char ) )\r\n {\r\n // Update autocomplete with new partial word\r\n this._doOpenAutocomplete();\r\n }\r\n else\r\n {\r\n // Non-word char, close autocomplete\r\n this._doHideAutocomplete();\r\n }\r\n }\r\n\r\n private _getAffectedLines(): [ number, number ]\r\n {\r\n const cursor = this.cursorSet.getPrimary();\r\n const a = cursor.anchor.line;\r\n const h = cursor.head.line;\r\n return a <= h ? [ a, h ] : [ h, a ];\r\n }\r\n\r\n private _commentLines(): void\r\n {\r\n const token = this.language.lineComment;\r\n if ( !token ) return;\r\n\r\n const [ fromLine, toLine ] = this._getAffectedLines();\r\n const comment = token + ' ';\r\n\r\n // Find minimum indentation across affected lines (skip empty lines)\r\n let minIndent = Infinity;\r\n for ( let i = fromLine; i <= toLine; i++ )\r\n {\r\n const line = this.doc.getLine( i );\r\n if ( line.trim().length === 0 ) continue;\r\n minIndent = Math.min( minIndent, this.doc.getIndent( i ) );\r\n }\r\n if ( minIndent === Infinity ) minIndent = 0;\r\n\r\n this._flushAction();\r\n for ( let i = fromLine; i <= toLine; i++ )\r\n {\r\n const line = this.doc.getLine( i );\r\n if ( line.trim().length === 0 ) continue;\r\n const op = this.doc.insert( i, minIndent, comment );\r\n this.undoManager.record( op, this.cursorSet.getCursorPositions() );\r\n this._updateLine( i );\r\n }\r\n\r\n this._afterCursorMove();\r\n }\r\n\r\n private _uncommentLines(): void\r\n {\r\n const token = this.language.lineComment;\r\n if ( !token ) return;\r\n\r\n const [ fromLine, toLine ] = this._getAffectedLines();\r\n\r\n this._flushAction();\r\n for ( let i = fromLine; i <= toLine; i++ )\r\n {\r\n const line = this.doc.getLine( i );\r\n const indent = this.doc.getIndent( i );\r\n const rest = line.substring( indent );\r\n\r\n // Check for \"// \" or \"//\"\r\n if ( rest.startsWith( token + ' ' ) )\r\n {\r\n const op = this.doc.delete( i, indent, token.length + 1 );\r\n this.undoManager.record( op, this.cursorSet.getCursorPositions() );\r\n }\r\n else if ( rest.startsWith( token ) )\r\n {\r\n const op = this.doc.delete( i, indent, token.length );\r\n this.undoManager.record( op, this.cursorSet.getCursorPositions() );\r\n }\r\n }\r\n\r\n this._rebuildLines();\r\n this._afterCursorMove();\r\n }\r\n\r\n private _doFindNextOcurrence(): void\r\n {\r\n const primary = this.cursorSet.getPrimary();\r\n\r\n // Get the search text: selection or word under cursor\r\n let searchText = this.cursorSet.getSelectedText( this.doc );\r\n if ( !searchText )\r\n {\r\n const { line, col } = primary.head;\r\n const [ word, start, end ] = this.doc.getWordAt( line, col );\r\n if ( !word ) return;\r\n\r\n // Select the word under cursor first (first Ctrl+D)\r\n primary.anchor = { line, col: start };\r\n primary.head = { line, col: end };\r\n this._renderCursors();\r\n this._renderSelections();\r\n return;\r\n }\r\n\r\n const lastCursor = this.cursorSet.cursors[ this.cursorSet.cursors.length - 1 ];\r\n const lastEnd = posBefore( lastCursor.anchor, lastCursor.head ) ? lastCursor.head : lastCursor.anchor;\r\n\r\n const match = this.doc.findNext( searchText, lastEnd.line, lastEnd.col );\r\n if ( !match ) return;\r\n\r\n // Check if this occurrence is already selected by any cursor\r\n const alreadySelected = this.cursorSet.cursors.some( sel =>\r\n {\r\n const start = posBefore( sel.anchor, sel.head ) ? sel.anchor : sel.head;\r\n return start.line === match.line && start.col === match.col;\r\n } );\r\n\r\n if ( alreadySelected ) return;\r\n\r\n this.cursorSet.cursors.push( {\r\n anchor: { line: match.line, col: match.col },\r\n head: { line: match.line, col: match.col + searchText.length }\r\n } );\r\n\r\n this._renderCursors();\r\n this._renderSelections();\r\n this._scrollCursorIntoView();\r\n }\r\n\r\n private _doOpenSearch( clear: boolean = false ): void\r\n {\r\n if ( !this.searchBox ) return;\r\n\r\n this._doHideSearch();\r\n\r\n LX.addClass( this.searchBox, 'opened' );\r\n this._isSearchBoxActive = true;\r\n\r\n const input: HTMLInputElement | null = this.searchBox.querySelector( 'input' );\r\n if ( !input ) return;\r\n\r\n if ( clear )\r\n {\r\n input.value = '';\r\n }\r\n else if ( this.cursorSet.hasSelection() )\r\n {\r\n input.value = this.cursorSet.getSelectedText( this.doc );\r\n }\r\n\r\n input.selectionStart = 0;\r\n input.selectionEnd = input.value.length;\r\n input.focus();\r\n }\r\n\r\n private _doOpenLineSearch(): void\r\n {\r\n if ( !this.searchLineBox ) return;\r\n\r\n this._doHideSearch();\r\n\r\n LX.emitSignal( '@line-number-range', `Type a line number to go to (from 1 to ${this.doc.lineCount}).` )\r\n\r\n LX.addClass( this.searchLineBox, 'opened' );\r\n this._isSearchLineBoxActive = true;\r\n\r\n const input: HTMLInputElement | null = this.searchLineBox.querySelector( 'input' );\r\n if ( !input ) return;\r\n input.value = ':';\r\n input.focus();\r\n }\r\n\r\n /**\r\n * Returns true if visibility changed.\r\n */\r\n private _doHideSearch(): boolean\r\n {\r\n if ( !this.searchBox || !this.searchLineBox ) return false;\r\n\r\n const active = this._isSearchBoxActive;\r\n const activeLine = this._isSearchLineBoxActive;\r\n if ( active )\r\n {\r\n this.searchBox.classList.remove( 'opened' );\r\n this._isSearchBoxActive = false;\r\n this._lastSearchPos = null;\r\n }\r\n else if ( activeLine )\r\n {\r\n this.searchLineBox.classList.remove( 'opened' );\r\n this._isSearchLineBoxActive = false;\r\n }\r\n\r\n return ( active != this._isSearchBoxActive ) || ( activeLine != this._isSearchLineBoxActive );\r\n }\r\n\r\n private _doSearch( text?: string | null, reverse: boolean = false, callback?: any, skipAlert: boolean = true, forceFocus: boolean = true )\r\n {\r\n text = text ?? this._lastTextFound;\r\n\r\n if ( !text ) return;\r\n\r\n const doc = this.doc;\r\n let startLine: number;\r\n let startCol: number;\r\n\r\n if ( this._lastSearchPos )\r\n {\r\n startLine = this._lastSearchPos.line;\r\n startCol = this._lastSearchPos.col + ( reverse ? -text.length : text.length );\r\n }\r\n else\r\n {\r\n const cursor = this.cursorSet.getPrimary();\r\n startLine = cursor.head.line;\r\n startCol = cursor.head.col;\r\n }\r\n\r\n const findInLine = ( lineIdx: number, fromCol: number ): number =>\r\n {\r\n let lineText = doc.getLine( lineIdx );\r\n let needle = text!;\r\n\r\n if ( !this._searchMatchCase )\r\n {\r\n lineText = lineText.toLowerCase();\r\n needle = needle.toLowerCase();\r\n }\r\n\r\n if ( reverse )\r\n {\r\n const sub = lineText.substring( 0, fromCol );\r\n return sub.lastIndexOf( needle );\r\n }\r\n else\r\n {\r\n return lineText.indexOf( needle, fromCol );\r\n }\r\n };\r\n\r\n let foundLine: number = -1;\r\n let foundCol: number = -1;\r\n\r\n if ( reverse )\r\n {\r\n for ( let j = startLine; j >= 0; j-- )\r\n {\r\n const col = findInLine( j, j === startLine ? startCol : doc.getLine( j ).length );\r\n if ( col > -1 )\r\n {\r\n foundLine = j;\r\n foundCol = col;\r\n break;\r\n }\r\n }\r\n\r\n // Wrap around from bottom\r\n if ( foundLine === -1 )\r\n {\r\n for ( let j = doc.lineCount - 1; j > startLine; j-- )\r\n {\r\n const col = findInLine( j, doc.getLine( j ).length );\r\n if ( col > -1 )\r\n {\r\n foundLine = j;\r\n foundCol = col;\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n else\r\n {\r\n for ( let j = startLine; j < doc.lineCount; j++ )\r\n {\r\n const col = findInLine( j, j === startLine ? startCol : 0 );\r\n if ( col > -1 )\r\n {\r\n foundLine = j;\r\n foundCol = col;\r\n break;\r\n }\r\n }\r\n\r\n // Wrap around from top\r\n if ( foundLine === -1 )\r\n {\r\n for ( let j = 0; j < startLine; j++ )\r\n {\r\n const col = findInLine( j, 0 );\r\n if ( col > -1 )\r\n {\r\n foundLine = j;\r\n foundCol = col;\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n if ( foundLine === -1 )\r\n {\r\n if ( !skipAlert ) alert( 'No results!' );\r\n this._lastSearchPos = null;\r\n return;\r\n }\r\n\r\n this._lastTextFound = text;\r\n this._lastSearchPos = { line: foundLine, col: foundCol };\r\n\r\n if ( callback )\r\n {\r\n callback( foundCol, foundLine );\r\n }\r\n else\r\n {\r\n // Select the found text\r\n const primary = this.cursorSet.getPrimary();\r\n primary.anchor = { line: foundLine, col: foundCol };\r\n primary.head = { line: foundLine, col: foundCol + text.length };\r\n this._renderCursors();\r\n this._renderSelections();\r\n }\r\n\r\n // Scroll to the match\r\n this.codeScroller.scrollTop = Math.max( ( foundLine - 10 ) * this.lineHeight, 0 );\r\n this.codeScroller.scrollLeft = Math.max( foundCol * this.charWidth - this.codeScroller.clientWidth / 2, 0 );\r\n\r\n if ( forceFocus )\r\n {\r\n const input = this.searchBox?.querySelector( 'input' );\r\n input?.focus();\r\n }\r\n }\r\n\r\n private _doGotoLine( lineNumber: number ): void\r\n {\r\n if ( Number.isNaN( lineNumber ) || lineNumber < 1 || lineNumber > this.doc.lineCount ) return;\r\n\r\n this.cursorSet.set( lineNumber - 1, 0 );\r\n\r\n this._afterCursorMove();\r\n }\r\n\r\n private _encloseSelection( open: string, close: string ): void\r\n {\r\n const cursor = this.cursorSet.getPrimary();\r\n const sel = cursor.anchor;\r\n const head = cursor.head;\r\n\r\n // Normalize selection (old invertIfNecessary)\r\n const fromLine = sel.line < head.line || ( sel.line === head.line && sel.col < head.col ) ? sel : head;\r\n const toLine = fromLine === sel ? head : sel;\r\n\r\n // Only single-line selections for now\r\n if ( fromLine.line !== toLine.line ) return;\r\n\r\n const line = fromLine.line;\r\n const from = fromLine.col;\r\n const to = toLine.col;\r\n\r\n this._flushAction();\r\n\r\n const op1 = this.doc.insert( line, from, open );\r\n this.undoManager.record( op1, this.cursorSet.getCursorPositions() );\r\n const op2 = this.doc.insert( line, to + 1, close );\r\n this.undoManager.record( op2, this.cursorSet.getCursorPositions() );\r\n\r\n // Keep selection on the enclosed word (shifted by 1)\r\n cursor.anchor = { line, col: from + 1 };\r\n cursor.head = { line, col: to + 1 };\r\n\r\n this._updateLine( line );\r\n this._afterCursorMove();\r\n }\r\n\r\n private _doBackspace( ctrlKey: boolean ): void\r\n {\r\n this._flushIfActionChanged( 'backspace' );\r\n\r\n // If any cursor has a selection, delete selections\r\n if ( this.cursorSet.hasSelection() )\r\n {\r\n this._deleteSelectionIfAny();\r\n this._rebuildLines();\r\n this._afterCursorMove();\r\n return;\r\n }\r\n\r\n for ( const idx of this.cursorSet.sortedIndicesBottomUp() )\r\n {\r\n const cursor = this.cursorSet.cursors[idx];\r\n const { line, col } = cursor.head;\r\n\r\n if ( line === 0 && col === 0 ) continue;\r\n\r\n if ( col === 0 )\r\n {\r\n // Merge with previous line\r\n const prevLineLen = this.doc.getLine( line - 1 ).length;\r\n const op = this.doc.delete( line - 1, prevLineLen, 1 );\r\n this.undoManager.record( op, this.cursorSet.getCursorPositions() );\r\n cursor.head = { line: line - 1, col: prevLineLen };\r\n cursor.anchor = { ...cursor.head };\r\n this.cursorSet.adjustOthers( idx, line, 0, prevLineLen, -1 );\r\n }\r\n else if ( ctrlKey )\r\n {\r\n // Delete word left\r\n const [ word, from ] = this.doc.getWordAt( line, col - 1 );\r\n const deleteFrom = word.length > 0 ? from : col - 1;\r\n const deleteLen = col - deleteFrom;\r\n const op = this.doc.delete( line, deleteFrom, deleteLen );\r\n this.undoManager.record( op, this.cursorSet.getCursorPositions() );\r\n cursor.head = { line, col: deleteFrom };\r\n cursor.anchor = { ...cursor.head };\r\n this.cursorSet.adjustOthers( idx, line, col, -deleteLen );\r\n }\r\n else\r\n {\r\n const op = this.doc.delete( line, col - 1, 1 );\r\n this.undoManager.record( op, this.cursorSet.getCursorPositions() );\r\n cursor.head = { line, col: col - 1 };\r\n cursor.anchor = { ...cursor.head };\r\n this.cursorSet.adjustOthers( idx, line, col, -1 );\r\n }\r\n }\r\n\r\n this._rebuildLines();\r\n this._afterCursorMove();\r\n this._doOpenAutocomplete();\r\n }\r\n\r\n private _doDelete( ctrlKey: boolean ): void\r\n {\r\n if ( this.cursorSet.hasSelection() )\r\n {\r\n this._deleteSelectionIfAny();\r\n this._rebuildLines();\r\n this._afterCursorMove();\r\n return;\r\n }\r\n\r\n this._flushIfActionChanged( 'delete' );\r\n\r\n for ( const idx of this.cursorSet.sortedIndicesBottomUp() )\r\n {\r\n const cursor = this.cursorSet.cursors[idx];\r\n const { line, col } = cursor.head;\r\n const lineText = this.doc.getLine( line );\r\n\r\n if ( col >= lineText.length && line >= this.doc.lineCount - 1 ) continue;\r\n\r\n if ( col >= lineText.length )\r\n {\r\n // Merge with next line\r\n const op = this.doc.delete( line, col, 1 );\r\n this.undoManager.record( op, this.cursorSet.getCursorPositions() );\r\n this.cursorSet.adjustOthers( idx, line, col, 0, -1 );\r\n }\r\n else if ( ctrlKey )\r\n {\r\n // Delete word right\r\n const [ word, , end ] = this.doc.getWordAt( line, col );\r\n const deleteLen = word.length > 0 ? end - col : 1;\r\n const op = this.doc.delete( line, col, deleteLen );\r\n this.undoManager.record( op, this.cursorSet.getCursorPositions() );\r\n this.cursorSet.adjustOthers( idx, line, col, -deleteLen );\r\n }\r\n else\r\n {\r\n const op = this.doc.delete( line, col, 1 );\r\n this.undoManager.record( op, this.cursorSet.getCursorPositions() );\r\n this.cursorSet.adjustOthers( idx, line, col, -1 );\r\n }\r\n }\r\n\r\n this._rebuildLines();\r\n this._afterCursorMove();\r\n }\r\n\r\n private _doEnter( shift: boolean ): void\r\n {\r\n if ( this._isAutoCompleteActive )\r\n {\r\n this._doAutocompleteWord();\r\n return;\r\n }\r\n\r\n if ( shift && this.onRun )\r\n {\r\n this.onRun( this.getText(), this );\r\n return;\r\n }\r\n\r\n this._deleteSelectionIfAny();\r\n this._flushAction();\r\n\r\n for ( const idx of this.cursorSet.sortedIndicesBottomUp() )\r\n {\r\n const cursor = this.cursorSet.cursors[idx];\r\n const { line, col } = cursor.head;\r\n\r\n const indent = this.doc.getIndent( line );\r\n const spaces = ' '.repeat( indent );\r\n\r\n const charBefore = this.doc.getCharAt( line, col - 1 );\r\n const charAfter = this.doc.getCharAt( line, col );\r\n\r\n const OPEN_CLOSE: Record<string, string> = { '{': '}', '[': ']', '(': ')' };\r\n if ( charBefore && charAfter && OPEN_CLOSE[ charBefore ] === charAfter )\r\n {\r\n const innerSpaces = ' '.repeat( indent + this.tabSize );\r\n const insertion = '\\n' + innerSpaces + '\\n' + spaces;\r\n const op = this.doc.insert( line, col, insertion );\r\n this.undoManager.record( op, this.cursorSet.getCursorPositions() );\r\n\r\n cursor.head = { line: line + 1, col: indent + this.tabSize };\r\n cursor.anchor = { ...cursor.head };\r\n this.cursorSet.adjustOthers( idx, line, col, 0, 2 );\r\n }\r\n else\r\n {\r\n const op = this.doc.insert( line, col, '\\n' + spaces );\r\n this.undoManager.record( op, this.cursorSet.getCursorPositions() );\r\n\r\n cursor.head = { line: line + 1, col: indent };\r\n cursor.anchor = { ...cursor.head };\r\n this.cursorSet.adjustOthers( idx, line, col, 0, 1 );\r\n }\r\n }\r\n\r\n this._rebuildLines();\r\n this._afterCursorMove();\r\n }\r\n\r\n private _doTab( shift: boolean ): void\r\n {\r\n if ( this._isAutoCompleteActive )\r\n {\r\n this._doAutocompleteWord();\r\n return;\r\n }\r\n\r\n this._flushAction();\r\n\r\n for ( const idx of this.cursorSet.sortedIndicesBottomUp() )\r\n {\r\n const cursor = this.cursorSet.cursors[idx];\r\n const { line, col } = cursor.head;\r\n const anchorLine = cursor.anchor.line;\r\n\r\n // Multiline selection: indent/dedent all lines in the selection\r\n const startLine = Math.min( line, anchorLine );\r\n const endLine = Math.max( line, anchorLine );\r\n const isMultiline = startLine !== endLine;\r\n\r\n if ( isMultiline )\r\n {\r\n for ( let i = startLine; i <= endLine; i++ )\r\n {\r\n if ( shift )\r\n {\r\n const lineText = this.doc.getLine( i );\r\n let spacesToRemove = 0;\r\n while ( spacesToRemove < this.tabSize && spacesToRemove < lineText.length && lineText[spacesToRemove] === ' ' )\r\n {\r\n spacesToRemove++;\r\n }\r\n if ( spacesToRemove > 0 )\r\n {\r\n const op = this.doc.delete( i, 0, spacesToRemove );\r\n this.undoManager.record( op, this.cursorSet.getCursorPositions() );\r\n }\r\n }\r\n else\r\n {\r\n const spaces = ' '.repeat( this.tabSize );\r\n const op = this.doc.insert( i, 0, spaces );\r\n this.undoManager.record( op, this.cursorSet.getCursorPositions() );\r\n }\r\n }\r\n\r\n const delta = shift ? -this.tabSize : this.tabSize;\r\n cursor.head = { line, col: Math.max( 0, col + delta ) };\r\n cursor.anchor = { line: anchorLine, col: Math.max( 0, cursor.anchor.col + delta ) };\r\n }\r\n else if ( shift )\r\n {\r\n // Single line dedent: remove up to tabSize spaces from start\r\n const lineText = this.doc.getLine( line );\r\n let spacesToRemove = 0;\r\n while ( spacesToRemove < this.tabSize && spacesToRemove < lineText.length && lineText[spacesToRemove] === ' ' )\r\n {\r\n spacesToRemove++;\r\n }\r\n if ( spacesToRemove > 0 )\r\n {\r\n const op = this.doc.delete( line, 0, spacesToRemove );\r\n this.undoManager.record( op, this.cursorSet.getCursorPositions() );\r\n cursor.head = { line, col: Math.max( 0, col - spacesToRemove ) };\r\n cursor.anchor = { ...cursor.head };\r\n this.cursorSet.adjustOthers( idx, line, 0, -spacesToRemove );\r\n }\r\n }\r\n else\r\n {\r\n // Single line indent: insert spaces at cursor\r\n const spacesToAdd = this.tabSize - ( col % this.tabSize );\r\n const spaces = ' '.repeat( spacesToAdd );\r\n const op = this.doc.insert( line, col, spaces );\r\n this.undoManager.record( op, this.cursorSet.getCursorPositions() );\r\n cursor.head = { line, col: col + spacesToAdd };\r\n cursor.anchor = { ...cursor.head };\r\n this.cursorSet.adjustOthers( idx, line, col, spacesToAdd );\r\n }\r\n }\r\n\r\n this._rebuildLines();\r\n this._afterCursorMove();\r\n }\r\n\r\n private _deleteSelectionIfAny(): void\r\n {\r\n let anyDeleted = false;\r\n\r\n for ( const idx of this.cursorSet.sortedIndicesBottomUp() )\r\n {\r\n const sel = this.cursorSet.cursors[idx];\r\n if ( selectionIsEmpty( sel ) ) continue;\r\n\r\n const start = selectionStart( sel );\r\n const end = selectionEnd( sel );\r\n const selectedText = this.cursorSet.getSelectedText( this.doc, idx );\r\n if ( !selectedText ) continue;\r\n\r\n const linesRemoved = end.line - start.line;\r\n // not exact for multiline, but start.col is where cursor lands\r\n const colDelta = linesRemoved === 0 ? ( end.col - start.col ) : start.col; \r\n\r\n const op = this.doc.delete( start.line, start.col, selectedText.length );\r\n this.undoManager.record( op, this.cursorSet.getCursorPositions() );\r\n\r\n sel.head = { ...start };\r\n sel.anchor = { ...start };\r\n this.cursorSet.adjustOthers( idx, start.line, start.col, -colDelta, -linesRemoved );\r\n anyDeleted = true;\r\n }\r\n\r\n if ( anyDeleted )\r\n {\r\n this._rebuildLines();\r\n this._doHideAutocomplete();\r\n }\r\n }\r\n\r\n // Clipboard helpers:\r\n\r\n private _doCopy(): void\r\n {\r\n const text = this.cursorSet.getSelectedText( this.doc );\r\n if ( text )\r\n {\r\n navigator.clipboard.writeText( text );\r\n }\r\n }\r\n\r\n private _doCut(): void\r\n {\r\n this._flushAction();\r\n\r\n const text = this.cursorSet.getSelectedText( this.doc );\r\n if ( text )\r\n {\r\n navigator.clipboard.writeText( text );\r\n this._deleteSelectionIfAny();\r\n }\r\n else\r\n {\r\n const cursor = this.cursorSet.getPrimary();\r\n const line = cursor.head.line;\r\n const lineText = this.doc.getLine( line );\r\n const isLastLine = line === this.doc.lineCount - 1;\r\n\r\n navigator.clipboard.writeText( lineText + ( isLastLine ? '' : '\\n' ) );\r\n\r\n \r\n const op = this.doc.removeLine( line );\r\n this.undoManager.record( op, this.cursorSet.getCursorPositions() );\r\n\r\n // Place cursor at col 0 of the resulting line\r\n const newLine = Math.min( line, this.doc.lineCount - 1 );\r\n cursor.head = { line: newLine, col: 0 };\r\n cursor.anchor = { ...cursor.head };\r\n }\r\n\r\n this._rebuildLines();\r\n this._afterCursorMove();\r\n }\r\n\r\n private _swapLine( dir: -1 | 1 ): void\r\n {\r\n const cursor = this.cursorSet.getPrimary();\r\n const line = cursor.head.line;\r\n const targetLine = line + dir;\r\n\r\n if ( targetLine < 0 || targetLine >= this.doc.lineCount ) return;\r\n\r\n const currentText = this.doc.getLine( line );\r\n const targetText = this.doc.getLine( targetLine );\r\n\r\n this._flushAction();\r\n const op1 = this.doc.replaceLine( line, targetText );\r\n this.undoManager.record( op1, this.cursorSet.getCursorPositions() );\r\n const op2 = this.doc.replaceLine( targetLine, currentText );\r\n this.undoManager.record( op2, this.cursorSet.getCursorPositions() );\r\n\r\n cursor.head = { line: targetLine, col: cursor.head.col };\r\n cursor.anchor = { ...cursor.head };\r\n\r\n this._rebuildLines();\r\n this._afterCursorMove();\r\n }\r\n\r\n private _duplicateLine( dir: -1 | 1 ): void\r\n {\r\n const cursor = this.cursorSet.getPrimary();\r\n const line = cursor.head.line;\r\n const text = this.doc.getLine( line );\r\n\r\n this._flushAction();\r\n const op = this.doc.insertLine( line, text );\r\n this.undoManager.record( op, this.cursorSet.getCursorPositions() );\r\n\r\n const newLine = dir === 1 ? line + 1 : line;\r\n cursor.head = { line: newLine, col: cursor.head.col };\r\n cursor.anchor = { ...cursor.head };\r\n\r\n this._rebuildLines();\r\n this._afterCursorMove();\r\n }\r\n\r\n /**\r\n * Normalize external text before inserting into the document:\r\n * - Unify line endings to \\n\r\n * - Replace tab characters with the configured number of spaces\r\n */\r\n private _normalizeText( text: string ): string\r\n {\r\n return text\r\n .replace( /\\r\\n?/g, '\\n' )\r\n .replace( /\\t/g, ' '.repeat( this.tabSize ) );\r\n }\r\n\r\n private async _doPaste(): Promise<void>\r\n {\r\n const raw = await navigator.clipboard.readText();\r\n if ( !raw ) return;\r\n const text = this._normalizeText( raw );\r\n \r\n this._flushAction();\r\n\r\n this._deleteSelectionIfAny();\r\n\r\n const cursor = this.cursorSet.getPrimary();\r\n const op = this.doc.insert( cursor.head.line, cursor.head.col, text );\r\n this.undoManager.record( op, this.cursorSet.getCursorPositions() );\r\n\r\n // Calculate new cursor position after paste\r\n const lines = text.split( '\\n' );\r\n if ( lines.length === 1 )\r\n {\r\n this.cursorSet.set( cursor.head.line, cursor.head.col + text.length );\r\n }\r\n else\r\n {\r\n this.cursorSet.set(\r\n cursor.head.line + lines.length - 1,\r\n lines[ lines.length - 1 ].length\r\n );\r\n }\r\n\r\n this._rebuildLines();\r\n this._afterCursorMove();\r\n }\r\n\r\n // Undo/Redo:\r\n\r\n private _doUndo(): void\r\n {\r\n const result = this.undoManager.undo( this.doc, this.cursorSet.getCursorPositions() );\r\n if ( result )\r\n {\r\n if ( result.cursors.length > 0 )\r\n {\r\n const c = result.cursors[0];\r\n this.cursorSet.set( c.line, c.col );\r\n }\r\n this._rebuildLines();\r\n this._afterCursorMove();\r\n }\r\n }\r\n\r\n private _doRedo(): void\r\n {\r\n const result = this.undoManager.redo( this.doc );\r\n if ( result )\r\n {\r\n if ( result.cursors.length > 0 )\r\n {\r\n const c = result.cursors[0];\r\n this.cursorSet.set( c.line, c.col );\r\n }\r\n this._rebuildLines();\r\n this._afterCursorMove();\r\n }\r\n }\r\n\r\n // Mouse input events:\r\n\r\n private _onMouseDown( e: MouseEvent ): void\r\n {\r\n if ( !this.currentTab ) return;\r\n if ( this.searchBox && this.searchBox.contains( e.target as Node ) ) return;\r\n if ( this.autocomplete && this.autocomplete.contains( e.target as Node ) ) return;\r\n\r\n // Ctrl+click: open link if cursor is over a code-link span\r\n if ( e.ctrlKey && e.button === 0 )\r\n {\r\n const target = e.target as HTMLElement;\r\n const link = target.closest( '.code-link' ) as HTMLElement | null;\r\n if ( link?.dataset.url )\r\n {\r\n window.open( link.dataset.url, '_blank' );\r\n return;\r\n }\r\n }\r\n\r\n e.preventDefault(); // Prevent browser from stealing focus from _inputArea\r\n this._wasPaired = false;\r\n\r\n // Calculate line and column from click position\r\n const rect = this.codeContainer.getBoundingClientRect();\r\n const x = e.clientX - rect.left - this.xPadding;\r\n const y = e.clientY - rect.top;\r\n\r\n const line = LX.clamp( Math.floor( y / this.lineHeight ), 0, this.doc.lineCount - 1 );\r\n const col = LX.clamp( Math.round( x / this.charWidth ), 0, this.doc.getLine( line ).length );\r\n\r\n if( e.type === 'contextmenu' )\r\n {\r\n this._onContextMenu( e, line, col );\r\n return;\r\n }\r\n\r\n if ( e.button !== 0 ) return;\r\n\r\n const now = Date.now();\r\n if ( now - this._lastClickTime < 400 && line === this._lastClickLine )\r\n {\r\n this._clickCount = Math.min( this._clickCount + 1, 3 );\r\n }\r\n else\r\n {\r\n this._clickCount = 1;\r\n }\r\n\r\n this._lastClickTime = now;\r\n this._lastClickLine = line;\r\n\r\n // Triple click: select entire line\r\n if ( this._clickCount === 3 )\r\n {\r\n const sel = this.cursorSet.getPrimary();\r\n sel.anchor = { line, col: 0 };\r\n sel.head = { line, col: this.doc.getLine( line ).length };\r\n }\r\n // Double click: select word\r\n else if ( this._clickCount === 2 )\r\n {\r\n const [ , start, end ] = this.doc.getWordAt( line, col );\r\n const sel = this.cursorSet.getPrimary();\r\n sel.anchor = { line, col: start };\r\n sel.head = { line, col: end };\r\n }\r\n else if ( e.shiftKey )\r\n {\r\n // Extend selection\r\n const sel = this.cursorSet.getPrimary();\r\n sel.head = { line, col };\r\n }\r\n else\r\n {\r\n this.cursorSet.set( line, col );\r\n }\r\n\r\n this._afterCursorMove();\r\n this._inputArea.focus();\r\n\r\n // Track mouse for drag selection\r\n const onMouseMove = ( me: MouseEvent ) =>\r\n {\r\n const mx = me.clientX - rect.left - this.xPadding;\r\n const my = me.clientY - rect.top;\r\n const ml = Math.max( 0, Math.min( Math.floor( my / this.lineHeight ), this.doc.lineCount - 1 ) );\r\n const mc = Math.max( 0, Math.min( Math.round( mx / this.charWidth ), this.doc.getLine( ml ).length ) );\r\n\r\n const sel = this.cursorSet.getPrimary();\r\n sel.head = { line: ml, col: mc };\r\n this._renderCursors();\r\n this._renderSelections();\r\n };\r\n\r\n const onMouseUp = () =>\r\n {\r\n document.removeEventListener( 'mousemove', onMouseMove );\r\n document.removeEventListener( 'mouseup', onMouseUp );\r\n };\r\n\r\n document.addEventListener( 'mousemove', onMouseMove );\r\n document.addEventListener( 'mouseup', onMouseUp );\r\n }\r\n\r\n private _onContextMenu( e: MouseEvent, line: number, col: number ): void\r\n {\r\n e.preventDefault();\r\n \r\n // if ( !this.canOpenContextMenu )\r\n // {\r\n // return;\r\n // }\r\n\r\n const dmOptions: any[] = [ { name: 'Copy', icon: 'Copy', callback: () => this._doCopy(), kbd: ['Ctrl', 'C'], useKbdSpecialKeys: false } ];\r\n\r\n if ( !this.disableEdition )\r\n {\r\n dmOptions.push( { name: 'Cut', icon: 'Scissors', callback: () => this._doCut(), kbd: ['Ctrl', 'X'], useKbdSpecialKeys: false } );\r\n dmOptions.push( { name: 'Paste', icon: 'Paste', callback: () => this._doPaste(), kbd: ['Ctrl', 'V'], useKbdSpecialKeys: false } );\r\n }\r\n\r\n if ( this.onContextMenu )\r\n {\r\n const content = this.cursorSet.getSelectedText( this.doc );\r\n const options = this.onContextMenu( this, content, e );\r\n if ( options?.length )\r\n {\r\n dmOptions.push( null ); // Separator\r\n\r\n for ( const o of options )\r\n {\r\n dmOptions.push( { name: o.path, disabled: o.disabled, callback: o.callback } );\r\n }\r\n }\r\n }\r\n\r\n LX.addDropdownMenu( e.target, dmOptions, { event: e, side: 'bottom', align: 'start' } );\r\n }\r\n\r\n // Autocomplete:\r\n\r\n /**\r\n * Get word at cursor position for autocomplete.\r\n */\r\n private _getWordAtCursor(): { word: string, start: number, end: number }\r\n {\r\n const cursor = this.cursorSet.getPrimary().head;\r\n const line = this.doc.getLine( cursor.line );\r\n let start = cursor.col;\r\n let end = cursor.col;\r\n\r\n // Find word boundaries\r\n while ( start > 0 && /[\\w$]/.test( line[start - 1] ) ) start--;\r\n while ( end < line.length && /[\\w$]/.test( line[end] ) ) end++;\r\n\r\n return { word: line.slice( start, end ), start, end };\r\n }\r\n\r\n /**\r\n * Open autocomplete box with suggestions from symbols and custom suggestions.\r\n */\r\n private _doOpenAutocomplete(): void\r\n {\r\n if ( !this.autocomplete || !this.useAutoComplete ) return;\r\n\r\n this.autocomplete.innerHTML = ''; // Clear all suggestions\r\n\r\n const { word } = this._getWordAtCursor();\r\n if( !word || word.length === 0 )\r\n {\r\n this._doHideAutocomplete();\r\n return;\r\n }\r\n\r\n const suggestions: CodeSuggestion[] = [];\r\n const added = new Set<string>();\r\n\r\n const addSuggestion = ( s: CodeSuggestion ) =>\r\n {\r\n if ( !added.has( s.label ) )\r\n {\r\n suggestions.push( s );\r\n added.add( s.label );\r\n }\r\n };\r\n\r\n const filterSuggestion = ( suggestion: CodeSuggestion, word: string ): boolean =>\r\n {\r\n const w = word.toLowerCase();\r\n if ( suggestion.filterText )\r\n {\r\n return suggestion.filterText.split( ' ' ).some( token => token.toLowerCase().trim().startsWith( w ) );\r\n }\r\n return suggestion.label.toLowerCase().startsWith( w );\r\n };\r\n\r\n // Get first suggestions from symbol table\r\n const allSymbols = this.symbolTable.getAllSymbols();\r\n for ( const symbol of allSymbols )\r\n {\r\n const s: CodeSuggestion = { label: symbol.name, kind: symbol.kind, scope: symbol.scope, detail: `${symbol.kind} in ${symbol.scope}` };\r\n if ( filterSuggestion( s, word ) ) addSuggestion( s );\r\n }\r\n\r\n // Add language reserved keys\r\n for ( const reservedWord of this.language.reservedWords )\r\n {\r\n const s: CodeSuggestion = { label: reservedWord };\r\n if ( filterSuggestion( s, word ) ) addSuggestion( s );\r\n }\r\n\r\n // Add custom suggestions\r\n for ( const suggestion of this.customSuggestions )\r\n {\r\n if ( filterSuggestion( suggestion, word ) ) addSuggestion( suggestion );\r\n }\r\n\r\n if ( suggestions.length === 0 )\r\n {\r\n this._doHideAutocomplete();\r\n return;\r\n }\r\n\r\n // Sort suggestions: exact matches first, then by sortText (or label if absent)\r\n const w = word.toLowerCase();\r\n suggestions.sort( ( a, b ) =>\r\n {\r\n const aKey = ( a.sortText ?? a.label ).toLowerCase();\r\n const bKey = ( b.sortText ?? b.label ).toLowerCase();\r\n const aExact = aKey === w ? 0 : 1;\r\n const bExact = bKey === w ? 0 : 1;\r\n if ( aExact !== bExact ) return aExact - bExact;\r\n return aKey.localeCompare( bKey );\r\n } );\r\n\r\n this._selectedAutocompleteIndex = 0;\r\n\r\n // Render suggestions\r\n suggestions.forEach( ( suggestion, index ) =>\r\n {\r\n const item = document.createElement( 'pre' );\r\n ( item as any ).insertText = suggestion.insertText ?? suggestion.label;\r\n if ( index === this._selectedAutocompleteIndex ) item.classList.add( 'selected' );\r\n const currSuggestionLabel = suggestion.label;\r\n\r\n let iconName = suggestion.icon ?? 'CaseLower';\r\n let iconClass = suggestion.iconClass ?? 'text-gray-500';\r\n\r\n switch ( suggestion.kind )\r\n {\r\n case 'class':\r\n iconName = 'CircleNodes';\r\n iconClass = 'text-orange-500';\r\n break;\r\n case 'struct':\r\n iconName = 'Form';\r\n iconClass = 'text-orange-400';\r\n break;\r\n case 'interface':\r\n iconName = 'FileType';\r\n iconClass = 'text-cyan-500';\r\n break;\r\n case 'enum':\r\n iconName = 'ListTree';\r\n iconClass = 'text-yellow-500';\r\n break;\r\n case 'enum-value':\r\n iconName = 'Dot';\r\n iconClass = 'text-yellow-400';\r\n break;\r\n case 'type':\r\n iconName = 'Type';\r\n iconClass = 'text-teal-500';\r\n break;\r\n case 'function':\r\n iconName = 'Function';\r\n iconClass = 'text-purple-500';\r\n break;\r\n case 'method':\r\n iconName = 'Box';\r\n iconClass = 'text-fuchsia-500';\r\n break;\r\n case 'variable':\r\n iconName = 'Cuboid';\r\n iconClass = 'text-blue-400';\r\n break;\r\n case 'property':\r\n iconName = 'Layers';\r\n iconClass = 'text-blue-300';\r\n break;\r\n case 'constructor-call':\r\n iconName = 'Hammer';\r\n iconClass = 'text-green-500';\r\n break;\r\n case 'method-call':\r\n iconName = 'Parentheses';\r\n iconClass = 'text-gray-400';\r\n break;\r\n }\r\n\r\n item.appendChild( LX.makeIcon( iconName, { iconClass: 'ml-1 mr-2', svgClass: 'sm ' + iconClass } ) );\r\n\r\n // Highlight the written part\r\n const hIndex = currSuggestionLabel.toLowerCase().indexOf( word.toLowerCase() );\r\n\r\n var preWord = document.createElement( 'span' );\r\n preWord.textContent = currSuggestionLabel.substring( 0, hIndex );\r\n item.appendChild( preWord );\r\n\r\n var actualWord = document.createElement( 'span' );\r\n actualWord.textContent = currSuggestionLabel.substring( hIndex, hIndex + word.length );\r\n actualWord.classList.add( 'word-highlight' );\r\n item.appendChild( actualWord );\r\n\r\n var postWord = document.createElement( 'span' );\r\n postWord.textContent = currSuggestionLabel.substring( hIndex + word.length );\r\n item.appendChild( postWord );\r\n\r\n if ( suggestion.kind )\r\n {\r\n const kind = document.createElement( 'span' );\r\n kind.textContent = ` (${suggestion.kind})`;\r\n kind.className = 'kind text-muted-foreground text-xs! ml-2';\r\n item.appendChild( kind );\r\n }\r\n\r\n item.addEventListener( 'click', () =>\r\n {\r\n this._doAutocompleteWord();\r\n } );\r\n\r\n this.autocomplete!.appendChild( item );\r\n } );\r\n\r\n this._isAutoCompleteActive = true;\r\n\r\n const handleClick = ( e: MouseEvent ) =>\r\n {\r\n if ( !this.autocomplete?.contains( e.target as Node ) )\r\n {\r\n this._doHideAutocomplete();\r\n }\r\n };\r\n setTimeout( () => document.addEventListener( 'click', handleClick, { once: true } ), 0 );\r\n\r\n // Store cleanup function\r\n ( this.autocomplete as any )._cleanup = () =>\r\n {\r\n document.removeEventListener( 'click', handleClick );\r\n };\r\n\r\n // Prepare autocomplete ui\r\n this.autocomplete.classList.toggle( 'show', true );\r\n this.autocomplete.classList.toggle( 'no-scrollbar', !( this.autocomplete.scrollHeight > this.autocomplete.offsetHeight ) );\r\n const cursor = this.cursorSet.getPrimary().head;\r\n const left = cursor.col * this.charWidth + this.xPadding;\r\n const top = ( cursor.line + 1 ) * this.lineHeight + this._cachedTabsHeight - this.codeScroller.scrollTop;\r\n this.autocomplete.style.left = left + 'px';\r\n this.autocomplete.style.top = top + 'px';\r\n }\r\n\r\n private _doHideAutocomplete(): void\r\n {\r\n if ( !this.autocomplete || !this._isAutoCompleteActive ) return;\r\n\r\n this.autocomplete.innerHTML = ''; // Clear all suggestions\r\n this.autocomplete.classList.remove( 'show' );\r\n this._isAutoCompleteActive = false;\r\n\r\n if ( ( this.autocomplete as any )._cleanup )\r\n {\r\n ( this.autocomplete as any )._cleanup();\r\n delete ( this.autocomplete as any )._cleanup;\r\n }\r\n }\r\n\r\n /**\r\n * Insert the selected autocomplete word at cursor.\r\n */\r\n private _doAutocompleteWord(): void\r\n {\r\n const text = this._getSelectedAutoCompleteWord();\r\n if ( !text ) return;\r\n const cursor = this.cursorSet.getPrimary().head;\r\n const { start, end } = this._getWordAtCursor();\r\n const line = cursor.line;\r\n\r\n const cursorsBefore = this.cursorSet.getCursorPositions();\r\n if ( end > start )\r\n {\r\n const deleteOp = this.doc.delete( line, start, end - start );\r\n this.undoManager.record( deleteOp, cursorsBefore );\r\n }\r\n\r\n const insertOp = this.doc.insert( line, start, text );\r\n const insertedLines = text.split( /\\r?\\n/ );\r\n if ( insertedLines.length === 1 )\r\n {\r\n this.cursorSet.set( line, start + text.length );\r\n }\r\n else\r\n {\r\n this.cursorSet.set( line + insertedLines.length - 1, insertedLines[ insertedLines.length - 1 ].length );\r\n }\r\n\r\n const cursorsAfter = this.cursorSet.getCursorPositions();\r\n this.undoManager.record( insertOp, cursorsAfter );\r\n\r\n this._rebuildLines();\r\n this._afterCursorMove();\r\n this._doHideAutocomplete();\r\n }\r\n\r\n private _getSelectedAutoCompleteWord(): string | null\r\n {\r\n if ( !this.autocomplete || !this._isAutoCompleteActive ) return null;\r\n const pre: any = this.autocomplete.childNodes[ this._selectedAutocompleteIndex ];\r\n return pre.insertText;\r\n }\r\n\r\n private _afterCursorMove(): void\r\n {\r\n this._renderCursors();\r\n this._renderSelections();\r\n this._resetBlinker();\r\n this.resize();\r\n this._scrollCursorIntoView();\r\n this._updateBracketHighlight();\r\n }\r\n\r\n /**\r\n * Returns the scope stack at the exact cursor position (line + column).\r\n * Basically starts from getScopeAtLine and then counts real braces up to the cursor column.\r\n */\r\n private _getScopeAtCursor(): ScopeInfo[]\r\n {\r\n const cursor = this.cursorSet.getPrimary().head;\r\n const line = cursor.line;\r\n const col = cursor.col;\r\n const lineText = this.doc.getLine( line );\r\n\r\n const scopeStack: ScopeInfo[] = [ ...this.symbolTable.getScopeAtLine( line ) ];\r\n\r\n let i = 0;\r\n let inString = false;\r\n let stringCh = '';\r\n\r\n while ( i < col && i < lineText.length )\r\n {\r\n const ch = lineText[ i ];\r\n\r\n if ( inString )\r\n {\r\n if ( ch === '\\\\' ) { i += 2; continue; }\r\n if ( ch === stringCh ) inString = false;\r\n i++;\r\n continue;\r\n }\r\n\r\n if ( ch === '/' && lineText[ i + 1 ] === '/' ) break;\r\n if ( ch === '/' && lineText[ i + 1 ] === '*' )\r\n {\r\n i += 2;\r\n while ( i < col && !( lineText[ i ] === '*' && lineText[ i + 1 ] === '/' ) ) i++;\r\n i += 2;\r\n continue;\r\n }\r\n if ( ch === '\"' || ch === \"'\" || ch === '`' )\r\n {\r\n inString = true;\r\n stringCh = ch;\r\n i++;\r\n continue;\r\n }\r\n if ( ch === '{' )\r\n {\r\n scopeStack.push( { name: 'anonymous', type: 'anonymous', line } );\r\n }\r\n else if ( ch === '}' && scopeStack.length > 1 )\r\n {\r\n scopeStack.pop();\r\n }\r\n i++;\r\n }\r\n\r\n return scopeStack;\r\n }\r\n\r\n private _updateBracketHighlight(): void\r\n {\r\n const scopes = this._getScopeAtCursor();\r\n\r\n // Find innermost non-global scope\r\n let innermost: ScopeInfo | null = null;\r\n for ( let i = scopes.length - 1; i >= 0; i-- )\r\n {\r\n if ( scopes[i].type !== 'global' )\r\n {\r\n innermost = scopes[i];\r\n break;\r\n }\r\n }\r\n\r\n const prevOpen = this._bracketOpenLine;\r\n const prevClose = this._bracketCloseLine;\r\n\r\n if ( !innermost )\r\n {\r\n this._bracketOpenLine = -1;\r\n this._bracketCloseLine = -1;\r\n }\r\n else\r\n {\r\n const openLine = innermost.line;\r\n const targetDepth = scopes.length; // depth including the innermost scope\r\n\r\n // Closing line: last line where scope depth >= targetDepth\r\n let closeLine = openLine;\r\n for ( let i = openLine + 1; i < this.doc.lineCount; i++ )\r\n {\r\n if ( this.symbolTable.getScopeAtLine( i ).length >= targetDepth ) closeLine = i;\r\n else break;\r\n }\r\n\r\n this._bracketOpenLine = openLine;\r\n this._bracketCloseLine = closeLine;\r\n }\r\n\r\n // Re-render only the lines that changed\r\n const linesToUpdate = new Set<number>();\r\n if ( prevOpen !== this._bracketOpenLine ) { linesToUpdate.add( prevOpen ); linesToUpdate.add( this._bracketOpenLine ); }\r\n if ( prevClose !== this._bracketCloseLine ) { linesToUpdate.add( prevClose ); linesToUpdate.add( this._bracketCloseLine ); }\r\n\r\n for ( const line of linesToUpdate )\r\n {\r\n if ( line >= 0 && line < this.doc.lineCount ) this._updateLine( line );\r\n }\r\n }\r\n\r\n // Color picker:\r\n\r\n private _onColorSwatchClick( e: MouseEvent ): void\r\n {\r\n const span = ( e.target as HTMLElement ).closest( '.code-color' ) as HTMLElement | null;\r\n if ( !span ) return;\r\n\r\n e.stopPropagation();\r\n e.preventDefault();\r\n\r\n const colorValue = span.dataset.color!;\r\n const lineIndex = parseInt( span.dataset.line! );\r\n const colStart = parseInt( span.dataset.col! );\r\n let currentLen = colorValue.length;\r\n\r\n if ( this._colorPopover ) { this._colorPopover.destroy(); this._colorPopover = null; }\r\n\r\n const picker = new ( LX as any ).ColorPicker( colorValue, {\r\n colorModel: 'Hex',\r\n onChange: ( color: any ) =>\r\n {\r\n // Generate a hex string matching the original length (# + 3/4/6/8 hex chars)\r\n const raw = color.hex.replace( /^#/, '' );\r\n const digits = currentLen - 1;\r\n const newHex = '#' + ( digits <= 4\r\n ? raw.slice( 0, digits ).padEnd( digits, '0' )\r\n : raw.slice( 0, Math.min( digits, 8 ) ).padEnd( digits, '0' ) );\r\n\r\n const lineText = this.doc.getLine( lineIndex );\r\n if ( lineText.slice( colStart, colStart + currentLen ) !== span.dataset.color ) return;\r\n\r\n const delOp = this.doc.delete( lineIndex, colStart, currentLen );\r\n this.undoManager.record( delOp, this.cursorSet.getCursorPositions() );\r\n const insOp = this.doc.insert( lineIndex, colStart, newHex );\r\n this.undoManager.record( insOp, this.cursorSet.getCursorPositions() );\r\n\r\n this._updateLine( lineIndex );\r\n currentLen = newHex.length;\r\n span.dataset.color = newHex;\r\n span.dataset.col = String( colStart );\r\n span.style.setProperty( '--code-color', newHex );\r\n }\r\n } );\r\n\r\n this._colorPopover = new ( LX as any ).Popover( span, [ picker ], { side: 'bottom', align: 'start', sideOffset: 4 } );\r\n }\r\n\r\n // Symbol hover:\r\n\r\n /**\r\n * Extracts the parameter list from a function/method declaration line.\r\n */\r\n private _getSymbolParams( symLine: number ): string\r\n {\r\n if ( symLine < 0 || symLine >= this.doc.lineCount ) return '()';\r\n const m = this.doc.getLine( symLine ).match( /\\(([^)]*)\\)/ );\r\n return m ? `(${ m[1].trim() })` : '()';\r\n }\r\n\r\n /**\r\n * Starting from the line where a class is defined, scans forward to find\r\n * the constructor signature and returns its parameter list.\r\n */\r\n private _findConstructorParams( classLine: number ): string | null\r\n {\r\n const classDepth = this.symbolTable.getScopeAtLine( classLine ).length;\r\n const maxScan = Math.min( classLine + 50, this.doc.lineCount );\r\n\r\n for ( let i = classLine + 1; i < maxScan; i++ )\r\n {\r\n if ( this.symbolTable.getScopeAtLine( i ).length < classDepth + 1 ) break;\r\n\r\n const m = this.doc.getLine( i ).match( /\\bconstructor\\s*\\(([^)]*)\\)/ );\r\n if ( m ) return `(${ m[1].trim() })`;\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Given multiple symbols with the same name, pick the most likely one for\r\n * the hovered position using the available context data.\r\n */\r\n private _pickBestSymbol( symbols: Symbol[], word: string, tokenType: string, lineText: string, hoveredLine: number ): Symbol\r\n {\r\n if ( symbols.length === 1 ) return symbols[0];\r\n\r\n const curScopes = this.symbolTable.getScopeAtLine( hoveredLine );\r\n const curScope = [ ...curScopes ].reverse().find( s => s.type !== 'global' )?.name ?? 'global';\r\n\r\n const wordEsc = word.replace( /[.*+?^${}()|[\\]\\\\]/g, '\\\\$&' );\r\n const isNewCall = new RegExp( `\\\\bnew\\\\s+${wordEsc}\\\\b` ).test( lineText );\r\n const isFuncCall = new RegExp( `\\\\b${wordEsc}\\\\s*[(<]` ).test( lineText );\r\n const isTypeAnno = new RegExp( `(?::\\\\s*|<\\\\s*|[,>]\\\\s*)${wordEsc}\\\\b` ).test( lineText );\r\n\r\n const typeKinds = new Set( [ 'class', 'interface', 'type', 'enum', 'struct' ] );\r\n const funcKinds = new Set( [ 'function', 'method' ] );\r\n\r\n const scored = symbols.map( sym =>\r\n {\r\n let score = 0;\r\n\r\n // Defined in the current innermost scope\r\n if ( sym.scope === curScope ) score += 5;\r\n\r\n // Check token type\r\n if ( tokenType === 'method' && funcKinds.has( sym.kind ) ) score += 3;\r\n if ( tokenType === 'type' && typeKinds.has( sym.kind ) ) score += 3;\r\n\r\n // Hovered-line context patterns\r\n if ( isNewCall && sym.kind === 'constructor-call' ) score += 20;\r\n if ( isNewCall && sym.kind === 'class' ) score += 3;\r\n if ( isFuncCall && funcKinds.has( sym.kind ) ) score += 3;\r\n if ( isTypeAnno && typeKinds.has( sym.kind ) ) score += 2;\r\n\r\n // Validate kind based on symbol declaration line\r\n if ( sym.line >= 0 && sym.line < this.doc.lineCount )\r\n {\r\n const declLine = this.doc.getLine( sym.line );\r\n if ( /\\bfunction\\b/.test( declLine ) && funcKinds.has( sym.kind ) ) score += 4;\r\n if ( /\\bclass\\b/.test( declLine ) && sym.kind === 'class' ) score += 4;\r\n if ( /\\binterface\\b/.test( declLine )&& sym.kind === 'interface' ) score += 4;\r\n if ( /\\btype\\b/.test( declLine ) && sym.kind === 'type' ) score += 4;\r\n if ( /\\benum\\b/.test( declLine ) && sym.kind === 'enum' ) score += 4;\r\n if ( /\\b(?:const|let|var)\\b/.test( declLine ) && sym.kind === 'variable' ) score += 3;\r\n }\r\n\r\n // Order also by line proximity\r\n const dist = Math.abs( sym.line - hoveredLine );\r\n score += Math.max( 0, 4 - Math.floor( dist / 20 ) );\r\n\r\n return { sym, score };\r\n } );\r\n\r\n scored.sort( ( a, b ) => b.score - a.score );\r\n return scored[0].sym;\r\n }\r\n\r\n private _clearHoverPopup(): void\r\n {\r\n if ( this._hoverTimer ) { clearTimeout( this._hoverTimer ); this._hoverTimer = null; }\r\n if ( this._hoverPopup ) { this._hoverPopup.remove(); this._hoverPopup = null; }\r\n this._hoverWord = '';\r\n }\r\n\r\n private _onCodeAreaMouseMove( e: MouseEvent ): void\r\n {\r\n // Only show hover when no button is pressed (no dragging)\r\n if ( e.buttons !== 0 ) { this._clearHoverPopup(); return; }\r\n\r\n const rect = this.codeContainer.getBoundingClientRect();\r\n const x = e.clientX - rect.left - this.xPadding;\r\n const y = e.clientY - rect.top;\r\n const line = LX.clamp( Math.floor( y / this.lineHeight ), 0, this.doc.lineCount - 1 );\r\n const col = LX.clamp( Math.round( x / this.charWidth ), 0, this.doc.getLine( line ).length );\r\n\r\n const [ word, wordStart ] = this.doc.getWordAt( line, col );\r\n\r\n if ( !word || word === this._hoverWord ) return;\r\n\r\n this._clearHoverPopup();\r\n\r\n if ( !word.trim() ) return;\r\n\r\n this._hoverWord = word;\r\n\r\n this._hoverTimer = setTimeout( () =>\r\n {\r\n this._hoverTimer = null;\r\n\r\n const prevState = line > 0 ? ( this._lineStates[ line - 1 ] ?? Tokenizer.initialState() ) : Tokenizer.initialState();\r\n const { tokens } = Tokenizer.tokenizeLine( this.doc.getLine( line ), this.language, prevState );\r\n let tokenType = 'text';\r\n let charPos = 0;\r\n for ( const tok of tokens )\r\n {\r\n // Use wordStart (not col) so boundary positions like col=wordEnd don't fall into the next token\r\n if ( wordStart >= charPos && wordStart < charPos + tok.value.length ) { tokenType = tok.type; break; }\r\n charPos += tok.value.length;\r\n }\r\n\r\n if ( tokenType === 'comment' || tokenType === 'string' || tokenType === 'number' ) return;\r\n\r\n const symbols = this.symbolTable.getSymbols( word );\r\n const info: HoverSymbolInfo = { word, tokenType, symbols };\r\n\r\n let userContent: string | HTMLElement | null | undefined;\r\n if ( this.onHoverSymbol ) userContent = this.onHoverSymbol( info, this );\r\n\r\n // No popup if user explicitly returns null\r\n if ( userContent === null ) return;\r\n\r\n const hasSymbols = symbols.length > 0;\r\n if ( !userContent && !hasSymbols ) return;\r\n\r\n const popup = this._hoverPopup = LX.makeElement( 'div', 'code-hover-popup [&_span]:text-sm' );\r\n\r\n if ( userContent )\r\n {\r\n if ( typeof userContent === 'string' )\r\n popup.innerHTML = userContent;\r\n else\r\n popup.appendChild( userContent );\r\n }\r\n else\r\n {\r\n const sym = this._pickBestSymbol( symbols, word, tokenType, this.doc.getLine( line ), line );\r\n let kindLabel = sym.kind;\r\n let nameLabel = `<span class=\"font-semibold\">${word}</span>`;\r\n\r\n if ( sym.kind === 'constructor-call' )\r\n {\r\n const classSym = this.symbolTable.getSymbols( word ).find( s => s.kind === 'class' );\r\n const params = classSym != null ? ( this._findConstructorParams( classSym.line ) ?? '()' ) : '()';\r\n kindLabel = 'constructor';\r\n nameLabel = `${nameLabel}<span class=\"text-muted-foreground\">${params}</span>`;\r\n }\r\n else if ( sym.kind === 'function' )\r\n {\r\n const params = this._getSymbolParams( sym.line );\r\n nameLabel = `${nameLabel}<span class=\"text-muted-foreground\">${params}</span>`;\r\n }\r\n else if( sym.scope && sym.scope !== 'global' && sym.scope !== 'anonymous' )\r\n {\r\n if ( sym.kind === 'property' || sym.kind === 'method' )\r\n {\r\n const scopePrefix = `<span class=\"text-muted-foreground\">${sym.scope}.</span>`;\r\n if ( sym.kind === 'method' )\r\n {\r\n const params = this._getSymbolParams( sym.line );\r\n nameLabel = `${scopePrefix}${nameLabel}<span class=\"text-muted-foreground\">${params}</span>`;\r\n }\r\n else\r\n {\r\n nameLabel = `${scopePrefix}${nameLabel}`;\r\n }\r\n }\r\n else if ( sym.kind === 'variable' )\r\n {\r\n // Only prefix the scope when the variable is a member (class/interface/struct field)\r\n const declScopes = this.symbolTable.getScopeAtLine( sym.line );\r\n const scopeEntry = declScopes.find( s => s.name === sym.scope );\r\n const memberTypes = new Set( [ 'class', 'interface', 'struct' ] );\r\n if ( scopeEntry && memberTypes.has( scopeEntry.type ) )\r\n {\r\n nameLabel = `<span class=\"text-muted-foreground\">${sym.scope}.</span>${ nameLabel }`;\r\n }\r\n }\r\n }\r\n\r\n popup.innerHTML = `<span class=\"text-info\">(${kindLabel})</span> ${nameLabel}`;\r\n }\r\n\r\n document.body.appendChild( popup );\r\n\r\n // Position just below the hovered word\r\n const lineEl = this._lineElements[ line ];\r\n if ( lineEl )\r\n {\r\n const elRect = lineEl.getBoundingClientRect();\r\n const leftPx = elRect.left + this.xPadding + col * this.charWidth;\r\n const topPx = elRect.bottom + 4;\r\n popup.style.left = Math.min( leftPx, window.innerWidth - popup.offsetWidth - 8 ) + 'px';\r\n popup.style.top = topPx + 'px';\r\n }\r\n }, 500 );\r\n }\r\n\r\n // Scrollbar & Resize:\r\n\r\n private _scrollCursorIntoView(): void\r\n {\r\n const cursor = this.cursorSet.getPrimary().head;\r\n const top = cursor.line * this.lineHeight;\r\n const left = cursor.col * this.charWidth;\r\n\r\n // Vertical scroll\r\n if ( top < this.codeScroller.scrollTop )\r\n {\r\n this.codeScroller.scrollTop = top;\r\n }\r\n else if ( top + this.lineHeight > this.codeScroller.scrollTop + this.codeScroller.clientHeight )\r\n {\r\n this.codeScroller.scrollTop = top + this.lineHeight - this.codeScroller.clientHeight;\r\n }\r\n\r\n // Horizontal scroll\r\n const sbOffset = ScrollBar.SIZE * 2;\r\n if ( left < this.codeScroller.scrollLeft )\r\n {\r\n this.codeScroller.scrollLeft = left;\r\n }\r\n else if ( left + sbOffset > this.codeScroller.scrollLeft + this.codeScroller.clientWidth - this.xPadding )\r\n {\r\n this.codeScroller.scrollLeft = left + sbOffset - this.codeScroller.clientWidth + this.xPadding;\r\n }\r\n }\r\n\r\n private _resetGutter(): void\r\n {\r\n // Use cached value or compute if not available (e.g., on initial load)\r\n const tabsHeight = this._cachedTabsHeight || ( this.tabs?.root.getBoundingClientRect().height ?? 0 );\r\n const statusPanelHeight = this._cachedStatusPanelHeight || ( this.statusPanel?.root.getBoundingClientRect().height ?? 0 );\r\n this.lineGutter.style.height = `calc(100% - ${tabsHeight + statusPanelHeight}px)`;\r\n }\r\n\r\n getMaxLineLength(): number\r\n {\r\n if ( !this.currentTab ) return 0;\r\n\r\n let max = 0;\r\n for ( let i = 0; i < this.doc.lineCount; i++ )\r\n {\r\n const len = this.doc.getLine( i ).length;\r\n if ( len > max ) max = len;\r\n }\r\n return max;\r\n }\r\n\r\n resize( force: boolean = false ): void\r\n {\r\n if ( !this.charWidth ) return;\r\n\r\n // Cache layout measurements to avoid reflows\r\n this._cachedTabsHeight = this.tabs?.root.getBoundingClientRect().height ?? 0;\r\n this._cachedStatusPanelHeight = this.statusPanel?.root.getBoundingClientRect().height ?? 0;\r\n\r\n const maxLineLength = this.getMaxLineLength();\r\n const lineCount = this.currentTab ? this.doc.lineCount : 0;\r\n const viewportChars = Math.floor( ( this.codeScroller.clientWidth - this.xPadding ) / this.charWidth );\r\n const viewportLines = Math.floor( this.codeScroller.clientHeight / this.lineHeight );\r\n\r\n let needsHResize = maxLineLength !== this._lastMaxLineLength\r\n && ( maxLineLength >= viewportChars || this._lastMaxLineLength >= viewportChars );\r\n let needsVResize = lineCount !== this._lastLineCount\r\n && ( lineCount >= viewportLines || this._lastLineCount >= viewportLines );\r\n\r\n\r\n // If doesn't need resize due to not reaching min length, maybe we need to resize if the content shrinks and we have extra space now\r\n needsHResize = needsHResize || ( maxLineLength < viewportChars && this.hScrollbar?.visible );\r\n needsVResize = needsVResize || ( lineCount < viewportLines && this.vScrollbar?.visible );\r\n\r\n if ( !force && !needsHResize && !needsVResize ) return;\r\n\r\n this._lastMaxLineLength = maxLineLength;\r\n this._lastLineCount = lineCount;\r\n\r\n if ( force || needsHResize )\r\n {\r\n this.codeSizer.style.minWidth = ( maxLineLength * this.charWidth + this.xPadding + ScrollBar.SIZE * 2 ) + 'px';\r\n }\r\n\r\n if ( force || needsVResize )\r\n {\r\n this.codeSizer.style.minHeight = ( lineCount * this.lineHeight + ScrollBar.SIZE * 2 ) + 'px';\r\n }\r\n\r\n this._resetGutter();\r\n\r\n setTimeout( () => this._resizeScrollBars(), 10 );\r\n }\r\n\r\n private _resizeScrollBars(): void\r\n {\r\n if ( !this.vScrollbar ) return;\r\n\r\n // Use cached offsets to avoid reflows\r\n const topOffset = this._cachedTabsHeight;\r\n const bottomOffset = this._cachedStatusPanelHeight;\r\n\r\n // Vertical scrollbar: right edge, between tabs and status bar\r\n const scrollHeight = this.codeScroller.scrollHeight;\r\n this.vScrollbar.setThumbRatio( scrollHeight > 0 ? this.codeScroller.clientHeight / scrollHeight : 1 );\r\n this.vScrollbar.root.style.top = topOffset + 'px';\r\n this.vScrollbar.root.style.height = `calc(100% - ${topOffset + bottomOffset}px)`;\r\n\r\n // Horizontal scrollbar: bottom of code area, offset by gutter and vertical scrollbar\r\n const scrollWidth = this.codeScroller.scrollWidth;\r\n this.hScrollbar.setThumbRatio( scrollWidth > 0 ? this.codeScroller.clientWidth / scrollWidth : 1 );\r\n this.hScrollbar.root.style.bottom = bottomOffset + 'px';\r\n this.hScrollbar.root.style.width = `calc(100% - ${this.xPadding + ( this.vScrollbar.visible ? ScrollBar.SIZE : 0 )}px)`;\r\n }\r\n\r\n private _syncScrollBars(): void\r\n {\r\n if ( !this.vScrollbar ) return;\r\n\r\n this.vScrollbar.syncToScroll(\r\n this.codeScroller.scrollTop,\r\n this.codeScroller.scrollHeight - this.codeScroller.clientHeight\r\n );\r\n this.hScrollbar.syncToScroll(\r\n this.codeScroller.scrollLeft,\r\n this.codeScroller.scrollWidth - this.codeScroller.clientWidth\r\n );\r\n }\r\n\r\n // Files:\r\n\r\n private _doLoadFromFile()\r\n {\r\n const input = LX.makeElement( 'input', '', '', document.body );\r\n input.type = 'file';\r\n input.click();\r\n input.addEventListener( 'change', ( e: Event ) => {\r\n const target = e.target as HTMLInputElement;\r\n if ( target.files && target.files[0] )\r\n {\r\n this.loadFile( target.files[0] );\r\n }\r\n input.remove();\r\n } );\r\n }\r\n\r\n // Font Size utils:\r\n\r\n private async _setFontSize( size: number, updateDOM: boolean = true )\r\n {\r\n // Change font size\r\n this.fontSize = size;\r\n const r: any = document.querySelector( ':root' );\r\n r.style.setProperty( '--code-editor-font-size', `${this.fontSize}px` );\r\n window.localStorage.setItem( 'lexcodeeditor-font-size', `${this.fontSize}` );\r\n await this._measureChar();\r\n\r\n // Change row size\r\n const rowPixels = this.fontSize + 6;\r\n r.style.setProperty( '--code-editor-row-height', `${rowPixels}px` );\r\n this.lineHeight = rowPixels;\r\n\r\n if ( updateDOM )\r\n {\r\n this._rebuildLines();\r\n this._afterCursorMove();\r\n }\r\n\r\n // Emit event\r\n LX.emitSignal( '@font-size', this.fontSize );\r\n }\r\n\r\n private _applyFontSizeOffset( offset = 0 )\r\n {\r\n const newFontSize = LX.clamp( this.fontSize + offset, CodeEditor.CODE_MIN_FONT_SIZE, CodeEditor.CODE_MAX_FONT_SIZE );\r\n this._setFontSize( newFontSize );\r\n }\r\n\r\n private _increaseFontSize()\r\n {\r\n this._applyFontSizeOffset( 1 );\r\n }\r\n\r\n private _decreaseFontSize()\r\n {\r\n this._applyFontSizeOffset( -1 );\r\n }\r\n}\r\n\r\n( LX as any ).CodeEditor = CodeEditor;"],"names":[],"mappings":"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"}