diff --git a/more_math/Parser/compile.ps1 b/more_math/Parser/compile.ps1 index fe6324f..05fb656 100644 --- a/more_math/Parser/compile.ps1 +++ b/more_math/Parser/compile.ps1 @@ -27,7 +27,6 @@ if (-not (Test-Path $g4Path)) { $rawContent = [System.IO.File]::ReadAllText($g4Path, [System.Text.Encoding]::UTF8) $content = $rawContent -replace '//.*', '' -$content = $content -replace '/\*[\s\S]*?\*/', '' function Get-LexerNames([string]$grammarText) { $map = @{} @@ -78,7 +77,19 @@ function New-Snippet([string]$name) { return "${name}()" } -function Add-FunctionRuleLine([hashtable]$meta, [hashtable]$lexerMap, [string]$line) { +# Pomocná funkce pro vyčištění ANTLR docstringu do jednoho čistého řádku textu +function Clean-Docstring([string]$doc) { + if ([string]::IsNullOrEmpty($doc)) { return "" } + $lines = $doc -split "`r?`n" + $cleanLines = @() + foreach ($l in $lines) { + $t = $l.Trim().TrimStart('/*').TrimEnd('*/').TrimStart('*').Trim() + if ($t) { $cleanLines += $t } + } + return ($cleanLines -join " ") -replace '"', '\"' +} + +function Add-FunctionRuleLine([hashtable]$meta, [hashtable]$lexerMap, [string]$line, [string]$currentDoc) { $clean = (($line -split '\s+#')[0]).Trim().TrimEnd(';') if ($clean -notmatch 'LPAREN') { return } if ($clean -notmatch '(?:^\s*\|\s*)?(\w+)\s+LPAREN\s*(.*?)\s+RPAREN\s*$') { return } @@ -89,10 +100,13 @@ function Add-FunctionRuleLine([hashtable]$meta, [hashtable]$lexerMap, [string]$l $names = $lexerMap[$token] if (-not $names) { return } + $cleanDoc = Clean-Docstring $currentDoc + foreach ($fn in $names) { $entry = @{ - minArgs = $bounds.min - snippet = (New-Snippet $fn) + minArgs = $bounds.min + snippet = (New-Snippet $fn) + description = $cleanDoc } if ($null -eq $bounds.max) { $entry.maxArgs = $null @@ -106,25 +120,46 @@ function Add-FunctionRuleLine([hashtable]$meta, [hashtable]$lexerMap, [string]$l function Get-FunctionMeta([string]$grammarText, [hashtable]$lexerMap) { $meta = @{} $inFunc = $false + $currentDoc = "" foreach ($line in ($grammarText -split "`r?`n")) { + # Zachytávání docstringů před pravidly + if ($line -match '^\s*/\*\*') { + $currentDoc = $line + if ($line -notmatch '\*/\s*$') { + # Pokud je komentář víceřádkový, podržíme ho, dokud neskončí + $inDocBlock = $true + continue + } + } + if ($inDocBlock) { + $currentDoc += "`n" + $line + if ($line -match '\*/\s*$') { $inDocBlock = $false } + continue + } + if ($line -match '^\s*//\s*LEXER') { $inFunc = $false } if ($line -match '^\s*(func0|func1|func2|func3|func4|func5|funcN|funcNoise)\s*:\s*(.*)$') { $inFunc = $true $inline = $matches[2].Trim() if ($inline -and $inline -match 'LPAREN') { - Add-FunctionRuleLine $meta $lexerMap $inline + Add-FunctionRuleLine $meta $lexerMap $inline $currentDoc + $currentDoc = "" # Reset po spotřebování docstringu } continue } - if (-not $inFunc) { continue } + if (-not $inFunc) { + # Pokud řádek není prázdný a není to komentář, resetujeme docstring, pokud nepatří k funkci + if ($line.Trim() -and $line -notmatch '^\s*\|') { $currentDoc = "" } + continue + } - Add-FunctionRuleLine $meta $lexerMap $line + Add-FunctionRuleLine $meta $lexerMap $line $currentDoc + $currentDoc = "" # Reset po spotřebování } return $meta } - # 1. Extract quoted symbols for keyword/function lists $matches = [regex]::Matches($content, "'([a-zA-Z_][a-zA-Z0-9_]*)'") $allSymbols = @() @@ -167,7 +202,7 @@ $pyMetaLines = @() foreach ($key in $sortedMetaKeys) { $m = $functionMeta[$key] $maxPart = if ($null -eq $m.maxArgs) { "None" } else { [string]$m.maxArgs } - $pyMetaLines += " '$key': {'min_args': $($m.minArgs), 'max_args': $maxPart, 'snippet': '$($m.snippet)'}," + $pyMetaLines += " '$key': {'min_args': $($m.minArgs), 'max_args': $maxPart, 'snippet': '$($m.snippet)', 'description': '$($m.description)'}," } $pyPath = "inbuilt_symbols.py" @@ -196,12 +231,13 @@ $jsMetaLines = @() foreach ($key in $sortedMetaKeys) { $m = $functionMeta[$key] if ($null -eq $m.maxArgs) { - $jsMetaLines += " $key`: { minArgs: $($m.minArgs), maxArgs: null, snippet: `"$($m.snippet)`" }," + $jsMetaLines += " $key`: { minArgs: $($m.minArgs), maxArgs: null, snippet: `"$($m.snippet)`", description: `"$($m.description)`" }," } else { - $jsMetaLines += " $key`: { minArgs: $($m.minArgs), maxArgs: $($m.maxArgs), snippet: `"$($m.snippet)`" }," + $jsMetaLines += " $key`: { minArgs: $($m.minArgs), maxArgs: $($m.maxArgs), snippet: `"$($m.snippet)`", description: `"$($m.description)`" }," } } + $jsContent = @( "// Generated automatically by compile.ps1. Do not edit.", "", diff --git a/more_math/Parser/inbuilt_symbols.py b/more_math/Parser/inbuilt_symbols.py index d7ad42e..804da91 100644 --- a/more_math/Parser/inbuilt_symbols.py +++ b/more_math/Parser/inbuilt_symbols.py @@ -10,238 +10,238 @@ INBUILT_FUNCTIONS = { } INBUILT_FUNCTION_META = { - 'abs': {'min_args': 1, 'max_args': 1, 'snippet': 'abs()'}, - 'acos': {'min_args': 1, 'max_args': 1, 'snippet': 'acos()'}, - 'acosh': {'min_args': 1, 'max_args': 1, 'snippet': 'acosh()'}, - 'all': {'min_args': 1, 'max_args': 1, 'snippet': 'all()'}, - 'angle': {'min_args': 1, 'max_args': 1, 'snippet': 'angle()'}, - 'any': {'min_args': 1, 'max_args': 1, 'snippet': 'any()'}, - 'append': {'min_args': 2, 'max_args': 2, 'snippet': 'append()'}, - 'argmax': {'min_args': 1, 'max_args': 1, 'snippet': 'argmax()'}, - 'argmin': {'min_args': 1, 'max_args': 1, 'snippet': 'argmin()'}, - 'argsort': {'min_args': 1, 'max_args': 2, 'snippet': 'argsort()'}, - 'asin': {'min_args': 1, 'max_args': 1, 'snippet': 'asin()'}, - 'asinh': {'min_args': 1, 'max_args': 1, 'snippet': 'asinh()'}, - 'atan': {'min_args': 1, 'max_args': 1, 'snippet': 'atan()'}, - 'atan2': {'min_args': 2, 'max_args': 2, 'snippet': 'atan2()'}, - 'atanh': {'min_args': 1, 'max_args': 1, 'snippet': 'atanh()'}, - 'band': {'min_args': 2, 'max_args': 2, 'snippet': 'band()'}, - 'batch_shuffle': {'min_args': 2, 'max_args': 2, 'snippet': 'batch_shuffle()'}, - 'bitcount': {'min_args': 1, 'max_args': 1, 'snippet': 'bitcount()'}, - 'bitwise_and': {'min_args': 2, 'max_args': 2, 'snippet': 'bitwise_and()'}, - 'bitwise_not': {'min_args': 1, 'max_args': 1, 'snippet': 'bitwise_not()'}, - 'bitwise_or': {'min_args': 2, 'max_args': 2, 'snippet': 'bitwise_or()'}, - 'bitwise_xor': {'min_args': 2, 'max_args': 2, 'snippet': 'bitwise_xor()'}, - 'blur': {'min_args': 2, 'max_args': 3, 'snippet': 'blur()'}, - 'bnot': {'min_args': 1, 'max_args': 1, 'snippet': 'bnot()'}, - 'bor': {'min_args': 2, 'max_args': 2, 'snippet': 'bor()'}, - 'botk': {'min_args': 2, 'max_args': 2, 'snippet': 'botk()'}, - 'botk_ind': {'min_args': 2, 'max_args': 2, 'snippet': 'botk_ind()'}, - 'botk_indices': {'min_args': 2, 'max_args': 2, 'snippet': 'botk_indices()'}, - 'bxor': {'min_args': 2, 'max_args': 2, 'snippet': 'bxor()'}, - 'cat': {'min_args': 2, 'max_args': None, 'snippet': 'cat()'}, - 'ceil': {'min_args': 1, 'max_args': 1, 'snippet': 'ceil()'}, - 'cellular': {'min_args': 2, 'max_args': 5, 'snippet': 'cellular()'}, - 'cellular_noise': {'min_args': 2, 'max_args': 5, 'snippet': 'cellular_noise()'}, - 'cielab_to_rgb': {'min_args': 1, 'max_args': 3, 'snippet': 'cielab_to_rgb()'}, - 'clamp': {'min_args': 3, 'max_args': 3, 'snippet': 'clamp()'}, - 'cnt': {'min_args': 1, 'max_args': 1, 'snippet': 'cnt()'}, - 'concat': {'min_args': 2, 'max_args': None, 'snippet': 'concat()'}, - 'concatenate': {'min_args': 2, 'max_args': None, 'snippet': 'concatenate()'}, - 'conv': {'min_args': 2, 'max_args': None, 'snippet': 'conv()'}, - 'convolution': {'min_args': 2, 'max_args': None, 'snippet': 'convolution()'}, - 'corr': {'min_args': 2, 'max_args': 2, 'snippet': 'corr()'}, - 'correlation': {'min_args': 2, 'max_args': 2, 'snippet': 'correlation()'}, - 'cos': {'min_args': 1, 'max_args': 1, 'snippet': 'cos()'}, - 'cosh': {'min_args': 1, 'max_args': 1, 'snippet': 'cosh()'}, - 'cosine_similarity': {'min_args': 2, 'max_args': 2, 'snippet': 'cosine_similarity()'}, - 'cossim': {'min_args': 2, 'max_args': 2, 'snippet': 'cossim()'}, - 'count': {'min_args': 1, 'max_args': 1, 'snippet': 'count()'}, - 'cov': {'min_args': 2, 'max_args': 2, 'snippet': 'cov()'}, - 'crop': {'min_args': 3, 'max_args': 3, 'snippet': 'crop()'}, - 'cross': {'min_args': 2, 'max_args': 2, 'snippet': 'cross()'}, - 'cubic': {'min_args': 3, 'max_args': 3, 'snippet': 'cubic()'}, - 'cubic_ease': {'min_args': 3, 'max_args': 3, 'snippet': 'cubic_ease()'}, - 'cumprod': {'min_args': 1, 'max_args': 1, 'snippet': 'cumprod()'}, - 'cumsum': {'min_args': 1, 'max_args': 1, 'snippet': 'cumsum()'}, - 'dilate': {'min_args': 1, 'max_args': 2, 'snippet': 'dilate()'}, - 'dist': {'min_args': 4, 'max_args': 4, 'snippet': 'dist()'}, - 'distance': {'min_args': 4, 'max_args': 4, 'snippet': 'distance()'}, - 'domain_warp': {'min_args': 4, 'max_args': 8, 'snippet': 'domain_warp()'}, - 'domain_warp_noise': {'min_args': 4, 'max_args': 8, 'snippet': 'domain_warp_noise()'}, - 'dot': {'min_args': 2, 'max_args': 2, 'snippet': 'dot()'}, - 'edge': {'min_args': 1, 'max_args': 2, 'snippet': 'edge()'}, - 'elastic': {'min_args': 3, 'max_args': 3, 'snippet': 'elastic()'}, - 'elastic_ease': {'min_args': 3, 'max_args': 3, 'snippet': 'elastic_ease()'}, - 'entropy': {'min_args': 1, 'max_args': 1, 'snippet': 'entropy()'}, - 'erf': {'min_args': 1, 'max_args': 1, 'snippet': 'erf()'}, - 'erfinv': {'min_args': 1, 'max_args': 1, 'snippet': 'erfinv()'}, - 'erode': {'min_args': 1, 'max_args': 2, 'snippet': 'erode()'}, - 'exp': {'min_args': 1, 'max_args': 1, 'snippet': 'exp()'}, - 'ezconv': {'min_args': 2, 'max_args': None, 'snippet': 'ezconv()'}, - 'ezconvolution': {'min_args': 2, 'max_args': None, 'snippet': 'ezconvolution()'}, - 'fft': {'min_args': 1, 'max_args': 1, 'snippet': 'fft()'}, - 'find': {'min_args': 2, 'max_args': 2, 'snippet': 'find()'}, - 'flatten': {'min_args': 1, 'max_args': 1, 'snippet': 'flatten()'}, - 'flip': {'min_args': 2, 'max_args': 2, 'snippet': 'flip()'}, - 'float': {'min_args': 1, 'max_args': 1, 'snippet': 'float()'}, - 'floor': {'min_args': 1, 'max_args': 1, 'snippet': 'floor()'}, - 'flow_ang': {'min_args': 1, 'max_args': 1, 'snippet': 'flow_ang()'}, - 'flow_angle': {'min_args': 1, 'max_args': 1, 'snippet': 'flow_angle()'}, - 'flow_apply': {'min_args': 2, 'max_args': 2, 'snippet': 'flow_apply()'}, - 'flow_mag': {'min_args': 1, 'max_args': 1, 'snippet': 'flow_mag()'}, - 'flow_magnitude': {'min_args': 1, 'max_args': 1, 'snippet': 'flow_magnitude()'}, - 'flow_to_image': {'min_args': 1, 'max_args': 1, 'snippet': 'flow_to_image()'}, - 'fract': {'min_args': 1, 'max_args': 1, 'snippet': 'fract()'}, - 'gamma': {'min_args': 1, 'max_args': 1, 'snippet': 'gamma()'}, - 'gaussian': {'min_args': 2, 'max_args': 3, 'snippet': 'gaussian()'}, - 'gelu': {'min_args': 1, 'max_args': 1, 'snippet': 'gelu()'}, - 'get_value': {'min_args': 2, 'max_args': 2, 'snippet': 'get_value()'}, - 'hist': {'min_args': 4, 'max_args': 4, 'snippet': 'hist()'}, - 'histogram': {'min_args': 4, 'max_args': 4, 'snippet': 'histogram()'}, - 'hsv_to_rgb': {'min_args': 1, 'max_args': 4, 'snippet': 'hsv_to_rgb()'}, - 'ifft': {'min_args': 1, 'max_args': 2, 'snippet': 'ifft()'}, - 'int': {'min_args': 1, 'max_args': 1, 'snippet': 'int()'}, - 'int_to_rgb': {'min_args': 1, 'max_args': 1, 'snippet': 'int_to_rgb()'}, - 'interpolate_area': {'min_args': 2, 'max_args': 2, 'snippet': 'interpolate_area()'}, - 'interpolate_linear': {'min_args': 2, 'max_args': 2, 'snippet': 'interpolate_linear()'}, - 'interpolate_nearest': {'min_args': 2, 'max_args': 2, 'snippet': 'interpolate_nearest()'}, - 'interpolate_nearest_exact': {'min_args': 2, 'max_args': 2, 'snippet': 'interpolate_nearest_exact()'}, - 'join': {'min_args': 1, 'max_args': 2, 'snippet': 'join()'}, - 'length': {'min_args': 1, 'max_args': 1, 'snippet': 'length()'}, - 'lerp': {'min_args': 3, 'max_args': 3, 'snippet': 'lerp()'}, - 'linspace': {'min_args': 3, 'max_args': 3, 'snippet': 'linspace()'}, - 'ln': {'min_args': 1, 'max_args': 1, 'snippet': 'ln()'}, - 'log': {'min_args': 1, 'max_args': 1, 'snippet': 'log()'}, - 'logspace': {'min_args': 4, 'max_args': 4, 'snippet': 'logspace()'}, - 'lower': {'min_args': 1, 'max_args': 1, 'snippet': 'lower()'}, - 'map': {'min_args': 2, 'max_args': None, 'snippet': 'map()'}, - 'matmul': {'min_args': 2, 'max_args': 2, 'snippet': 'matmul()'}, - 'mean': {'min_args': 1, 'max_args': 1, 'snippet': 'mean()'}, - 'median': {'min_args': 1, 'max_args': 1, 'snippet': 'median()'}, - 'mode': {'min_args': 1, 'max_args': 1, 'snippet': 'mode()'}, - 'moment': {'min_args': 3, 'max_args': 3, 'snippet': 'moment()'}, - 'morph_close': {'min_args': 1, 'max_args': 2, 'snippet': 'morph_close()'}, - 'morph_open': {'min_args': 1, 'max_args': 2, 'snippet': 'morph_open()'}, - 'motion_mask': {'min_args': 1, 'max_args': 1, 'snippet': 'motion_mask()'}, - 'nan_to_num': {'min_args': 4, 'max_args': 4, 'snippet': 'nan_to_num()'}, - 'noise': {'min_args': 1, 'max_args': 2, 'snippet': 'noise()'}, - 'now': {'min_args': 0, 'max_args': 0, 'snippet': 'now()'}, - 'nvl': {'min_args': 4, 'max_args': 4, 'snippet': 'nvl()'}, - 'oklab_to_rgb': {'min_args': 1, 'max_args': 3, 'snippet': 'oklab_to_rgb()'}, - 'overlay': {'min_args': 3, 'max_args': 4, 'snippet': 'overlay()'}, - 'pad': {'min_args': 2, 'max_args': 2, 'snippet': 'pad()'}, - 'percentile': {'min_args': 2, 'max_args': 2, 'snippet': 'percentile()'}, - 'perlin': {'min_args': 2, 'max_args': 5, 'snippet': 'perlin()'}, - 'perlin_noise': {'min_args': 2, 'max_args': 5, 'snippet': 'perlin_noise()'}, - 'perm': {'min_args': 2, 'max_args': 2, 'snippet': 'perm()'}, - 'permute': {'min_args': 2, 'max_args': 2, 'snippet': 'permute()'}, - 'pinv': {'min_args': 1, 'max_args': 1, 'snippet': 'pinv()'}, - 'plasma': {'min_args': 2, 'max_args': 5, 'snippet': 'plasma()'}, - 'plasma_noise': {'min_args': 2, 'max_args': 5, 'snippet': 'plasma_noise()'}, - 'popcnt': {'min_args': 1, 'max_args': 1, 'snippet': 'popcnt()'}, - 'popcount': {'min_args': 1, 'max_args': 1, 'snippet': 'popcount()'}, - 'pow': {'min_args': 2, 'max_args': 2, 'snippet': 'pow()'}, - 'prcnt': {'min_args': 2, 'max_args': 2, 'snippet': 'prcnt()'}, - 'print': {'min_args': 1, 'max_args': 1, 'snippet': 'print()'}, - 'print_shape': {'min_args': 1, 'max_args': 1, 'snippet': 'print_shape()'}, - 'pshp': {'min_args': 1, 'max_args': 1, 'snippet': 'pshp()'}, - 'quantile': {'min_args': 2, 'max_args': 2, 'snippet': 'quantile()'}, - 'quartil': {'min_args': 2, 'max_args': 2, 'snippet': 'quartil()'}, - 'quartile': {'min_args': 2, 'max_args': 2, 'snippet': 'quartile()'}, - 'rand': {'min_args': 1, 'max_args': 2, 'snippet': 'rand()'}, - 'randb': {'min_args': 2, 'max_args': 3, 'snippet': 'randb()'}, - 'randbeta': {'min_args': 3, 'max_args': 4, 'snippet': 'randbeta()'}, - 'randc': {'min_args': 3, 'max_args': 4, 'snippet': 'randc()'}, - 'rande': {'min_args': 2, 'max_args': 3, 'snippet': 'rande()'}, - 'randg': {'min_args': 3, 'max_args': 4, 'snippet': 'randg()'}, - 'randgumbel': {'min_args': 3, 'max_args': 4, 'snippet': 'randgumbel()'}, - 'randchi2': {'min_args': 2, 'max_args': 3, 'snippet': 'randchi2()'}, - 'randl': {'min_args': 3, 'max_args': 4, 'snippet': 'randl()'}, - 'randln': {'min_args': 3, 'max_args': 4, 'snippet': 'randln()'}, - 'randn': {'min_args': 1, 'max_args': 2, 'snippet': 'randn()'}, - 'random_bernoulli': {'min_args': 2, 'max_args': 3, 'snippet': 'random_bernoulli()'}, - 'random_beta': {'min_args': 3, 'max_args': 4, 'snippet': 'random_beta()'}, - 'random_cauchy': {'min_args': 3, 'max_args': 4, 'snippet': 'random_cauchy()'}, - 'random_exponential': {'min_args': 2, 'max_args': 3, 'snippet': 'random_exponential()'}, - 'random_gamma': {'min_args': 3, 'max_args': 4, 'snippet': 'random_gamma()'}, - 'random_gumbel': {'min_args': 3, 'max_args': 4, 'snippet': 'random_gumbel()'}, - 'random_chi2': {'min_args': 2, 'max_args': 3, 'snippet': 'random_chi2()'}, - 'random_laplace': {'min_args': 3, 'max_args': 4, 'snippet': 'random_laplace()'}, - 'random_log_normal': {'min_args': 3, 'max_args': 4, 'snippet': 'random_log_normal()'}, - 'random_normal': {'min_args': 1, 'max_args': 2, 'snippet': 'random_normal()'}, - 'random_poisson': {'min_args': 2, 'max_args': 3, 'snippet': 'random_poisson()'}, - 'random_studentt': {'min_args': 2, 'max_args': 3, 'snippet': 'random_studentt()'}, - 'random_uniform': {'min_args': 1, 'max_args': 2, 'snippet': 'random_uniform()'}, - 'random_weibull': {'min_args': 3, 'max_args': 4, 'snippet': 'random_weibull()'}, - 'randp': {'min_args': 2, 'max_args': 3, 'snippet': 'randp()'}, - 'randt': {'min_args': 2, 'max_args': 3, 'snippet': 'randt()'}, - 'randu': {'min_args': 1, 'max_args': 2, 'snippet': 'randu()'}, - 'randw': {'min_args': 3, 'max_args': 4, 'snippet': 'randw()'}, - 'range': {'min_args': 3, 'max_args': 3, 'snippet': 'range()'}, - 'relu': {'min_args': 1, 'max_args': None, 'snippet': 'relu()'}, - 'remap': {'min_args': 5, 'max_args': 5, 'snippet': 'remap()'}, - 'replace': {'min_args': 3, 'max_args': 3, 'snippet': 'replace()'}, - 'reshape': {'min_args': 2, 'max_args': 2, 'snippet': 'reshape()'}, - 'rgb_to_cielab': {'min_args': 1, 'max_args': 3, 'snippet': 'rgb_to_cielab()'}, - 'rgb_to_hsv': {'min_args': 1, 'max_args': 4, 'snippet': 'rgb_to_hsv()'}, - 'rgb_to_int': {'min_args': 1, 'max_args': 3, 'snippet': 'rgb_to_int()'}, - 'rgb_to_oklab': {'min_args': 1, 'max_args': 3, 'snippet': 'rgb_to_oklab()'}, - 'ridged': {'min_args': 2, 'max_args': 5, 'snippet': 'ridged()'}, - 'ridged_noise': {'min_args': 2, 'max_args': 5, 'snippet': 'ridged_noise()'}, - 'rife': {'min_args': 4, 'max_args': 5, 'snippet': 'rife()'}, - 'roll': {'min_args': 2, 'max_args': 3, 'snippet': 'roll()'}, - 'round': {'min_args': 1, 'max_args': 1, 'snippet': 'round()'}, - 'rshp': {'min_args': 2, 'max_args': 2, 'snippet': 'rshp()'}, - 'select': {'min_args': 2, 'max_args': 2, 'snippet': 'select()'}, - 'shape': {'min_args': 1, 'max_args': 1, 'snippet': 'shape()'}, - 'shuffle': {'min_args': 2, 'max_args': 2, 'snippet': 'shuffle()'}, - 'sigm': {'min_args': 1, 'max_args': 1, 'snippet': 'sigm()'}, - 'sign': {'min_args': 1, 'max_args': 1, 'snippet': 'sign()'}, - 'sin': {'min_args': 1, 'max_args': 1, 'snippet': 'sin()'}, - 'sine': {'min_args': 3, 'max_args': 3, 'snippet': 'sine()'}, - 'sine_ease': {'min_args': 3, 'max_args': 3, 'snippet': 'sine_ease()'}, - 'sinh': {'min_args': 1, 'max_args': 1, 'snippet': 'sinh()'}, - 'smax': {'min_args': 1, 'max_args': None, 'snippet': 'smax()'}, - 'smin': {'min_args': 1, 'max_args': None, 'snippet': 'smin()'}, - 'smootherstep': {'min_args': 3, 'max_args': 3, 'snippet': 'smootherstep()'}, - 'smoothstep': {'min_args': 3, 'max_args': 3, 'snippet': 'smoothstep()'}, - 'snorm': {'min_args': 1, 'max_args': 1, 'snippet': 'snorm()'}, - 'softmax': {'min_args': 1, 'max_args': 2, 'snippet': 'softmax()'}, - 'softmin': {'min_args': 1, 'max_args': 2, 'snippet': 'softmin()'}, - 'softplus': {'min_args': 1, 'max_args': 1, 'snippet': 'softplus()'}, - 'sort': {'min_args': 1, 'max_args': 1, 'snippet': 'sort()'}, - 'split': {'min_args': 1, 'max_args': 2, 'snippet': 'split()'}, - 'sqrt': {'min_args': 1, 'max_args': 1, 'snippet': 'sqrt()'}, - 'stack_clear': {'min_args': 1, 'max_args': 1, 'snippet': 'stack_clear()'}, - 'stack_get': {'min_args': 1, 'max_args': 1, 'snippet': 'stack_get()'}, - 'stack_has': {'min_args': 1, 'max_args': 1, 'snippet': 'stack_has()'}, - 'stack_pop': {'min_args': 1, 'max_args': 1, 'snippet': 'stack_pop()'}, - 'stack_push': {'min_args': 2, 'max_args': 2, 'snippet': 'stack_push()'}, - 'std': {'min_args': 1, 'max_args': 1, 'snippet': 'std()'}, - 'step': {'min_args': 2, 'max_args': 2, 'snippet': 'step()'}, - 'substr': {'min_args': 2, 'max_args': 3, 'snippet': 'substr()'}, - 'substring': {'min_args': 2, 'max_args': 3, 'snippet': 'substring()'}, - 'sum': {'min_args': 1, 'max_args': 1, 'snippet': 'sum()'}, - 'swap': {'min_args': 4, 'max_args': 4, 'snippet': 'swap()'}, - 'tan': {'min_args': 1, 'max_args': 1, 'snippet': 'tan()'}, - 'tanh': {'min_args': 1, 'max_args': 1, 'snippet': 'tanh()'}, - 'tensor': {'min_args': 2, 'max_args': 3, 'snippet': 'tensor()'}, - 'text_image': {'min_args': 3, 'max_args': 9, 'snippet': 'text_image()'}, - 'timestamp': {'min_args': 0, 'max_args': 0, 'snippet': 'timestamp()'}, - 'tmax': {'min_args': 2, 'max_args': 2, 'snippet': 'tmax()'}, - 'tmin': {'min_args': 2, 'max_args': 2, 'snippet': 'tmin()'}, - 'tnorm': {'min_args': 1, 'max_args': 1, 'snippet': 'tnorm()'}, - 'topk': {'min_args': 2, 'max_args': 2, 'snippet': 'topk()'}, - 'topk_ind': {'min_args': 2, 'max_args': 2, 'snippet': 'topk_ind()'}, - 'topk_indices': {'min_args': 2, 'max_args': 2, 'snippet': 'topk_indices()'}, - 'trim': {'min_args': 1, 'max_args': 1, 'snippet': 'trim()'}, - 'turbulence': {'min_args': 2, 'max_args': 5, 'snippet': 'turbulence()'}, - 'unique': {'min_args': 1, 'max_args': 1, 'snippet': 'unique()'}, - 'upper': {'min_args': 1, 'max_args': 1, 'snippet': 'upper()'}, - 'var': {'min_args': 1, 'max_args': 1, 'snippet': 'var()'}, - 'voronoi': {'min_args': 2, 'max_args': 5, 'snippet': 'voronoi()'}, - 'voronoi_noise': {'min_args': 2, 'max_args': 5, 'snippet': 'voronoi_noise()'}, - 'where': {'min_args': 3, 'max_args': 3, 'snippet': 'where()'}, - 'worley': {'min_args': 2, 'max_args': 5, 'snippet': 'worley()'}, + 'abs': {'min_args': 1, 'max_args': 1, 'snippet': 'abs()', 'description': ''}, + 'acos': {'min_args': 1, 'max_args': 1, 'snippet': 'acos()', 'description': ''}, + 'acosh': {'min_args': 1, 'max_args': 1, 'snippet': 'acosh()', 'description': ''}, + 'all': {'min_args': 1, 'max_args': 1, 'snippet': 'all()', 'description': ''}, + 'angle': {'min_args': 1, 'max_args': 1, 'snippet': 'angle()', 'description': ''}, + 'any': {'min_args': 1, 'max_args': 1, 'snippet': 'any()', 'description': ''}, + 'append': {'min_args': 2, 'max_args': 2, 'snippet': 'append()', 'description': ''}, + 'argmax': {'min_args': 1, 'max_args': 1, 'snippet': 'argmax()', 'description': ''}, + 'argmin': {'min_args': 1, 'max_args': 1, 'snippet': 'argmin()', 'description': ''}, + 'argsort': {'min_args': 1, 'max_args': 2, 'snippet': 'argsort()', 'description': ''}, + 'asin': {'min_args': 1, 'max_args': 1, 'snippet': 'asin()', 'description': ''}, + 'asinh': {'min_args': 1, 'max_args': 1, 'snippet': 'asinh()', 'description': ''}, + 'atan': {'min_args': 1, 'max_args': 1, 'snippet': 'atan()', 'description': ''}, + 'atan2': {'min_args': 2, 'max_args': 2, 'snippet': 'atan2()', 'description': ''}, + 'atanh': {'min_args': 1, 'max_args': 1, 'snippet': 'atanh()', 'description': ''}, + 'band': {'min_args': 2, 'max_args': 2, 'snippet': 'band()', 'description': ''}, + 'batch_shuffle': {'min_args': 2, 'max_args': 2, 'snippet': 'batch_shuffle()', 'description': ''}, + 'bitcount': {'min_args': 1, 'max_args': 1, 'snippet': 'bitcount()', 'description': ''}, + 'bitwise_and': {'min_args': 2, 'max_args': 2, 'snippet': 'bitwise_and()', 'description': ''}, + 'bitwise_not': {'min_args': 1, 'max_args': 1, 'snippet': 'bitwise_not()', 'description': ''}, + 'bitwise_or': {'min_args': 2, 'max_args': 2, 'snippet': 'bitwise_or()', 'description': ''}, + 'bitwise_xor': {'min_args': 2, 'max_args': 2, 'snippet': 'bitwise_xor()', 'description': ''}, + 'blur': {'min_args': 2, 'max_args': 3, 'snippet': 'blur()', 'description': ''}, + 'bnot': {'min_args': 1, 'max_args': 1, 'snippet': 'bnot()', 'description': ''}, + 'bor': {'min_args': 2, 'max_args': 2, 'snippet': 'bor()', 'description': ''}, + 'botk': {'min_args': 2, 'max_args': 2, 'snippet': 'botk()', 'description': ''}, + 'botk_ind': {'min_args': 2, 'max_args': 2, 'snippet': 'botk_ind()', 'description': ''}, + 'botk_indices': {'min_args': 2, 'max_args': 2, 'snippet': 'botk_indices()', 'description': ''}, + 'bxor': {'min_args': 2, 'max_args': 2, 'snippet': 'bxor()', 'description': ''}, + 'cat': {'min_args': 2, 'max_args': None, 'snippet': 'cat()', 'description': ''}, + 'ceil': {'min_args': 1, 'max_args': 1, 'snippet': 'ceil()', 'description': ''}, + 'cellular': {'min_args': 2, 'max_args': 5, 'snippet': 'cellular()', 'description': ''}, + 'cellular_noise': {'min_args': 2, 'max_args': 5, 'snippet': 'cellular_noise()', 'description': ''}, + 'cielab_to_rgb': {'min_args': 1, 'max_args': 3, 'snippet': 'cielab_to_rgb()', 'description': ''}, + 'clamp': {'min_args': 3, 'max_args': 3, 'snippet': 'clamp()', 'description': ''}, + 'cnt': {'min_args': 1, 'max_args': 1, 'snippet': 'cnt()', 'description': ''}, + 'concat': {'min_args': 2, 'max_args': None, 'snippet': 'concat()', 'description': ''}, + 'concatenate': {'min_args': 2, 'max_args': None, 'snippet': 'concatenate()', 'description': ''}, + 'conv': {'min_args': 2, 'max_args': None, 'snippet': 'conv()', 'description': ''}, + 'convolution': {'min_args': 2, 'max_args': None, 'snippet': 'convolution()', 'description': ''}, + 'corr': {'min_args': 2, 'max_args': 2, 'snippet': 'corr()', 'description': ''}, + 'correlation': {'min_args': 2, 'max_args': 2, 'snippet': 'correlation()', 'description': ''}, + 'cos': {'min_args': 1, 'max_args': 1, 'snippet': 'cos()', 'description': ''}, + 'cosh': {'min_args': 1, 'max_args': 1, 'snippet': 'cosh()', 'description': ''}, + 'cosine_similarity': {'min_args': 2, 'max_args': 2, 'snippet': 'cosine_similarity()', 'description': ''}, + 'cossim': {'min_args': 2, 'max_args': 2, 'snippet': 'cossim()', 'description': ''}, + 'count': {'min_args': 1, 'max_args': 1, 'snippet': 'count()', 'description': ''}, + 'cov': {'min_args': 2, 'max_args': 2, 'snippet': 'cov()', 'description': ''}, + 'crop': {'min_args': 3, 'max_args': 3, 'snippet': 'crop()', 'description': ''}, + 'cross': {'min_args': 2, 'max_args': 2, 'snippet': 'cross()', 'description': ''}, + 'cubic': {'min_args': 3, 'max_args': 3, 'snippet': 'cubic()', 'description': ''}, + 'cubic_ease': {'min_args': 3, 'max_args': 3, 'snippet': 'cubic_ease()', 'description': ''}, + 'cumprod': {'min_args': 1, 'max_args': 1, 'snippet': 'cumprod()', 'description': ''}, + 'cumsum': {'min_args': 1, 'max_args': 1, 'snippet': 'cumsum()', 'description': ''}, + 'dilate': {'min_args': 1, 'max_args': 2, 'snippet': 'dilate()', 'description': ''}, + 'dist': {'min_args': 4, 'max_args': 4, 'snippet': 'dist()', 'description': ''}, + 'distance': {'min_args': 4, 'max_args': 4, 'snippet': 'distance()', 'description': ''}, + 'domain_warp': {'min_args': 4, 'max_args': 8, 'snippet': 'domain_warp()', 'description': ''}, + 'domain_warp_noise': {'min_args': 4, 'max_args': 8, 'snippet': 'domain_warp_noise()', 'description': ''}, + 'dot': {'min_args': 2, 'max_args': 2, 'snippet': 'dot()', 'description': ''}, + 'edge': {'min_args': 1, 'max_args': 2, 'snippet': 'edge()', 'description': ''}, + 'elastic': {'min_args': 3, 'max_args': 3, 'snippet': 'elastic()', 'description': ''}, + 'elastic_ease': {'min_args': 3, 'max_args': 3, 'snippet': 'elastic_ease()', 'description': ''}, + 'entropy': {'min_args': 1, 'max_args': 1, 'snippet': 'entropy()', 'description': ''}, + 'erf': {'min_args': 1, 'max_args': 1, 'snippet': 'erf()', 'description': ''}, + 'erfinv': {'min_args': 1, 'max_args': 1, 'snippet': 'erfinv()', 'description': ''}, + 'erode': {'min_args': 1, 'max_args': 2, 'snippet': 'erode()', 'description': ''}, + 'exp': {'min_args': 1, 'max_args': 1, 'snippet': 'exp()', 'description': ''}, + 'ezconv': {'min_args': 2, 'max_args': None, 'snippet': 'ezconv()', 'description': ''}, + 'ezconvolution': {'min_args': 2, 'max_args': None, 'snippet': 'ezconvolution()', 'description': ''}, + 'fft': {'min_args': 1, 'max_args': 1, 'snippet': 'fft()', 'description': ''}, + 'find': {'min_args': 2, 'max_args': 2, 'snippet': 'find()', 'description': ''}, + 'flatten': {'min_args': 1, 'max_args': 1, 'snippet': 'flatten()', 'description': ''}, + 'flip': {'min_args': 2, 'max_args': 2, 'snippet': 'flip()', 'description': ''}, + 'float': {'min_args': 1, 'max_args': 1, 'snippet': 'float()', 'description': ''}, + 'floor': {'min_args': 1, 'max_args': 1, 'snippet': 'floor()', 'description': ''}, + 'flow_ang': {'min_args': 1, 'max_args': 1, 'snippet': 'flow_ang()', 'description': ''}, + 'flow_angle': {'min_args': 1, 'max_args': 1, 'snippet': 'flow_angle()', 'description': ''}, + 'flow_apply': {'min_args': 2, 'max_args': 2, 'snippet': 'flow_apply()', 'description': ''}, + 'flow_mag': {'min_args': 1, 'max_args': 1, 'snippet': 'flow_mag()', 'description': ''}, + 'flow_magnitude': {'min_args': 1, 'max_args': 1, 'snippet': 'flow_magnitude()', 'description': ''}, + 'flow_to_image': {'min_args': 1, 'max_args': 1, 'snippet': 'flow_to_image()', 'description': ''}, + 'fract': {'min_args': 1, 'max_args': 1, 'snippet': 'fract()', 'description': ''}, + 'gamma': {'min_args': 1, 'max_args': 1, 'snippet': 'gamma()', 'description': ''}, + 'gaussian': {'min_args': 2, 'max_args': 3, 'snippet': 'gaussian()', 'description': ''}, + 'gelu': {'min_args': 1, 'max_args': 1, 'snippet': 'gelu()', 'description': ''}, + 'get_value': {'min_args': 2, 'max_args': 2, 'snippet': 'get_value()', 'description': ''}, + 'hist': {'min_args': 4, 'max_args': 4, 'snippet': 'hist()', 'description': ''}, + 'histogram': {'min_args': 4, 'max_args': 4, 'snippet': 'histogram()', 'description': ''}, + 'hsv_to_rgb': {'min_args': 1, 'max_args': 4, 'snippet': 'hsv_to_rgb()', 'description': ''}, + 'ifft': {'min_args': 1, 'max_args': 2, 'snippet': 'ifft()', 'description': ''}, + 'int': {'min_args': 1, 'max_args': 1, 'snippet': 'int()', 'description': ''}, + 'int_to_rgb': {'min_args': 1, 'max_args': 1, 'snippet': 'int_to_rgb()', 'description': ''}, + 'interpolate_area': {'min_args': 2, 'max_args': 2, 'snippet': 'interpolate_area()', 'description': ''}, + 'interpolate_linear': {'min_args': 2, 'max_args': 2, 'snippet': 'interpolate_linear()', 'description': ''}, + 'interpolate_nearest': {'min_args': 2, 'max_args': 2, 'snippet': 'interpolate_nearest()', 'description': ''}, + 'interpolate_nearest_exact': {'min_args': 2, 'max_args': 2, 'snippet': 'interpolate_nearest_exact()', 'description': ''}, + 'join': {'min_args': 1, 'max_args': 2, 'snippet': 'join()', 'description': ''}, + 'length': {'min_args': 1, 'max_args': 1, 'snippet': 'length()', 'description': ''}, + 'lerp': {'min_args': 3, 'max_args': 3, 'snippet': 'lerp()', 'description': ''}, + 'linspace': {'min_args': 3, 'max_args': 3, 'snippet': 'linspace()', 'description': ''}, + 'ln': {'min_args': 1, 'max_args': 1, 'snippet': 'ln()', 'description': ''}, + 'log': {'min_args': 1, 'max_args': 1, 'snippet': 'log()', 'description': ''}, + 'logspace': {'min_args': 4, 'max_args': 4, 'snippet': 'logspace()', 'description': ''}, + 'lower': {'min_args': 1, 'max_args': 1, 'snippet': 'lower()', 'description': ''}, + 'map': {'min_args': 2, 'max_args': None, 'snippet': 'map()', 'description': ''}, + 'matmul': {'min_args': 2, 'max_args': 2, 'snippet': 'matmul()', 'description': ''}, + 'mean': {'min_args': 1, 'max_args': 1, 'snippet': 'mean()', 'description': ''}, + 'median': {'min_args': 1, 'max_args': 1, 'snippet': 'median()', 'description': ''}, + 'mode': {'min_args': 1, 'max_args': 1, 'snippet': 'mode()', 'description': ''}, + 'moment': {'min_args': 3, 'max_args': 3, 'snippet': 'moment()', 'description': ''}, + 'morph_close': {'min_args': 1, 'max_args': 2, 'snippet': 'morph_close()', 'description': ''}, + 'morph_open': {'min_args': 1, 'max_args': 2, 'snippet': 'morph_open()', 'description': ''}, + 'motion_mask': {'min_args': 1, 'max_args': 1, 'snippet': 'motion_mask()', 'description': ''}, + 'nan_to_num': {'min_args': 4, 'max_args': 4, 'snippet': 'nan_to_num()', 'description': ''}, + 'noise': {'min_args': 1, 'max_args': 2, 'snippet': 'noise()', 'description': ''}, + 'now': {'min_args': 0, 'max_args': 0, 'snippet': 'now()', 'description': ''}, + 'nvl': {'min_args': 4, 'max_args': 4, 'snippet': 'nvl()', 'description': ''}, + 'oklab_to_rgb': {'min_args': 1, 'max_args': 3, 'snippet': 'oklab_to_rgb()', 'description': ''}, + 'overlay': {'min_args': 3, 'max_args': 4, 'snippet': 'overlay()', 'description': ''}, + 'pad': {'min_args': 2, 'max_args': 2, 'snippet': 'pad()', 'description': ''}, + 'percentile': {'min_args': 2, 'max_args': 2, 'snippet': 'percentile()', 'description': ''}, + 'perlin': {'min_args': 2, 'max_args': 5, 'snippet': 'perlin()', 'description': ''}, + 'perlin_noise': {'min_args': 2, 'max_args': 5, 'snippet': 'perlin_noise()', 'description': ''}, + 'perm': {'min_args': 2, 'max_args': 2, 'snippet': 'perm()', 'description': ''}, + 'permute': {'min_args': 2, 'max_args': 2, 'snippet': 'permute()', 'description': ''}, + 'pinv': {'min_args': 1, 'max_args': 1, 'snippet': 'pinv()', 'description': ''}, + 'plasma': {'min_args': 2, 'max_args': 5, 'snippet': 'plasma()', 'description': ''}, + 'plasma_noise': {'min_args': 2, 'max_args': 5, 'snippet': 'plasma_noise()', 'description': ''}, + 'popcnt': {'min_args': 1, 'max_args': 1, 'snippet': 'popcnt()', 'description': ''}, + 'popcount': {'min_args': 1, 'max_args': 1, 'snippet': 'popcount()', 'description': ''}, + 'pow': {'min_args': 2, 'max_args': 2, 'snippet': 'pow()', 'description': ''}, + 'prcnt': {'min_args': 2, 'max_args': 2, 'snippet': 'prcnt()', 'description': ''}, + 'print': {'min_args': 1, 'max_args': 1, 'snippet': 'print()', 'description': ''}, + 'print_shape': {'min_args': 1, 'max_args': 1, 'snippet': 'print_shape()', 'description': ''}, + 'pshp': {'min_args': 1, 'max_args': 1, 'snippet': 'pshp()', 'description': ''}, + 'quantile': {'min_args': 2, 'max_args': 2, 'snippet': 'quantile()', 'description': ''}, + 'quartil': {'min_args': 2, 'max_args': 2, 'snippet': 'quartil()', 'description': ''}, + 'quartile': {'min_args': 2, 'max_args': 2, 'snippet': 'quartile()', 'description': ''}, + 'rand': {'min_args': 1, 'max_args': 2, 'snippet': 'rand()', 'description': ''}, + 'randb': {'min_args': 2, 'max_args': 3, 'snippet': 'randb()', 'description': ''}, + 'randbeta': {'min_args': 3, 'max_args': 4, 'snippet': 'randbeta()', 'description': ''}, + 'randc': {'min_args': 3, 'max_args': 4, 'snippet': 'randc()', 'description': ''}, + 'rande': {'min_args': 2, 'max_args': 3, 'snippet': 'rande()', 'description': ''}, + 'randg': {'min_args': 3, 'max_args': 4, 'snippet': 'randg()', 'description': ''}, + 'randgumbel': {'min_args': 3, 'max_args': 4, 'snippet': 'randgumbel()', 'description': ''}, + 'randchi2': {'min_args': 2, 'max_args': 3, 'snippet': 'randchi2()', 'description': ''}, + 'randl': {'min_args': 3, 'max_args': 4, 'snippet': 'randl()', 'description': ''}, + 'randln': {'min_args': 3, 'max_args': 4, 'snippet': 'randln()', 'description': ''}, + 'randn': {'min_args': 1, 'max_args': 2, 'snippet': 'randn()', 'description': ''}, + 'random_bernoulli': {'min_args': 2, 'max_args': 3, 'snippet': 'random_bernoulli()', 'description': ''}, + 'random_beta': {'min_args': 3, 'max_args': 4, 'snippet': 'random_beta()', 'description': ''}, + 'random_cauchy': {'min_args': 3, 'max_args': 4, 'snippet': 'random_cauchy()', 'description': ''}, + 'random_exponential': {'min_args': 2, 'max_args': 3, 'snippet': 'random_exponential()', 'description': ''}, + 'random_gamma': {'min_args': 3, 'max_args': 4, 'snippet': 'random_gamma()', 'description': ''}, + 'random_gumbel': {'min_args': 3, 'max_args': 4, 'snippet': 'random_gumbel()', 'description': ''}, + 'random_chi2': {'min_args': 2, 'max_args': 3, 'snippet': 'random_chi2()', 'description': ''}, + 'random_laplace': {'min_args': 3, 'max_args': 4, 'snippet': 'random_laplace()', 'description': ''}, + 'random_log_normal': {'min_args': 3, 'max_args': 4, 'snippet': 'random_log_normal()', 'description': ''}, + 'random_normal': {'min_args': 1, 'max_args': 2, 'snippet': 'random_normal()', 'description': ''}, + 'random_poisson': {'min_args': 2, 'max_args': 3, 'snippet': 'random_poisson()', 'description': ''}, + 'random_studentt': {'min_args': 2, 'max_args': 3, 'snippet': 'random_studentt()', 'description': ''}, + 'random_uniform': {'min_args': 1, 'max_args': 2, 'snippet': 'random_uniform()', 'description': ''}, + 'random_weibull': {'min_args': 3, 'max_args': 4, 'snippet': 'random_weibull()', 'description': ''}, + 'randp': {'min_args': 2, 'max_args': 3, 'snippet': 'randp()', 'description': ''}, + 'randt': {'min_args': 2, 'max_args': 3, 'snippet': 'randt()', 'description': ''}, + 'randu': {'min_args': 1, 'max_args': 2, 'snippet': 'randu()', 'description': ''}, + 'randw': {'min_args': 3, 'max_args': 4, 'snippet': 'randw()', 'description': ''}, + 'range': {'min_args': 3, 'max_args': 3, 'snippet': 'range()', 'description': ''}, + 'relu': {'min_args': 1, 'max_args': None, 'snippet': 'relu()', 'description': ''}, + 'remap': {'min_args': 5, 'max_args': 5, 'snippet': 'remap()', 'description': ''}, + 'replace': {'min_args': 3, 'max_args': 3, 'snippet': 'replace()', 'description': ''}, + 'reshape': {'min_args': 2, 'max_args': 2, 'snippet': 'reshape()', 'description': ''}, + 'rgb_to_cielab': {'min_args': 1, 'max_args': 3, 'snippet': 'rgb_to_cielab()', 'description': ''}, + 'rgb_to_hsv': {'min_args': 1, 'max_args': 4, 'snippet': 'rgb_to_hsv()', 'description': ''}, + 'rgb_to_int': {'min_args': 1, 'max_args': 3, 'snippet': 'rgb_to_int()', 'description': ''}, + 'rgb_to_oklab': {'min_args': 1, 'max_args': 3, 'snippet': 'rgb_to_oklab()', 'description': ''}, + 'ridged': {'min_args': 2, 'max_args': 5, 'snippet': 'ridged()', 'description': ''}, + 'ridged_noise': {'min_args': 2, 'max_args': 5, 'snippet': 'ridged_noise()', 'description': ''}, + 'rife': {'min_args': 4, 'max_args': 5, 'snippet': 'rife()', 'description': ''}, + 'roll': {'min_args': 2, 'max_args': 3, 'snippet': 'roll()', 'description': ''}, + 'round': {'min_args': 1, 'max_args': 1, 'snippet': 'round()', 'description': ''}, + 'rshp': {'min_args': 2, 'max_args': 2, 'snippet': 'rshp()', 'description': ''}, + 'select': {'min_args': 2, 'max_args': 2, 'snippet': 'select()', 'description': ''}, + 'shape': {'min_args': 1, 'max_args': 1, 'snippet': 'shape()', 'description': ''}, + 'shuffle': {'min_args': 2, 'max_args': 2, 'snippet': 'shuffle()', 'description': ''}, + 'sigm': {'min_args': 1, 'max_args': 1, 'snippet': 'sigm()', 'description': ''}, + 'sign': {'min_args': 1, 'max_args': 1, 'snippet': 'sign()', 'description': ''}, + 'sin': {'min_args': 1, 'max_args': 1, 'snippet': 'sin()', 'description': ''}, + 'sine': {'min_args': 3, 'max_args': 3, 'snippet': 'sine()', 'description': ''}, + 'sine_ease': {'min_args': 3, 'max_args': 3, 'snippet': 'sine_ease()', 'description': ''}, + 'sinh': {'min_args': 1, 'max_args': 1, 'snippet': 'sinh()', 'description': ''}, + 'smax': {'min_args': 1, 'max_args': None, 'snippet': 'smax()', 'description': ''}, + 'smin': {'min_args': 1, 'max_args': None, 'snippet': 'smin()', 'description': ''}, + 'smootherstep': {'min_args': 3, 'max_args': 3, 'snippet': 'smootherstep()', 'description': ''}, + 'smoothstep': {'min_args': 3, 'max_args': 3, 'snippet': 'smoothstep()', 'description': ''}, + 'snorm': {'min_args': 1, 'max_args': 1, 'snippet': 'snorm()', 'description': ''}, + 'softmax': {'min_args': 1, 'max_args': 2, 'snippet': 'softmax()', 'description': ''}, + 'softmin': {'min_args': 1, 'max_args': 2, 'snippet': 'softmin()', 'description': ''}, + 'softplus': {'min_args': 1, 'max_args': 1, 'snippet': 'softplus()', 'description': ''}, + 'sort': {'min_args': 1, 'max_args': 1, 'snippet': 'sort()', 'description': ''}, + 'split': {'min_args': 1, 'max_args': 2, 'snippet': 'split()', 'description': ''}, + 'sqrt': {'min_args': 1, 'max_args': 1, 'snippet': 'sqrt()', 'description': ''}, + 'stack_clear': {'min_args': 1, 'max_args': 1, 'snippet': 'stack_clear()', 'description': ''}, + 'stack_get': {'min_args': 1, 'max_args': 1, 'snippet': 'stack_get()', 'description': ''}, + 'stack_has': {'min_args': 1, 'max_args': 1, 'snippet': 'stack_has()', 'description': ''}, + 'stack_pop': {'min_args': 1, 'max_args': 1, 'snippet': 'stack_pop()', 'description': ''}, + 'stack_push': {'min_args': 2, 'max_args': 2, 'snippet': 'stack_push()', 'description': ''}, + 'std': {'min_args': 1, 'max_args': 1, 'snippet': 'std()', 'description': ''}, + 'step': {'min_args': 2, 'max_args': 2, 'snippet': 'step()', 'description': ''}, + 'substr': {'min_args': 2, 'max_args': 3, 'snippet': 'substr()', 'description': ''}, + 'substring': {'min_args': 2, 'max_args': 3, 'snippet': 'substring()', 'description': ''}, + 'sum': {'min_args': 1, 'max_args': 1, 'snippet': 'sum()', 'description': ''}, + 'swap': {'min_args': 4, 'max_args': 4, 'snippet': 'swap()', 'description': ''}, + 'tan': {'min_args': 1, 'max_args': 1, 'snippet': 'tan()', 'description': ''}, + 'tanh': {'min_args': 1, 'max_args': 1, 'snippet': 'tanh()', 'description': ''}, + 'tensor': {'min_args': 2, 'max_args': 3, 'snippet': 'tensor()', 'description': ''}, + 'text_image': {'min_args': 3, 'max_args': 9, 'snippet': 'text_image()', 'description': ''}, + 'timestamp': {'min_args': 0, 'max_args': 0, 'snippet': 'timestamp()', 'description': ''}, + 'tmax': {'min_args': 2, 'max_args': 2, 'snippet': 'tmax()', 'description': ''}, + 'tmin': {'min_args': 2, 'max_args': 2, 'snippet': 'tmin()', 'description': ''}, + 'tnorm': {'min_args': 1, 'max_args': 1, 'snippet': 'tnorm()', 'description': ''}, + 'topk': {'min_args': 2, 'max_args': 2, 'snippet': 'topk()', 'description': ''}, + 'topk_ind': {'min_args': 2, 'max_args': 2, 'snippet': 'topk_ind()', 'description': ''}, + 'topk_indices': {'min_args': 2, 'max_args': 2, 'snippet': 'topk_indices()', 'description': ''}, + 'trim': {'min_args': 1, 'max_args': 1, 'snippet': 'trim()', 'description': ''}, + 'turbulence': {'min_args': 2, 'max_args': 5, 'snippet': 'turbulence()', 'description': ''}, + 'unique': {'min_args': 1, 'max_args': 1, 'snippet': 'unique()', 'description': ''}, + 'upper': {'min_args': 1, 'max_args': 1, 'snippet': 'upper()', 'description': ''}, + 'var': {'min_args': 1, 'max_args': 1, 'snippet': 'var()', 'description': ''}, + 'voronoi': {'min_args': 2, 'max_args': 5, 'snippet': 'voronoi()', 'description': ''}, + 'voronoi_noise': {'min_args': 2, 'max_args': 5, 'snippet': 'voronoi_noise()', 'description': ''}, + 'where': {'min_args': 3, 'max_args': 3, 'snippet': 'where()', 'description': ''}, + 'worley': {'min_args': 2, 'max_args': 5, 'snippet': 'worley()', 'description': ''}, } \ No newline at end of file diff --git a/web/autocomplete.js b/web/autocomplete.js index feff7e3..9df5a1f 100644 --- a/web/autocomplete.js +++ b/web/autocomplete.js @@ -1,32 +1,57 @@ import { FUNCTIONS, KEYWORDS, CONSTANTS, FUNCTION_META } from "./inbuilt_symbols.js"; const AUTOCOMPLETE_STYLE_ID = "mrmth-script-autocomplete-styles"; - function ensureAutocompleteStyles() { if (document.getElementById(AUTOCOMPLETE_STYLE_ID)) return; const style = document.createElement("style"); style.id = AUTOCOMPLETE_STYLE_ID; style.textContent = ` - .mrmth-autocomplete { - position: fixed; - z-index: 10000; - min-width: 180px; - max-width: min(420px, 100vw - 16px); - max-height: 220px; - overflow-y: auto; - overscroll-behavior: contain; - pointer-events: auto; - margin: 0; - padding: 4px 0; - list-style: none; - border: 1px solid rgba(255, 255, 255, 0.18); - border-radius: 8px; - background: rgba(18, 20, 24, 0.97); - box-shadow: 0 8px 24px rgba(0, 0, 0, 0.45); - font-family: monospace; - font-size: 12px; - } + + +.mrmth-autocomplete-tooltip { + display: none; /* Řízeno přes JS */ + min-width: 200px; + max-width: 320px; + margin-left: 8px; + padding: 10px 12px; + border: 1px solid rgba(255, 255, 255, 0.12); + border-radius: 8px; + background: rgba(24, 28, 36, 0.98); + box-shadow: 0 8px 32px rgba(0, 0, 0, 0.5); + font-family: monospace; + font-size: 11px; + color: #b3b9c1; + line-height: 1.5; + pointer-events: auto; +} + +.mrmth-autocomplete-layout { + display: flex !important; + flex-direction: row !important; + align-items: flex-start !important; + position: fixed !important; /* Pozici drží POUZE tento společný obal! */ + z-index: 10000 !important; + pointer-events: none; +} + +.mrmth-autocomplete { + /* !!! ZDE SMAŽ position: fixed; a z-index: 10000; !!! */ + min-width: 180px; + max-height: 220px; + overflow-y: auto; + overscroll-behavior: contain; + pointer-events: auto; + margin: 0; + padding: 4px 0; + list-style: none; + border: 1px solid rgba(255, 255, 255, 0.18); + border-radius: 8px; + background: rgba(18, 20, 24, 0.97); + box-shadow: 0 8px 24px rgba(0, 0, 0, 0.45); + font-family: monospace; + font-size: 12px; +} .mrmth-autocomplete-item { display: flex; @@ -54,20 +79,6 @@ function ensureAutocompleteStyles() { color: #c39bd3; font-weight: 600; } - - .mrmth-autocomplete-item.is-keyword .mrmth-ac-name { - color: #e74c3c; - } - - .mrmth-autocomplete-item.is-constant .mrmth-ac-name { - color: #f1c40f; - } - - .mrmth-autocomplete-item .mrmth-ac-hint { - color: #7f8c8d; - font-size: 11px; - white-space: nowrap; - } `; document.head.appendChild(style); } @@ -261,10 +272,83 @@ function getCaretScreenPosition(textarea, position) { export function attachAutocomplete(textarea, _containerEl) { ensureAutocompleteStyles(); - const dropdown = document.createElement("ul"); - dropdown.className = "mrmth-autocomplete"; - dropdown.hidden = true; - document.body.appendChild(dropdown); + // 1. Deklarace prvků nového rozvržení + let layoutEl = null; + let listEl = null; // Toto plně nahradí tvůj původní samostatný "dropdown" + let tooltipEl = null; + + // 2. Opravené vytvoření dropdownu, které se spustí ihned + function createDropdown() { + layoutEl = document.createElement("div"); + layoutEl.className = "mrmth-autocomplete-layout"; + layoutEl.style.position = "fixed"; + layoutEl.style.zIndex = "10000"; + layoutEl.style.display = "flex"; + layoutEl.hidden = true; + + listEl = document.createElement("ul"); + listEl.className = "mrmth-autocomplete"; + listEl.addEventListener("wheel", onDropdownWheel, { passive: false }); + layoutEl.appendChild(listEl); + + tooltipEl = document.createElement("div"); + tooltipEl.className = "mrmth-autocomplete-tooltip"; + tooltipEl.style.display = "none"; + layoutEl.appendChild(tooltipEl); + + document.body.appendChild(layoutEl); + } + + function updateTooltip(selectedItem) { + if (!tooltipEl || !layoutEl) return; + + const meta = FUNCTION_META[selectedItem?.name] || selectedItem; + + if (!meta || !meta.description) { + tooltipEl.style.display = "none"; + return; + } + + let argsText = `Arguments: min ${meta.minArgs ?? 0}`; + if (meta.maxArgs !== undefined && meta.maxArgs !== null) { + argsText += `, max ${meta.maxArgs}`; + } else { + argsText += "+ (variadic)"; + } + + tooltipEl.innerHTML = ` +