### Advanced Parsing Overview ### Inline Methods Dynamic substitutions allow value calculation: ```yaml width: "{width:source}" # Width from the input "source". height: "{height:source}" # Height from the input "source". random_int: "{random:5,10}" random_float: "{random:5.0,10.0}" var: "{var:myvar}" # Value from previously assigned variable 'myvar'. condition: "{exists:cache/mask.png}" # 1 if file exists. 0 if not. ``` ### Parsing By default, any inline methods, like `{var:…}`, `{random:…}`, `{exists:…}`, `{width:…}`, and `{height:…}`are automatically evaluated. For simple evaluations (e.g. `20 + 5`), booleans, comparisons, and more, you can wrap your expression in double-brackets (`[[ … ]]`). ### Color Values Color strings are processed using `PIL.ImageColor.getcolor(color_str, "RGBA")`. Accepted formats include `#RRGGBB`, `rgba(...)`, and named colors. ### Numeric Values Supports inline math and methods: ```yaml w: "100" x: "{var: x}" # Previously assigned variable. y: "[[ 20/2 + (10 * 10) - 10 ]]" z: "[[ {width:source}/2 ]]" # Inline math using input metadata. ``` ### Point Values Coordinates can be specified as absolute or relative: _Absolute:_ ```yaml anchor: "(100,20)" anchor2: "([[50*2]], {height:source})" ``` _Relative:_ ```yaml relative_anchor: "rel(0.5,0.5)" # Relative to contextual value. ``` --- ### Behavior and Inheritance - **Variable Inheritance:** Nested jobs inherit the parent's variables (including those set via assign blocks) for inline substitutions. - **Override Inheritance:** Nested jobs inherit a copy of the parent's structured overrides, merged into the nested job's definition during execution. - **Isolation:** Changes within a nested job (including overrides and variable assignments) do not affect the parent job. --- ### Inline Methods (Always Parsed) - **What**: `{var:…}`, `{exists:…}`, `{random:…}`, `{width:…}`, `{height:…}`, `rel(…)`, etc. - **When**: Always applied first, on every value, before any math or condition logic. - **Nesting**: If you write an inline method inside another (e.g. `{var:myvar{random:1,10}}`), the inner `{random:…}` runs first, then its result feeds into the outer `{var:…}` lookup. ### Double-bracket parsing - **Trigger**: Any value containing `[[…]]`. - **Scope**: Only the text inside each `[[…]]` is evaluated—everything else remains exactly as written. - **Capabilities**: - Full boolean & comparison logic - Ternary expressions (`a if cond else b`) - Tuple math (`(x+5, y*0.5)`) - Math functions (`abs()`, `round()`, `min()`, `max()`, `math.floor()`, etc.) - Inline methods can still be used inside `[[…]]`. ### Escaping Brackets - To include literal `[[` or `]]` without triggering advanced evaluation, prefix them with a backslash: ```yaml message: "\[\[ escaped double brackets \]\]" ``` * You can mix escapes and eval: ```yaml text: "\[\[unparsed\]\] 2+2=[[ 2 + 2 ]]" # → "[[unparsed]] 2+2=4" ``` ## Examples - **Arithmetic & Math** - `+ - * / % **` - e.g. `[[ ({var:width} + {var:padding}) * 2 ]]` - **Booleans & Comparisons** - `and`, `or`, `not` - `<, <=, >, >=, ==, !=` - e.g. `[[ not {var:done} ]]` - e.g. `[[ {var:count} > 3 and {var:flag} ]]` - **Ternary (Conditional) Expressions** - `a if cond else b` - e.g. `[[ {var:padding} if {var:width} > 1000 else 10 ]]` - **Math Functions** - `abs()`, `round()`, `min()`, `max()`, `math.floor()`, `math.ceil()`, `math.sqrt()` - e.g. `[[ round( max({var:width}, {var:height}) / 2 ) ]]` - **Inline Methods Inside Brackets** - You can mix any inline method inside your bracketed expressions: - `{var:…}` for variables - `{exists:…}` for file existence - `{random:…}`, `{width:…}`, `{height:…}`, etc. ### Examples ```yaml # 1) Conditional step - processor: processor: "trim" condition: "[[ {width:source} > 800 ]]" # 2) Ternary padding params: padding: "[[ {var:padding} if {width:source} >= 1024 else 10 ]]" # 3) Composite anchors with tuple math - processor: processor: "composite" params: overlay_anchor: " ( [[{width:background}/2]], [[{height:background}/2]] ) " # 4) Boolean + exists + var - processor: processor: "inpaint" condition: '[[ "{exists:cache/mask.png}" and not {var:skipped} ]]' # 5) Using math functions params: blur_radius: "[[ round( {var:shadow_scale} * 2.5 ) ]]" # 6) Comparison with multiple vars - processor: processor: "example" condition: "[[ {var:count} > 3 and {var:enabled} ]]" ```