├── utils ├── __init__.py └── paths.py ├── streams ├── __init__.py └── stream_manager.py ├── wrappers ├── __init__.py ├── external_types │ └── __init__.py ├── immutable_types │ ├── __init__.py │ ├── string.py │ ├── none.py │ └── tuple.py ├── mutable_types │ ├── __init__.py │ ├── deque.py │ ├── dict.py │ └── list.py ├── wrapper_abc.py └── wrapper_factory.py ├── requirements.txt ├── example_workflows ├── Mask Crop.jpg ├── Dynamic Contrast Adjustment.jpg ├── Load Most Recent Image in Folder.jpg ├── Get Complementary Color Palette from Image.jpg ├── Load Most Recent Image in Folder.json ├── Dynamic Contrast Adjustment.json ├── Mask Crop.json └── Get Complementary Color Palette from Image.json ├── .gitignore ├── lib-ace ├── ext-error_marker.js ├── theme-textmate.js ├── ext-simple_tokenizer.js ├── ext-statusbar.js ├── ext-themelist.js ├── ext-hardwrap.js ├── ext-rtl.js ├── theme-gruvbox.js ├── theme-nord_dark.js ├── theme-xcode.js ├── theme-clouds.js ├── theme-eclipse.js ├── ext-whitespace.js ├── theme-solarized_dark.js ├── theme-monokai.js ├── theme-cobalt.js ├── theme-solarized_light.js ├── theme-twilight.js ├── theme-github.js ├── theme-tomorrow.js ├── theme-pastel_on_dark.js ├── theme-github_dark.js ├── theme-mono_industrial.js ├── theme-tomorrow_night.js ├── theme-chaos.js ├── theme-one_dark.js ├── ext-split.js ├── theme-chrome.js ├── theme-terminal.js ├── theme-gruvbox_dark_hard.js ├── theme-tomorrow_night_blue.js ├── ext-elastic_tabstops_lite.js ├── theme-sqlserver.js ├── theme-tomorrow_night_eighties.js ├── ext-static_highlight.js ├── theme-dreamweaver.js ├── theme-gruvbox_light_hard.js ├── ext-beautify.js ├── theme-tomorrow_night_bright.js ├── theme-github_light_default.js ├── theme-dracula.js ├── ext-modelist.js ├── keybinding-vscode.js ├── ext-textarea.js ├── keybinding-sublime.js └── mode-python.js ├── pyproject.toml ├── __init__.py ├── .github └── workflows │ └── publish.yml ├── web ├── append-stdout.js ├── config.js ├── python-interpreter-node.js └── ace-editor.js ├── README.md └── python_interpreter_node.py /utils/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /streams/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /wrappers/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | Pillow>=10.3.0 2 | -------------------------------------------------------------------------------- /wrappers/external_types/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /wrappers/immutable_types/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /wrappers/mutable_types/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /example_workflows/Mask Crop.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/christian-byrne/python-interpreter-node/HEAD/example_workflows/Mask Crop.jpg -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | **/__pycache__ 2 | .env 3 | .python-version 4 | __pycache__ 5 | temp.py 6 | temp.* 7 | *.mkv 8 | test-env.sh 9 | todo.md 10 | **/**/*roadmap.md -------------------------------------------------------------------------------- /example_workflows/Dynamic Contrast Adjustment.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/christian-byrne/python-interpreter-node/HEAD/example_workflows/Dynamic Contrast Adjustment.jpg -------------------------------------------------------------------------------- /example_workflows/Load Most Recent Image in Folder.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/christian-byrne/python-interpreter-node/HEAD/example_workflows/Load Most Recent Image in Folder.jpg -------------------------------------------------------------------------------- /example_workflows/Get Complementary Color Palette from Image.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/christian-byrne/python-interpreter-node/HEAD/example_workflows/Get Complementary Color Palette from Image.jpg -------------------------------------------------------------------------------- /lib-ace/ext-error_marker.js: -------------------------------------------------------------------------------- 1 | ; (function() { 2 | ace.require(["ace/ext/error_marker"], function(m) { 3 | if (typeof module == "object" && typeof exports == "object" && module) { 4 | module.exports = m; 5 | } 6 | }); 7 | })(); 8 | -------------------------------------------------------------------------------- /utils/paths.py: -------------------------------------------------------------------------------- 1 | from pathlib import Path 2 | import sys 3 | 4 | def get_proj_root(current_dir=None) -> Path: 5 | if current_dir is None: 6 | current_dir = Path.cwd() 7 | 8 | while not (current_dir / "pyproject.toml").exists(): 9 | current_dir = current_dir.parent 10 | 11 | if current_dir == Path.home(): 12 | # Fallback 13 | return Path(__file__).resolve().parent.parent.parent 14 | 15 | def get_module_path(module_name: str) -> Path: 16 | return Path(sys.modules[module_name].__file__).resolve() 17 | -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [project] 2 | name = "python-interpreter-node" 3 | description = "Python interpreter to embed scripts into workflows and debug custom nodes." 4 | version = "2.1.0" 5 | license = "LICENSE" 6 | dependencies = ["Pillow>=10.3.0"] 7 | 8 | [project.urls] 9 | Repository = "https://github.com/christian-byrne/python-interpreter-node" 10 | # Used by Comfy Registry https://comfyregistry.org 11 | 12 | [tool.comfy] 13 | PublisherId = "christian-byrne" 14 | DisplayName = "python-interpreter-node" 15 | Icon = "https://img.icons8.com/?size=100&id=121465&format=png&color=000000" 16 | -------------------------------------------------------------------------------- /lib-ace/theme-textmate.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/theme/textmate",["require","exports","module","ace/theme/textmate-css","ace/lib/dom"],function(e,t,n){"use strict";t.isDark=!1,t.cssClass="ace-tm",t.cssText=e("./textmate-css"),t.$id="ace/theme/textmate";var r=e("../lib/dom");r.importCssString(t.cssText,t.cssClass,!1)}); (function() { 2 | ace.require(["ace/theme/textmate"], function(m) { 3 | if (typeof module == "object" && typeof exports == "object" && module) { 4 | module.exports = m; 5 | } 6 | }); 7 | })(); 8 | -------------------------------------------------------------------------------- /wrappers/mutable_types/deque.py: -------------------------------------------------------------------------------- 1 | import sys 2 | import os 3 | 4 | sys.path.append(os.path.join(os.path.dirname(__file__), "..")) 5 | from ..wrapper_abc import Wrapper 6 | 7 | from collections import deque 8 | from typing import Union, Any 9 | 10 | 11 | class DequeWrapper(Wrapper, deque): 12 | def __init__(self, value: deque): 13 | self.data = value 14 | 15 | def to(self, new_value: Union[deque, Wrapper, Any]) -> Wrapper: 16 | while isinstance(new_value, Wrapper): 17 | new_value = new_value.resolve() 18 | 19 | self.data = new_value 20 | return self 21 | 22 | def resolve(self) -> deque: 23 | return self.data 24 | -------------------------------------------------------------------------------- /wrappers/mutable_types/dict.py: -------------------------------------------------------------------------------- 1 | import sys 2 | import os 3 | 4 | sys.path.append(os.path.join(os.path.dirname(__file__), "..")) 5 | from ..wrapper_abc import Wrapper 6 | 7 | from collections import UserDict 8 | from typing import Any, Union 9 | 10 | 11 | class DictWrapper(UserDict, Wrapper): 12 | def __init__(self, value): 13 | self.data = value 14 | 15 | def to(self, new_value: Union[dict, Wrapper, Any]) -> Wrapper: 16 | while isinstance(new_value, Wrapper): 17 | new_value = new_value.resolve() 18 | 19 | self.data = dict(new_value) 20 | return self 21 | 22 | def resolve(self) -> dict: 23 | return self.data 24 | -------------------------------------------------------------------------------- /wrappers/mutable_types/list.py: -------------------------------------------------------------------------------- 1 | import sys 2 | import os 3 | 4 | sys.path.append(os.path.join(os.path.dirname(__file__), "..")) 5 | from ..wrapper_abc import Wrapper 6 | 7 | from collections import UserList 8 | from typing import Any, Union 9 | 10 | 11 | class ListWrapper(UserList, Wrapper): 12 | def __init__(self, value): 13 | self.data = value 14 | 15 | def to(self, new_value: Union[list, Wrapper, Any]) -> Wrapper: 16 | while isinstance(new_value, Wrapper): 17 | new_value = new_value.resolve() 18 | 19 | self.data = list(new_value) 20 | return self 21 | 22 | def resolve(self) -> list: 23 | return self.data 24 | -------------------------------------------------------------------------------- /wrappers/immutable_types/string.py: -------------------------------------------------------------------------------- 1 | import sys 2 | import os 3 | 4 | sys.path.append(os.path.join(os.path.dirname(__file__), "..")) 5 | from ..wrapper_abc import Wrapper 6 | 7 | from collections import UserString 8 | from typing import Any, Union 9 | 10 | 11 | class StringWrapper(UserString, Wrapper): 12 | def __init__(self, value): 13 | self.data = value 14 | 15 | def to(self, new_value: Union[str, Wrapper, Any]) -> Wrapper: 16 | while isinstance(new_value, Wrapper): 17 | new_value = new_value.resolve() 18 | 19 | self.data = new_value 20 | return self 21 | 22 | def resolve(self) -> str: 23 | return self.data 24 | -------------------------------------------------------------------------------- /__init__.py: -------------------------------------------------------------------------------- 1 | from rich import print 2 | from server import PromptServer 3 | from aiohttp import web 4 | from pathlib import Path 5 | 6 | from .python_interpreter_node import PythonInterpreter 7 | 8 | 9 | NODE_CLASS_MAPPINGS = { 10 | "Exec Python Code Script": PythonInterpreter 11 | } 12 | 13 | NODE_DISPLAY_NAME_MAPPINGS = { 14 | "Exec Python Code Script": "Python Interpreter" 15 | } 16 | 17 | WEB_DIRECTORY = "./web" 18 | 19 | ACE_PATH = Path(__file__).parent / "lib-ace" 20 | if ACE_PATH.exists(): 21 | PromptServer.instance.app.router.add_routes( 22 | [web.static("/lib-ace", ACE_PATH.as_posix())] 23 | ) 24 | else: 25 | print(f"python_interpreter_node: ACE_PATH does not exist: {ACE_PATH}") -------------------------------------------------------------------------------- /wrappers/immutable_types/none.py: -------------------------------------------------------------------------------- 1 | import sys 2 | import os 3 | 4 | sys.path.append(os.path.join(os.path.dirname(__file__), "..")) 5 | from ..wrapper_abc import Wrapper 6 | 7 | from typing import Any, Union 8 | 9 | 10 | class NoneWrapper(Wrapper): 11 | def __init__(self, value: None): 12 | self.data = value 13 | 14 | def to(self, new_value: Union[None, Wrapper, Any]) -> Wrapper: 15 | while isinstance(new_value, Wrapper): 16 | new_value = new_value.resolve() 17 | 18 | self.data = new_value 19 | return self 20 | 21 | def resolve(self) -> None: 22 | return self.data 23 | 24 | def __str__(self) -> str: 25 | return "None" 26 | 27 | def __repr__(self) -> str: 28 | return super().__repr__() 29 | -------------------------------------------------------------------------------- /.github/workflows/publish.yml: -------------------------------------------------------------------------------- 1 | name: Publish to Comfy registry 2 | on: 3 | workflow_dispatch: 4 | push: 5 | branches: 6 | - master 7 | paths: 8 | - "pyproject.toml" 9 | 10 | jobs: 11 | publish-node: 12 | name: Publish Custom Node to registry 13 | runs-on: ubuntu-latest 14 | # if this is a forked repository. Skipping the workflow. 15 | if: github.event.repository.fork == false 16 | steps: 17 | - name: Check out code 18 | uses: actions/checkout@v4 19 | - name: Publish Custom Node 20 | uses: Comfy-Org/publish-node-action@main 21 | with: 22 | ## Add your own personal access token to your Github Repository secrets and reference it here. 23 | personal_access_token: ${{ secrets.REGISTRY_ACCESS_TOKEN }} -------------------------------------------------------------------------------- /lib-ace/ext-simple_tokenizer.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/ext/simple_tokenizer",["require","exports","module","ace/tokenizer","ace/layer/text_util"],function(e,t,n){"use strict";function o(e,t){var n=new s(e,new r(t.getRules())),o=[];for(var u=0;u Wrapper: 11 | while isinstance(new_value, Wrapper): 12 | new_value = new_value.resolve() 13 | 14 | self.data = new_value 15 | return self 16 | 17 | def resolve(self): 18 | return self.data 19 | 20 | def __getitem__(self, key): 21 | if key == "parent_attributes": 22 | return [ 23 | "data", 24 | "to", 25 | "resolve", 26 | "parent_attributes", 27 | ] 28 | elif key in self.parent_attributes: 29 | return getattr(self, key) 30 | else: 31 | return getattr(self.data, key) 32 | 33 | def __setitem__(self, key, value): 34 | if key in self.parent_attributes: 35 | setattr(self, key, value) 36 | else: 37 | setattr(self.data, key, value) 38 | 39 | def __repr__(self): 40 | return f"TupleWrapper({self.data})" 41 | -------------------------------------------------------------------------------- /lib-ace/ext-statusbar.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/ext/statusbar",["require","exports","module","ace/lib/dom","ace/lib/lang"],function(e,t,n){"use strict";var r=e("../lib/dom"),i=e("../lib/lang"),s=function(){function e(e,t){this.element=r.createElement("div"),this.element.className="ace_status-indicator",this.element.style.cssText="display: inline-block;",t.appendChild(this.element);var n=i.delayedCall(function(){this.updateStatus(e)}.bind(this)).schedule.bind(null,100);e.on("changeStatus",n),e.on("changeSelection",n),e.on("keyboardActivity",n)}return e.prototype.updateStatus=function(e){function n(e,n){e&&t.push(e,n||"|")}var t=[];n(e.keyBinding.getStatusText(e)),e.commands.recording&&n("REC");var r=e.selection,i=r.lead;if(!r.isEmpty()){var s=e.getSelectionRange();n("("+(s.end.row-s.start.row)+":"+(s.end.column-s.start.column)+")"," ")}n(i.row+":"+i.column," "),r.rangeCount&&n("["+r.rangeCount+"]"," "),t.pop(),this.element.textContent=t.join("")},e}();t.StatusBar=s}); (function() { 2 | ace.require(["ace/ext/statusbar"], function(m) { 3 | if (typeof module == "object" && typeof exports == "object" && module) { 4 | module.exports = m; 5 | } 6 | }); 7 | })(); 8 | -------------------------------------------------------------------------------- /lib-ace/ext-themelist.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/ext/themelist",["require","exports","module"],function(e,t,n){"use strict";var r=[["Chrome"],["Clouds"],["Crimson Editor"],["Dawn"],["Dreamweaver"],["Eclipse"],["GitHub Light Default"],["GitHub (Legacy)","github","light"],["IPlastic"],["Solarized Light"],["TextMate"],["Tomorrow"],["XCode"],["Kuroir"],["KatzenMilch"],["SQL Server","sqlserver","light"],["CloudEditor","cloud_editor","light"],["Ambiance","ambiance","dark"],["Chaos","chaos","dark"],["Clouds Midnight","clouds_midnight","dark"],["Dracula","","dark"],["Cobalt","cobalt","dark"],["Gruvbox","gruvbox","dark"],["Green on Black","gob","dark"],["idle Fingers","idle_fingers","dark"],["krTheme","kr_theme","dark"],["Merbivore","merbivore","dark"],["Merbivore Soft","merbivore_soft","dark"],["Mono Industrial","mono_industrial","dark"],["Monokai","monokai","dark"],["Nord Dark","nord_dark","dark"],["One Dark","one_dark","dark"],["Pastel on dark","pastel_on_dark","dark"],["Solarized Dark","solarized_dark","dark"],["Terminal","terminal","dark"],["Tomorrow Night","tomorrow_night","dark"],["Tomorrow Night Blue","tomorrow_night_blue","dark"],["Tomorrow Night Bright","tomorrow_night_bright","dark"],["Tomorrow Night 80s","tomorrow_night_eighties","dark"],["Twilight","twilight","dark"],["Vibrant Ink","vibrant_ink","dark"],["GitHub Dark","github_dark","dark"],["CloudEditor Dark","cloud_editor_dark","dark"]];t.themesByName={},t.themes=r.map(function(e){var n=e[1]||e[0].replace(/ /g,"_").toLowerCase(),r={caption:e[0],theme:"ace/theme/"+n,isDark:e[2]=="dark",name:n};return t.themesByName[n]=r,r})}); (function() { 2 | ace.require(["ace/ext/themelist"], function(m) { 3 | if (typeof module == "object" && typeof exports == "object" && module) { 4 | module.exports = m; 5 | } 6 | }); 7 | })(); 8 | -------------------------------------------------------------------------------- /lib-ace/ext-hardwrap.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/ext/hardwrap",["require","exports","module","ace/range","ace/editor","ace/config"],function(e,t,n){"use strict";function i(e,t){function m(e,t,n){if(e.lengthn)return{start:o.index,end:o.index+o[2].length};if(s&&s[2])return u=t+s[2].length,{start:u,end:u+s[3].length}}var n=t.column||e.getOption("printMarginColumn"),i=t.allowMerge!=0,s=Math.min(t.startRow,t.endRow),o=Math.max(t.startRow,t.endRow),u=e.session;while(s<=o){var a=u.getLine(s);if(a.length>n){var f=m(a,n,5);if(f){var l=/^\s*/.exec(a)[0];u.replace(new r(s,f.start,s,f.end),"\n"+l)}o++}else if(i&&/\S/.test(a)&&s!=o){var c=u.getLine(s+1);if(c&&/\S/.test(c)){var h=a.replace(/\s+$/,""),p=c.replace(/^\s+/,""),d=h+" "+p,f=m(d,n,5);if(f&&f.start>h.length||d.length w.name === nodeConfig.stdoutErrId); 17 | if (insertIndex !== -1) { 18 | console.debug(`[onExecuted handler] Removing existing ${nodeConfig.stdoutErrId} widgets after insert index`); 19 | for (let i = insertIndex; i < node.widgets.length; i++) { 20 | (_b = (_a = node.widgets[i]).onRemove) === null || _b === void 0 ? void 0 : _b.call(_a); 21 | liteGraph.setDirtyCanvas(true, true); 22 | } 23 | node.widgets.length = insertIndex; 24 | } 25 | else { 26 | console.debug(`[onExecuted handler] No existing ${nodeConfig.stdoutErrId} widgets found. Nothing to remove...`); 27 | } 28 | const outputWidget = ComfyWidgets["STRING"](node, nodeConfig.stdoutErrId, ["STRING", { multiline: true }], app).widget; 29 | outputWidget.value = data.text.join(""); 30 | liteGraph.setDirtyCanvas(true, true); 31 | }); 32 | } 33 | -------------------------------------------------------------------------------- /web/config.js: -------------------------------------------------------------------------------- 1 | export const nodeConfig = { 2 | aceLibPath: "/lib-ace/ace.js", 3 | nodeTitle: "Python Interpreter", 4 | projectDirName: "python-interpreter-node", 5 | nodeBackendName: "Exec Python Code Script", 6 | graphName: "Python Interpreter Node", 7 | codeEditorId: "python_code", 8 | hiddenInputId: "raw_code", 9 | stdoutErrId: "output_text", 10 | defaultTheme: "github_dark", 11 | themes: [ 12 | "ambiance", 13 | "chaos", 14 | "chrome", 15 | "clouds", 16 | "cobalt", 17 | "dracula", 18 | "dreamweaver", 19 | "eclipse", 20 | "github_dark", 21 | "github", 22 | "github_light_default", 23 | "gruvbox_dark_hard", 24 | "gruvbox", 25 | "gruvbox_light_hard", 26 | "mono_industrial", 27 | "monokai", 28 | "nord_dark", 29 | "one_dark", 30 | "pastel_on_dark", 31 | "solarized_dark", 32 | "solarized_light", 33 | "sqlserver", 34 | "terminal", 35 | "textmate", 36 | "tomorrow", 37 | "tomorrow_night_blue", 38 | "tomorrow_night_bright", 39 | "tomorrow_night_eighties", 40 | "tomorrow_night", 41 | "twilight", 42 | "xcode", 43 | ], 44 | placeholderCode: `"""Docs: https://github.com/christian-byrne/python-interpreter-node""" 45 | 46 | # Use .to() to re-assign the value of input/output variables 47 | list1.to([1, 2, 3]) # Instead of list1 = [1, 2, 3] 48 | number1.to(3.14) # Instead of number1 = 3.14 49 | 50 | # If passing inputs/outputs as args to non-builtins, use .data 51 | from torchvision.transforms import ToPILImage 52 | image1.to(image1.squeeze(0).permute(2, 0, 1)) # From BHWC to CHW 53 | image1_pil = ToPILImage()(image1.data) # Use .data when passing as arg 54 | image1.to(image1.permute(1, 2, 0).unsqueeze(0)) # Back to BHWC 55 | 56 | # In all other cases, code behaves like normal python code 57 | # Any variables you define yourself will behave as expected 58 | print(image1, image2, mask1, mask2, number1, number2, sep='\\n') 59 | print(text1, text2, list1, dict1, any1, any2, any3, any4, sep='\\n') 60 | 61 | `, 62 | }; 63 | -------------------------------------------------------------------------------- /wrappers/wrapper_abc.py: -------------------------------------------------------------------------------- 1 | from abc import ABC, abstractmethod 2 | from typing import Any, Union, Generic, TypeVar 3 | 4 | T = TypeVar("T") 5 | 6 | 7 | class Wrapper(ABC, Generic[T]): 8 | """ 9 | Abstract base class for a wrapper. All input/output variables are wrapped 10 | in a wrapper so that they can be passed to other scopes as a reference 11 | type and so that lexical closures of the input/output data can be passed 12 | to the code-execution scope. 13 | 14 | Classes that inherit from `Wrapper` should imitate the behavior of the 15 | object they represent (of type `T`). This is done by overloading built-in 16 | operators/functions and automatically redirecting everything else with 17 | `__getattr__` and `__setattr__`. Exceptions to this behavior are in the 18 | documentation. 19 | 20 | In addition, all wrappers must inherit/implement this class so that when 21 | an operation is performed between two or more wrapped objects, they can 22 | recognize one another as being Wrapper instances and act accordingly. This 23 | pattern can be seen in the operator overloads of the 24 | `collections.UserString`, `collections.UserList`, etc. classes. 25 | 26 | Attributes: 27 | T: The type of the data being wrapped. 28 | 29 | """ 30 | 31 | @abstractmethod 32 | def to(self, new_data: Union[T, Any]) -> "Wrapper[T]": 33 | """ 34 | Effectively replaces the `=` operator for the wrapper's data. 35 | 36 | Updates the data of the wrapper interface to the specified value. Try 37 | to avoid re-assigning an input/output variable, especially to a 38 | reference type, as this can lead to unexpected behavior. Instead, try 39 | to use a new variable, as it is unlikely that one absolutely needs to 40 | set an output variable to point to a reference type. 41 | 42 | Args: 43 | new_data (Union[T, Any]): The new data value to set. 44 | """ 45 | pass 46 | 47 | @abstractmethod 48 | def resolve(self) -> T: 49 | """ 50 | Returns: 51 | T: The up-to-date data value of the wrapper. 52 | """ 53 | pass 54 | -------------------------------------------------------------------------------- /streams/stream_manager.py: -------------------------------------------------------------------------------- 1 | from io import StringIO 2 | from collections import deque 3 | import traceback 4 | 5 | 6 | class StandardStreamManager: 7 | def __init__(self, verbose: bool): 8 | self.full_traceback = verbose 9 | self.also_print_system = verbose 10 | 11 | self.hint_messages = deque() 12 | self.err_io = StringIO() 13 | self.out_io = StringIO() 14 | 15 | self.hints = { 16 | "RuntimeError": "Check that your code is not causing an infinite loop or that it is not using too much memory.", 17 | "TypeError": "If you are referencing an input variable, make sure you are actually piping something in to that slot and that the value is of the correct type. If you want to reference an image/mask's tensor, use the data attribute (e.g., image1.data).", 18 | "ImportError": "Use pip install to install any missing libraries. Ensure you install with same version of python or same env you use to run ComfyUI.", 19 | "NameError": "Check that the variable names used in your code match the input variables and that you included all necessary imports. Don't try to change the names of the input variables from how they appear in the UI.", 20 | } 21 | 22 | def get_err(self) -> StringIO: 23 | return self.err_io 24 | 25 | def get_out(self) -> StringIO: 26 | return self.out_io 27 | 28 | def write_err(self, err: Exception) -> None: 29 | if self.also_print_system: 30 | traceback.print_exc() 31 | 32 | exception_name = err.__class__.__name__ 33 | 34 | if exception_name in self.hints: 35 | self.hint_messages.append(f"{exception_name}: {self.hints[exception_name]}") 36 | if self.full_traceback: 37 | self.hint_messages.append(traceback.format_exc()) 38 | else: 39 | self.hint_messages.append(str(err)) 40 | 41 | def __str__(self) -> str: 42 | err_text = self.err_io.getvalue().strip() 43 | out_text = self.out_io.getvalue().strip() 44 | hint_text = "\n".join(self.hint_messages) 45 | out = "" 46 | if out_text: 47 | out += f"Output:\n{out_text}\n" 48 | if err_text: 49 | out += f"\nError:\n{err_text}\n" 50 | if hint_text: 51 | out += f"\nHint:\n{hint_text}\n" 52 | return out 53 | -------------------------------------------------------------------------------- /lib-ace/ext-rtl.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/ext/rtl",["require","exports","module","ace/editor","ace/config"],function(e,t,n){"use strict";function s(e,t){var n=t.getSelection().lead;t.session.$bidiHandler.isRtlLine(n.row)&&n.column===0&&(t.session.$bidiHandler.isMoveLeftOperation&&n.row>0?t.getSelection().moveCursorTo(n.row-1,t.session.getLine(n.row-1).length):t.getSelection().isEmpty()?n.column+=1:n.setPosition(n.row,n.column+1))}function o(e){e.editor.session.$bidiHandler.isMoveLeftOperation=/gotoleft|selectleft|backspace|removewordleft/.test(e.command.name)}function u(e,t){var n=t.session;n.$bidiHandler.currentRow=null;if(n.$bidiHandler.isRtlLine(e.start.row)&&e.action==="insert"&&e.lines.length>1)for(var r=e.start.row;r Wrapper: 28 | return cls.create_wrapper(data) 29 | 30 | @staticmethod 31 | def create_wrapper(data: Any) -> Wrapper: 32 | while isinstance(data, Wrapper): 33 | data = data.resolve() 34 | 35 | # Immutables 36 | if data is None: 37 | return NoneWrapper(data) 38 | elif isinstance(data, (int, float, complex)): 39 | return NumberWrapper(data) 40 | elif isinstance(data, tuple): 41 | return TupleWrapper(data) 42 | elif isinstance(data, bytes): 43 | return BytesWrapper(data) 44 | elif isinstance(data, str): 45 | try: 46 | deserialized = json.loads(data) 47 | if isinstance(deserialized, dict): 48 | return DictWrapper(deserialized) 49 | elif isinstance(deserialized, list): 50 | return ListWrapper(deserialized) 51 | except json.JSONDecodeError: 52 | return StringWrapper(data) 53 | return StringWrapper(data) 54 | 55 | # External types 56 | elif isinstance(data, (torch.Tensor, np.ndarray, Image.Image)): 57 | return TensorWrapper(data) 58 | elif isinstance(data, torch.nn.Module): 59 | return ModelWrapper(data) 60 | 61 | # Mutables 62 | elif isinstance(data, (dict, ChainMap, Counter)): 63 | return DictWrapper(data) 64 | elif isinstance(data, list): 65 | return ListWrapper(data) 66 | elif isinstance(data, set): 67 | return SetWrapper(data) 68 | elif isinstance(data, deque): 69 | return DequeWrapper(data) 70 | elif isinstance(data, bytearray): 71 | return ByteArrayWrapper(data) 72 | 73 | return AbstractExternalWrapper(data) 74 | -------------------------------------------------------------------------------- /lib-ace/theme-nord_dark.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/theme/nord_dark-css",["require","exports","module"],function(e,t,n){n.exports=".ace-nord-dark .ace_gutter {\n color: #616e88;\n}\n\n.ace-nord-dark .ace_print-margin {\n width: 1px;\n background: #4c566a;\n}\n\n.ace-nord-dark {\n background-color: #2e3440;\n color: #d8dee9;\n}\n\n.ace-nord-dark .ace_entity.ace_other.ace_attribute-name,\n.ace-nord-dark .ace_storage {\n color: #d8dee9;\n}\n\n.ace-nord-dark .ace_cursor {\n color: #d8dee9;\n}\n\n.ace-nord-dark .ace_string.ace_regexp {\n color: #bf616a;\n}\n\n.ace-nord-dark .ace_marker-layer .ace_active-line {\n background: #434c5ecc;\n}\n.ace-nord-dark .ace_marker-layer .ace_selection {\n background: #434c5ecc;\n}\n\n.ace-nord-dark.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px #2e3440;\n}\n\n.ace-nord-dark .ace_marker-layer .ace_step {\n background: #ebcb8b;\n}\n\n.ace-nord-dark .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid #88c0d066;\n}\n\n.ace-nord-dark .ace_gutter-active-line {\n background-color: #434c5ecc;\n}\n\n.ace-nord-dark .ace_marker-layer .ace_selected-word {\n border: 1px solid #88c0d066;\n}\n\n.ace-nord-dark .ace_invisible {\n color: #4c566a;\n}\n\n.ace-nord-dark .ace_keyword,\n.ace-nord-dark .ace_meta,\n.ace-nord-dark .ace_support.ace_class,\n.ace-nord-dark .ace_support.ace_type {\n color: #81a1c1;\n}\n\n.ace-nord-dark .ace_constant.ace_character,\n.ace-nord-dark .ace_constant.ace_other {\n color: #d8dee9;\n}\n\n.ace-nord-dark .ace_constant.ace_language {\n color: #5e81ac;\n}\n\n.ace-nord-dark .ace_constant.ace_escape {\n color: #ebcB8b;\n}\n\n.ace-nord-dark .ace_constant.ace_numeric {\n color: #b48ead;\n}\n\n.ace-nord-dark .ace_fold {\n background-color: #4c566a;\n border-color: #d8dee9;\n}\n\n.ace-nord-dark .ace_entity.ace_name.ace_function,\n.ace-nord-dark .ace_entity.ace_name.ace_tag,\n.ace-nord-dark .ace_support.ace_function,\n.ace-nord-dark .ace_variable,\n.ace-nord-dark .ace_variable.ace_language {\n color: #8fbcbb;\n}\n\n.ace-nord-dark .ace_string {\n color: #a3be8c;\n}\n\n.ace-nord-dark .ace_comment {\n color: #616e88;\n}\n\n.ace-nord-dark .ace_indent-guide {\n box-shadow: inset -1px 0 0 0 #434c5eb3;\n}\n\n.ace-nord-dark .ace_indent-guide-active {\n box-shadow: inset -1px 0 0 0 #8395b8b3;\n}\n"}),ace.define("ace/theme/nord_dark",["require","exports","module","ace/theme/nord_dark-css","ace/lib/dom"],function(e,t,n){t.isDark=!0,t.cssClass="ace-nord-dark",t.cssText=e("./nord_dark-css"),t.$selectionColorConflict=!0;var r=e("../lib/dom");r.importCssString(t.cssText,t.cssClass,!1)}); (function() { 2 | ace.require(["ace/theme/nord_dark"], function(m) { 3 | if (typeof module == "object" && typeof exports == "object" && module) { 4 | module.exports = m; 5 | } 6 | }); 7 | })(); 8 | -------------------------------------------------------------------------------- /lib-ace/theme-xcode.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/theme/xcode-css",["require","exports","module"],function(e,t,n){n.exports='/* THIS THEME WAS AUTOGENERATED BY Theme.tmpl.css (UUID: EE3AD170-2B7F-4DE1-B724-C75F13FE0085) */\n\n.ace-xcode .ace_gutter {\n background: #e8e8e8;\n color: #333\n}\n\n.ace-xcode .ace_print-margin {\n width: 1px;\n background: #e8e8e8\n}\n\n.ace-xcode {\n background-color: #FFFFFF;\n color: #000000\n}\n\n.ace-xcode .ace_cursor {\n color: #000000\n}\n\n.ace-xcode .ace_marker-layer .ace_selection {\n background: #B5D5FF\n}\n\n.ace-xcode.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px #FFFFFF;\n}\n\n.ace-xcode .ace_marker-layer .ace_step {\n background: rgb(198, 219, 174)\n}\n\n.ace-xcode .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid #BFBFBF\n}\n\n.ace-xcode .ace_marker-layer .ace_active-line {\n background: rgba(0, 0, 0, 0.071)\n}\n\n.ace-xcode .ace_gutter-active-line {\n background-color: rgba(0, 0, 0, 0.071)\n}\n\n.ace-xcode .ace_marker-layer .ace_selected-word {\n border: 1px solid #B5D5FF\n}\n\n.ace-xcode .ace_constant.ace_language,\n.ace-xcode .ace_keyword,\n.ace-xcode .ace_meta,\n.ace-xcode .ace_variable.ace_language {\n color: #C800A4\n}\n\n.ace-xcode .ace_invisible {\n color: #BFBFBF\n}\n\n.ace-xcode .ace_constant.ace_character,\n.ace-xcode .ace_constant.ace_other {\n color: #275A5E\n}\n\n.ace-xcode .ace_constant.ace_numeric {\n color: #3A00DC\n}\n\n.ace-xcode .ace_entity.ace_other.ace_attribute-name,\n.ace-xcode .ace_support.ace_constant,\n.ace-xcode .ace_support.ace_function {\n color: #450084\n}\n\n.ace-xcode .ace_fold {\n background-color: #C800A4;\n border-color: #000000\n}\n\n.ace-xcode .ace_entity.ace_name.ace_tag,\n.ace-xcode .ace_support.ace_class,\n.ace-xcode .ace_support.ace_type {\n color: #790EAD\n}\n\n.ace-xcode .ace_storage {\n color: #C900A4\n}\n\n.ace-xcode .ace_string {\n color: #DF0002\n}\n\n.ace-xcode .ace_comment {\n color: #008E00\n}\n\n.ace-xcode .ace_indent-guide {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==) right repeat-y\n}\n\n.ace-xcode .ace_indent-guide-active {\n background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAAZSURBVHjaYvj///9/hivKyv8BAAAA//8DACLqBhbvk+/eAAAAAElFTkSuQmCC") right repeat-y;\n} \n'}),ace.define("ace/theme/xcode",["require","exports","module","ace/theme/xcode-css","ace/lib/dom"],function(e,t,n){t.isDark=!1,t.cssClass="ace-xcode",t.cssText=e("./xcode-css");var r=e("../lib/dom");r.importCssString(t.cssText,t.cssClass,!1)}); (function() { 2 | ace.require(["ace/theme/xcode"], function(m) { 3 | if (typeof module == "object" && typeof exports == "object" && module) { 4 | module.exports = m; 5 | } 6 | }); 7 | })(); 8 | -------------------------------------------------------------------------------- /lib-ace/theme-clouds.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/theme/clouds-css",["require","exports","module"],function(e,t,n){n.exports='.ace-clouds .ace_gutter {\n background: #ebebeb;\n color: #333\n}\n\n.ace-clouds .ace_print-margin {\n width: 1px;\n background: #e8e8e8\n}\n\n.ace-clouds {\n background-color: #FFFFFF;\n color: #000000\n}\n\n.ace-clouds .ace_cursor {\n color: #000000\n}\n\n.ace-clouds .ace_marker-layer .ace_selection {\n background: #BDD5FC\n}\n\n.ace-clouds.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px #FFFFFF;\n}\n\n.ace-clouds .ace_marker-layer .ace_step {\n background: rgb(255, 255, 0)\n}\n\n.ace-clouds .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid #BFBFBF\n}\n\n.ace-clouds .ace_marker-layer .ace_active-line {\n background: #FFFBD1\n}\n\n.ace-clouds .ace_gutter-active-line {\n background-color : #dcdcdc\n}\n\n.ace-clouds .ace_marker-layer .ace_selected-word {\n border: 1px solid #BDD5FC\n}\n\n.ace-clouds .ace_invisible {\n color: #BFBFBF\n}\n\n.ace-clouds .ace_keyword,\n.ace-clouds .ace_meta,\n.ace-clouds .ace_support.ace_constant.ace_property-value {\n color: #AF956F\n}\n\n.ace-clouds .ace_keyword.ace_operator {\n color: #484848\n}\n\n.ace-clouds .ace_keyword.ace_other.ace_unit {\n color: #96DC5F\n}\n\n.ace-clouds .ace_constant.ace_language {\n color: #39946A\n}\n\n.ace-clouds .ace_constant.ace_numeric {\n color: #46A609\n}\n\n.ace-clouds .ace_constant.ace_character.ace_entity {\n color: #BF78CC\n}\n\n.ace-clouds .ace_invalid {\n background-color: #FF002A\n}\n\n.ace-clouds .ace_fold {\n background-color: #AF956F;\n border-color: #000000\n}\n\n.ace-clouds .ace_storage,\n.ace-clouds .ace_support.ace_class,\n.ace-clouds .ace_support.ace_function,\n.ace-clouds .ace_support.ace_other,\n.ace-clouds .ace_support.ace_type {\n color: #C52727\n}\n\n.ace-clouds .ace_string {\n color: #5D90CD\n}\n\n.ace-clouds .ace_comment {\n color: #BCC8BA\n}\n\n.ace-clouds .ace_entity.ace_name.ace_tag,\n.ace-clouds .ace_entity.ace_other.ace_attribute-name {\n color: #606060\n}\n\n.ace-clouds .ace_indent-guide {\n background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==") right repeat-y\n}\n\n.ace-clouds .ace_indent-guide-active {\n background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAAZSURBVHjaYvj///9/hivKyv8BAAAA//8DACLqBhbvk+/eAAAAAElFTkSuQmCC") right repeat-y;\n} \n'}),ace.define("ace/theme/clouds",["require","exports","module","ace/theme/clouds-css","ace/lib/dom"],function(e,t,n){t.isDark=!1,t.cssClass="ace-clouds",t.cssText=e("./clouds-css");var r=e("../lib/dom");r.importCssString(t.cssText,t.cssClass,!1)}); (function() { 2 | ace.require(["ace/theme/clouds"], function(m) { 3 | if (typeof module == "object" && typeof exports == "object" && module) { 4 | module.exports = m; 5 | } 6 | }); 7 | })(); 8 | -------------------------------------------------------------------------------- /lib-ace/theme-eclipse.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/theme/eclipse-css",["require","exports","module"],function(e,t,n){n.exports='.ace-eclipse .ace_gutter {\n background: #ebebeb;\n border-right: 1px solid rgb(159, 159, 159);\n color: rgb(136, 136, 136);\n}\n\n.ace-eclipse .ace_print-margin {\n width: 1px;\n background: #ebebeb;\n}\n\n.ace-eclipse {\n background-color: #FFFFFF;\n color: black;\n}\n\n.ace-eclipse .ace_fold {\n background-color: rgb(60, 76, 114);\n}\n\n.ace-eclipse .ace_cursor {\n color: black;\n}\n\n.ace-eclipse .ace_storage,\n.ace-eclipse .ace_keyword,\n.ace-eclipse .ace_variable {\n color: rgb(127, 0, 85);\n}\n\n.ace-eclipse .ace_constant.ace_buildin {\n color: rgb(88, 72, 246);\n}\n\n.ace-eclipse .ace_constant.ace_library {\n color: rgb(6, 150, 14);\n}\n\n.ace-eclipse .ace_function {\n color: rgb(60, 76, 114);\n}\n\n.ace-eclipse .ace_string {\n color: rgb(42, 0, 255);\n}\n\n.ace-eclipse .ace_comment {\n color: rgb(113, 150, 130);\n}\n\n.ace-eclipse .ace_comment.ace_doc {\n color: rgb(63, 95, 191);\n}\n\n.ace-eclipse .ace_comment.ace_doc.ace_tag {\n color: rgb(127, 159, 191);\n}\n\n.ace-eclipse .ace_constant.ace_numeric {\n color: darkblue;\n}\n\n.ace-eclipse .ace_tag {\n color: rgb(25, 118, 116);\n}\n\n.ace-eclipse .ace_type {\n color: rgb(127, 0, 127);\n}\n\n.ace-eclipse .ace_xml-pe {\n color: rgb(104, 104, 91);\n}\n\n.ace-eclipse .ace_marker-layer .ace_selection {\n background: rgb(181, 213, 255);\n}\n\n.ace-eclipse .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid rgb(192, 192, 192);\n}\n\n.ace-eclipse .ace_meta.ace_tag {\n color:rgb(25, 118, 116);\n}\n\n.ace-eclipse .ace_invisible {\n color: #ddd;\n}\n\n.ace-eclipse .ace_entity.ace_other.ace_attribute-name {\n color:rgb(127, 0, 127);\n}\n.ace-eclipse .ace_marker-layer .ace_step {\n background: rgb(255, 255, 0);\n}\n\n.ace-eclipse .ace_active-line {\n background: rgb(232, 242, 254);\n}\n\n.ace-eclipse .ace_gutter-active-line {\n background-color : #DADADA;\n}\n\n.ace-eclipse .ace_marker-layer .ace_selected-word {\n border: 1px solid rgb(181, 213, 255);\n}\n\n.ace-eclipse .ace_indent-guide {\n background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==") right repeat-y;\n}\n\n.ace-eclipse .ace_indent-guide-active {\n background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAAZSURBVHjaYvj///9/hivKyv8BAAAA//8DACLqBhbvk+/eAAAAAElFTkSuQmCC") right repeat-y;\n} \n'}),ace.define("ace/theme/eclipse",["require","exports","module","ace/theme/eclipse-css","ace/lib/dom"],function(e,t,n){"use strict";t.isDark=!1,t.cssText=e("./eclipse-css"),t.cssClass="ace-eclipse";var r=e("../lib/dom");r.importCssString(t.cssText,t.cssClass,!1)}); (function() { 2 | ace.require(["ace/theme/eclipse"], function(m) { 3 | if (typeof module == "object" && typeof exports == "object" && module) { 4 | module.exports = m; 5 | } 6 | }); 7 | })(); 8 | -------------------------------------------------------------------------------- /web/python-interpreter-node.js: -------------------------------------------------------------------------------- 1 | var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { 2 | function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } 3 | return new (P || (P = Promise))(function (resolve, reject) { 4 | function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } 5 | function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } 6 | function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } 7 | step((generator = generator.apply(thisArg, _arguments || [])).next()); 8 | }); 9 | }; 10 | import { app } from "../../scripts/app.js"; 11 | import { initAceInstance, createAceDomElements } from "./ace-editor.js"; 12 | import { appendStdoutWidget } from "./append-stdout.js"; 13 | import { nodeConfig } from "./config.js"; 14 | const ACTIVE_EDITORS = {}; 15 | const createUniqueID = () => { 16 | let id = Math.random().toString(36).substring(2, 9); 17 | while (ACTIVE_EDITORS[id]) { 18 | id = Math.random().toString(36).substring(2, 9); 19 | } 20 | ACTIVE_EDITORS[id] = true; 21 | return id; 22 | }; 23 | const PythonInterpreterExtension = { 24 | name: nodeConfig.graphName, 25 | init: (app) => __awaiter(void 0, void 0, void 0, function* () { 26 | document.head.append(Object.assign(document.createElement("script"), { 27 | src: nodeConfig.aceLibPath, 28 | })); 29 | }), 30 | setup: (app) => __awaiter(void 0, void 0, void 0, function* () { 31 | const themeSelection = app.ui.settings.addSetting({ 32 | id: "PythonInterpreter.Theme", 33 | name: "Editor Theme", 34 | defaultValue: "github_dark", 35 | type: "combo", 36 | options: nodeConfig.themes, 37 | }); 38 | }), 39 | beforeRegisterNodeDef: (nodeType, nodeData, app) => __awaiter(void 0, void 0, void 0, function* () { 40 | if ((nodeData === null || nodeData === void 0 ? void 0 : nodeData.name) == nodeConfig.nodeBackendName) { 41 | const constructorPrototype = nodeType.prototype; 42 | const liteGraph = app.graph; 43 | // Create ace-editor DOM elements and listeners. 44 | constructorPrototype.onNodeCreated = function () { 45 | const nodePrototype = this; 46 | if (nodePrototype.title == nodeConfig.nodeTitle) { 47 | const editorId = createUniqueID(); 48 | initAceInstance(nodePrototype, editorId); 49 | createAceDomElements(nodePrototype, editorId); 50 | } 51 | }; 52 | // Add a new widget to display the stdout/stderr after execution. 53 | constructorPrototype.onExecuted = function (data) { 54 | const node = this; 55 | if (node.widgets) { 56 | appendStdoutWidget(node, liteGraph, data); 57 | } 58 | }; 59 | } 60 | }), 61 | }; 62 | app.registerExtension(PythonInterpreterExtension); 63 | -------------------------------------------------------------------------------- /lib-ace/ext-whitespace.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/ext/whitespace",["require","exports","module","ace/lib/lang"],function(e,t,n){"use strict";var r=e("../lib/lang");t.$detectIndentation=function(e,t){function c(e){var t=0;for(var r=e;r0&&!(s%l)&&!(f%l)&&(r[l]=(r[l]||0)+1),n[f]=(n[f]||0)+1}s=f}while(up.score&&(p={score:v,length:u})}if(p.score&&p.score>1.4)var m=p.length;if(i>d+1){if(m==1||di+1)return{ch:" ",length:m}},t.detectIndentation=function(e){var n=e.getLines(0,1e3),r=t.$detectIndentation(n)||{};return r.ch&&e.setUseSoftTabs(r.ch==" "),r.length&&e.setTabSize(r.length),r},t.trimTrailingSpace=function(e,t){var n=e.getDocument(),r=n.getAllLines(),i=t&&t.trimEmpty?-1:0,s=[],o=-1;t&&t.keepCursorPosition&&(e.selection.rangeCount?e.selection.rangeList.ranges.forEach(function(e,t,n){var r=n[t+1];if(r&&r.cursor.row==e.cursor.row)return;s.push(e.cursor)}):s.push(e.selection.getCursor()),o=0);var u=s[o]&&s[o].row;for(var a=0,f=r.length;ai&&(c=s[o].column),o++,u=s[o]?s[o].row:-1),c>i&&n.removeInLine(a,c,l.length)}},t.convertIndentation=function(e,t,n){var i=e.getTabString()[0],s=e.getTabSize();n||(n=s),t||(t=i);var o=t==" "?t:r.stringRepeat(t,n),u=e.doc,a=u.getAllLines(),f={},l={};for(var c=0,h=a.length;c span {\n font-weight: normal !important;\n}\n\n.ace-github .ace_marker-layer .ace_step {\n background: rgb(252, 255, 0);\n}\n\n.ace-github .ace_marker-layer .ace_stack {\n background: rgb(164, 229, 101);\n}\n\n.ace-github .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid rgb(192, 192, 192);\n}\n\n.ace-github .ace_gutter-active-line {\n background-color : rgba(0, 0, 0, 0.07);\n}\n\n.ace-github .ace_marker-layer .ace_selected-word {\n background: rgb(250, 250, 255);\n border: 1px solid rgb(200, 200, 250);\n}\n\n.ace-github .ace_invisible {\n color: #BFBFBF\n}\n\n.ace-github .ace_print-margin {\n width: 1px;\n background: #e8e8e8;\n}\n\n.ace-github .ace_indent-guide {\n background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==") right repeat-y;\n}\n\n.ace-github .ace_indent-guide-active {\n background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAAZSURBVHjaYvj///9/hivKyv8BAAAA//8DACLqBhbvk+/eAAAAAElFTkSuQmCC") right repeat-y;\n}\n'}),ace.define("ace/theme/github",["require","exports","module","ace/theme/github-css","ace/lib/dom"],function(e,t,n){t.isDark=!1,t.cssClass="ace-github",t.cssText=e("./github-css");var r=e("../lib/dom");r.importCssString(t.cssText,t.cssClass,!1)}); (function() { 2 | ace.require(["ace/theme/github"], function(m) { 3 | if (typeof module == "object" && typeof exports == "object" && module) { 4 | module.exports = m; 5 | } 6 | }); 7 | })(); 8 | -------------------------------------------------------------------------------- /example_workflows/Dynamic Contrast Adjustment.json: -------------------------------------------------------------------------------- 1 | {"last_node_id":82,"last_link_id":180,"nodes":[{"id":79,"type":"Exec Python Code Script","pos":[1605,45],"size":[495,795],"flags":{},"order":1,"mode":0,"inputs":[{"name":"image1","type":"IMAGE","link":178,"shape":7,"localized_name":"image1"},{"name":"image2","type":"IMAGE","link":null,"shape":7,"localized_name":"image2"},{"name":"mask1","type":"MASK","link":null,"shape":7,"localized_name":"mask1"},{"name":"mask2","type":"MASK","link":null,"shape":7,"localized_name":"mask2"},{"name":"list1","type":"*","link":null,"shape":7,"localized_name":"list1"},{"name":"dict1","type":"*","link":null,"shape":7,"localized_name":"dict1"},{"name":"any1","type":"*","link":null,"shape":7,"localized_name":"any1"},{"name":"any2","type":"*","link":null,"shape":7,"localized_name":"any2"},{"name":"any3","type":"*","link":null,"shape":7,"localized_name":"any3"},{"name":"any4","type":"*","link":null,"shape":7,"localized_name":"any4"}],"outputs":[{"name":"image1","type":"*","links":[179],"slot_index":0,"localized_name":"image1"},{"name":"image2","type":"*","links":[180],"slot_index":1,"localized_name":"image2"},{"name":"mask1","type":"*","links":null,"localized_name":"mask1"},{"name":"mask2","type":"*","links":null,"localized_name":"mask2"},{"name":"number1","type":"*","links":null,"localized_name":"number1"},{"name":"number2","type":"*","links":null,"localized_name":"number2"},{"name":"text1","type":"*","links":null,"localized_name":"text1"},{"name":"text2","type":"*","links":null,"localized_name":"text2"},{"name":"list1","type":"*","links":null,"localized_name":"list1"},{"name":"dict1","type":"*","links":null,"localized_name":"dict1"},{"name":"any1","type":"*","links":null,"localized_name":"any1"},{"name":"any2","type":"*","links":null,"localized_name":"any2"},{"name":"any3","type":"*","links":null,"localized_name":"any3"},{"name":"any4","type":"*","links":null,"localized_name":"any4"}],"properties":{},"widgets_values":["import torch\n\nr, g, b = image1.unbind(-1)\n\nluminance_image = .3 * r + .7 * g + .06 * b\nluminance_mean = torch.mean(luminance_image.unsqueeze(-1))\n\n# Adjust Contrast dynamically\ncontrast_adjust = 1.8\nnew_image = (image1.data * contrast_adjust) + (1.0 - contrast_adjust) * luminance_mean\nnew_image = torch.clamp(new_image, 0.0, 1.0)\n\n\nprint(new_image.shape)\nimage2.to(new_image)",0,0,"hello","world",true,""]},{"id":81,"type":"PreviewImage","pos":[2145,30],"size":[435,375],"flags":{},"order":2,"mode":0,"inputs":[{"name":"images","type":"IMAGE","link":179,"localized_name":"images"}],"outputs":[],"properties":{"Node name for S&R":"PreviewImage"},"widgets_values":[]},{"id":82,"type":"PreviewImage","pos":[2145,465],"size":[465,390],"flags":{},"order":3,"mode":0,"inputs":[{"name":"images","type":"IMAGE","link":180,"localized_name":"images"}],"outputs":[],"properties":{"Node name for S&R":"PreviewImage"},"widgets_values":[]},{"id":80,"type":"LoadImage","pos":[1140,225],"size":[390,465],"flags":{},"order":0,"mode":0,"inputs":[],"outputs":[{"name":"IMAGE","type":"IMAGE","links":[178],"localized_name":"IMAGE"},{"name":"MASK","type":"MASK","links":null,"localized_name":"MASK"}],"properties":{"Node name for S&R":"LoadImage"},"widgets_values":["rgb-movie-scene-H503px_W1200px-jpg-19.jpg","image"]}],"links":[[178,80,0,79,0,"IMAGE"],[179,79,0,81,0,"IMAGE"],[180,79,1,82,0,"IMAGE"]],"groups":[],"config":{},"extra":{"ds":{"scale":0.7050000000000001,"offset":[-522.2683323375189,351.83955019508807]},"node_versions":{"python-interpreter-node":"e25a59d2ccba26d29f0cd17246cac6e3e3008a35","comfy-core":"v0.3.10-33-g7da85fa"},"VHS_latentpreview":false,"VHS_latentpreviewrate":0},"version":0.4} -------------------------------------------------------------------------------- /lib-ace/theme-tomorrow.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/theme/tomorrow-css",["require","exports","module"],function(e,t,n){n.exports='.ace-tomorrow .ace_gutter {\n background: #f6f6f6;\n color: #4D4D4C\n}\n\n.ace-tomorrow .ace_print-margin {\n width: 1px;\n background: #f6f6f6\n}\n\n.ace-tomorrow {\n background-color: #FFFFFF;\n color: #4D4D4C\n}\n\n.ace-tomorrow .ace_cursor {\n color: #AEAFAD\n}\n\n.ace-tomorrow .ace_marker-layer .ace_selection {\n background: #D6D6D6\n}\n\n.ace-tomorrow.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px #FFFFFF;\n}\n\n.ace-tomorrow .ace_marker-layer .ace_step {\n background: rgb(255, 255, 0)\n}\n\n.ace-tomorrow .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid #D1D1D1\n}\n\n.ace-tomorrow .ace_marker-layer .ace_active-line {\n background: #EFEFEF\n}\n\n.ace-tomorrow .ace_gutter-active-line {\n background-color : #dcdcdc\n}\n\n.ace-tomorrow .ace_marker-layer .ace_selected-word {\n border: 1px solid #D6D6D6\n}\n\n.ace-tomorrow .ace_invisible {\n color: #D1D1D1\n}\n\n.ace-tomorrow .ace_keyword,\n.ace-tomorrow .ace_meta,\n.ace-tomorrow .ace_storage,\n.ace-tomorrow .ace_storage.ace_type,\n.ace-tomorrow .ace_support.ace_type {\n color: #8959A8\n}\n\n.ace-tomorrow .ace_keyword.ace_operator {\n color: #3E999F\n}\n\n.ace-tomorrow .ace_constant.ace_character,\n.ace-tomorrow .ace_constant.ace_language,\n.ace-tomorrow .ace_constant.ace_numeric,\n.ace-tomorrow .ace_keyword.ace_other.ace_unit,\n.ace-tomorrow .ace_support.ace_constant,\n.ace-tomorrow .ace_variable.ace_parameter {\n color: #F5871F\n}\n\n.ace-tomorrow .ace_constant.ace_other {\n color: #666969\n}\n\n.ace-tomorrow .ace_invalid {\n color: #FFFFFF;\n background-color: #C82829\n}\n\n.ace-tomorrow .ace_invalid.ace_deprecated {\n color: #FFFFFF;\n background-color: #8959A8\n}\n\n.ace-tomorrow .ace_fold {\n background-color: #4271AE;\n border-color: #4D4D4C\n}\n\n.ace-tomorrow .ace_entity.ace_name.ace_function,\n.ace-tomorrow .ace_support.ace_function,\n.ace-tomorrow .ace_variable {\n color: #4271AE\n}\n\n.ace-tomorrow .ace_support.ace_class,\n.ace-tomorrow .ace_support.ace_type {\n color: #C99E00\n}\n\n.ace-tomorrow .ace_heading,\n.ace-tomorrow .ace_markup.ace_heading,\n.ace-tomorrow .ace_string {\n color: #718C00\n}\n\n.ace-tomorrow .ace_entity.ace_name.ace_tag,\n.ace-tomorrow .ace_entity.ace_other.ace_attribute-name,\n.ace-tomorrow .ace_meta.ace_tag,\n.ace-tomorrow .ace_string.ace_regexp,\n.ace-tomorrow .ace_variable {\n color: #C82829\n}\n\n.ace-tomorrow .ace_comment {\n color: #8E908C\n}\n\n.ace-tomorrow .ace_indent-guide {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bdu3f/BwAlfgctduB85QAAAABJRU5ErkJggg==) right repeat-y\n}\n\n.ace-tomorrow .ace_indent-guide-active {\n background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAAZSURBVHjaYvj///9/hivKyv8BAAAA//8DACLqBhbvk+/eAAAAAElFTkSuQmCC") right repeat-y;\n} \n'}),ace.define("ace/theme/tomorrow",["require","exports","module","ace/theme/tomorrow-css","ace/lib/dom"],function(e,t,n){t.isDark=!1,t.cssClass="ace-tomorrow",t.cssText=e("./tomorrow-css");var r=e("../lib/dom");r.importCssString(t.cssText,t.cssClass,!1)}); (function() { 2 | ace.require(["ace/theme/tomorrow"], function(m) { 3 | if (typeof module == "object" && typeof exports == "object" && module) { 4 | module.exports = m; 5 | } 6 | }); 7 | })(); 8 | -------------------------------------------------------------------------------- /lib-ace/theme-pastel_on_dark.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/theme/pastel_on_dark-css",["require","exports","module"],function(e,t,n){n.exports=".ace-pastel-on-dark .ace_gutter {\n background: #353030;\n color: #8F938F\n}\n\n.ace-pastel-on-dark .ace_print-margin {\n width: 1px;\n background: #353030\n}\n\n.ace-pastel-on-dark {\n background-color: #2C2828;\n color: #8F938F\n}\n\n.ace-pastel-on-dark .ace_cursor {\n color: #A7A7A7\n}\n\n.ace-pastel-on-dark .ace_marker-layer .ace_selection {\n background: rgba(221, 240, 255, 0.20)\n}\n\n.ace-pastel-on-dark.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px #2C2828;\n}\n\n.ace-pastel-on-dark .ace_marker-layer .ace_step {\n background: rgb(102, 82, 0)\n}\n\n.ace-pastel-on-dark .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid rgba(255, 255, 255, 0.25)\n}\n\n.ace-pastel-on-dark .ace_marker-layer .ace_active-line {\n background: rgba(255, 255, 255, 0.031)\n}\n\n.ace-pastel-on-dark .ace_gutter-active-line {\n background-color: rgba(255, 255, 255, 0.031)\n}\n\n.ace-pastel-on-dark .ace_marker-layer .ace_selected-word {\n border: 1px solid rgba(221, 240, 255, 0.20)\n}\n\n.ace-pastel-on-dark .ace_invisible {\n color: rgba(255, 255, 255, 0.25)\n}\n\n.ace-pastel-on-dark .ace_keyword,\n.ace-pastel-on-dark .ace_meta {\n color: #757aD8\n}\n\n.ace-pastel-on-dark .ace_constant,\n.ace-pastel-on-dark .ace_constant.ace_character,\n.ace-pastel-on-dark .ace_constant.ace_character.ace_escape,\n.ace-pastel-on-dark .ace_constant.ace_other {\n color: #4FB7C5\n}\n\n.ace-pastel-on-dark .ace_keyword.ace_operator {\n color: #797878\n}\n\n.ace-pastel-on-dark .ace_constant.ace_character {\n color: #AFA472\n}\n\n.ace-pastel-on-dark .ace_constant.ace_language {\n color: #DE8E30\n}\n\n.ace-pastel-on-dark .ace_constant.ace_numeric {\n color: #CCCCCC\n}\n\n.ace-pastel-on-dark .ace_invalid,\n.ace-pastel-on-dark .ace_invalid.ace_illegal {\n color: #F8F8F8;\n background-color: rgba(86, 45, 86, 0.75)\n}\n\n.ace-pastel-on-dark .ace_invalid.ace_deprecated {\n text-decoration: underline;\n font-style: italic;\n color: #D2A8A1\n}\n\n.ace-pastel-on-dark .ace_fold {\n background-color: #757aD8;\n border-color: #8F938F\n}\n\n.ace-pastel-on-dark .ace_support.ace_function {\n color: #AEB2F8\n}\n\n.ace-pastel-on-dark .ace_string {\n color: #66A968\n}\n\n.ace-pastel-on-dark .ace_string.ace_regexp {\n color: #E9C062\n}\n\n.ace-pastel-on-dark .ace_comment {\n color: #A6C6FF\n}\n\n.ace-pastel-on-dark .ace_variable {\n color: #BEBF55\n}\n\n.ace-pastel-on-dark .ace_variable.ace_language {\n color: #C1C144\n}\n\n.ace-pastel-on-dark .ace_xml-pe {\n color: #494949\n}\n\n.ace-pastel-on-dark .ace_indent-guide {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYIiPj/8PAARgAh2NTMh8AAAAAElFTkSuQmCC) right repeat-y\n}\n\n.ace-pastel-on-dark .ace_indent-guide-active {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQIW2PQ1dX9zzBz5sz/ABCcBFFentLlAAAAAElFTkSuQmCC) right repeat-y;\n}\n"}),ace.define("ace/theme/pastel_on_dark",["require","exports","module","ace/theme/pastel_on_dark-css","ace/lib/dom"],function(e,t,n){t.isDark=!0,t.cssClass="ace-pastel-on-dark",t.cssText=e("./pastel_on_dark-css");var r=e("../lib/dom");r.importCssString(t.cssText,t.cssClass,!1)}); (function() { 2 | ace.require(["ace/theme/pastel_on_dark"], function(m) { 3 | if (typeof module == "object" && typeof exports == "object" && module) { 4 | module.exports = m; 5 | } 6 | }); 7 | })(); 8 | -------------------------------------------------------------------------------- /lib-ace/theme-github_dark.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/theme/github_dark-css",["require","exports","module"],function(e,t,n){n.exports=".ace-github-dark .ace_gutter {\n background: #24292e;\n color: #7388b5\n}\n\n.ace-github-dark .ace_print-margin {\n width: 1px;\n background: #00204b\n}\n\n.ace-github-dark {\n background-color: #24292e;\n color: #FFFFFF\n}\n\n.ace-github-dark .ace_constant.ace_other,\n.ace-github-dark .ace_cursor {\n color: #FFFFFF\n}\n\n.ace-github-dark .ace_marker-layer .ace_selection {\n background: #003F8E\n}\n\n.ace-github-dark.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px #24292e;\n}\n\n.ace-github-dark .ace_marker-layer .ace_step {\n background: rgb(127, 111, 19)\n}\n\n.ace-github-dark .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid #404F7D\n}\n\n.ace-github-dark .ace_marker-layer .ace_active-line {\n background: #00346E\n}\n\n.ace-github-dark .ace_gutter-active-line {\n background-color: #24292e\n}\n\n.ace-github-dark .ace_marker-layer .ace_selected-word {\n border: 1px solid #003F8E\n}\n\n.ace-github-dark .ace_invisible {\n color: #404F7D\n}\n\n.ace-github-dark .ace_keyword,\n.ace-github-dark .ace_meta,\n.ace-github-dark .ace_storage,\n.ace-github-dark .ace_storage.ace_type,\n.ace-github-dark .ace_support.ace_type {\n color: #ff7b72\n}\n\n.ace-github-dark .ace_keyword.ace_operator {\n color: #79c0ff\n}\n\n.ace-github-dark .ace_constant.ace_character,\n.ace-github-dark .ace_constant.ace_language,\n.ace-github-dark .ace_constant.ace_numeric,\n.ace-github-dark .ace_keyword.ace_other.ace_unit,\n.ace-github-dark .ace_support.ace_constant,\n.ace-github-dark .ace_variable.ace_parameter {\n color: #FFC58F\n}\n\n.ace-github-dark .ace_invalid {\n color: #FFFFFF;\n background-color: #F99DA5\n}\n\n.ace-github-dark .ace_invalid.ace_deprecated {\n color: #FFFFFF;\n background-color: #ff7b72\n}\n\n.ace-github-dark .ace_fold {\n background-color: #BBDAFF;\n border-color: #FFFFFF\n}\n\n.ace-github-dark .ace_entity.ace_name.ace_function,\n.ace-github-dark .ace_support.ace_function,\n.ace-github-dark .ace_variable {\n color: #BBDAFF\n}\n\n.ace-github-dark .ace_support.ace_class,\n.ace-github-dark .ace_support.ace_type {\n color: #FFEEAD\n}\n\n.ace-github-dark .ace_heading,\n.ace-github-dark .ace_markup.ace_heading,\n.ace-github-dark .ace_string {\n color: #9fcef6\n}\n\n.ace-github-dark .ace_entity.ace_name.ace_tag,\n.ace-github-dark .ace_entity.ace_other.ace_attribute-name,\n.ace-github-dark .ace_meta.ace_tag,\n.ace-github-dark .ace_string.ace_regexp,\n.ace-github-dark .ace_variable {\n color: #FF9DA4\n}\n\n.ace-github-dark .ace_comment {\n color: #7285B7\n}\n\n.ace-github-dark .ace_indent-guide {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYJDzqfwPAANXAeNsiA+ZAAAAAElFTkSuQmCC) right repeat-y\n}\n\n.ace-github-dark .ace_indent-guide-active {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQIW2PQ1dX9zzBz5sz/ABCcBFFentLlAAAAAElFTkSuQmCC) right repeat-y;\n}\n\n.ace-github-dark .ace_constant.ace_buildin {\n color: #0086B3;\n}\n\n.ace-github-dark .ace_variable.ace_language {\n color: #ffffff;\n}\n "}),ace.define("ace/theme/github_dark",["require","exports","module","ace/theme/github_dark-css","ace/lib/dom"],function(e,t,n){t.isDark=!0,t.cssClass="ace-github-dark",t.cssText=e("./github_dark-css");var r=e("../lib/dom");r.importCssString(t.cssText,t.cssClass,!1)}); (function() { 2 | ace.require(["ace/theme/github_dark"], function(m) { 3 | if (typeof module == "object" && typeof exports == "object" && module) { 4 | module.exports = m; 5 | } 6 | }); 7 | })(); 8 | -------------------------------------------------------------------------------- /lib-ace/theme-mono_industrial.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/theme/mono_industrial-css",["require","exports","module"],function(e,t,n){n.exports=".ace-mono-industrial .ace_gutter {\n background: #1d2521;\n color: #C5C9C9\n}\n\n.ace-mono-industrial .ace_print-margin {\n width: 1px;\n background: #555651\n}\n\n.ace-mono-industrial {\n background-color: #222C28;\n color: #FFFFFF\n}\n\n.ace-mono-industrial .ace_cursor {\n color: #FFFFFF\n}\n\n.ace-mono-industrial .ace_marker-layer .ace_selection {\n background: rgba(145, 153, 148, 0.40)\n}\n\n.ace-mono-industrial.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px #222C28;\n}\n\n.ace-mono-industrial .ace_marker-layer .ace_step {\n background: rgb(102, 82, 0)\n}\n\n.ace-mono-industrial .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid rgba(102, 108, 104, 0.50)\n}\n\n.ace-mono-industrial .ace_marker-layer .ace_active-line {\n background: rgba(12, 13, 12, 0.25)\n}\n\n.ace-mono-industrial .ace_gutter-active-line {\n background-color: rgba(12, 13, 12, 0.25)\n}\n\n.ace-mono-industrial .ace_marker-layer .ace_selected-word {\n border: 1px solid rgba(145, 153, 148, 0.40)\n}\n\n.ace-mono-industrial .ace_invisible {\n color: rgba(102, 108, 104, 0.50)\n}\n\n.ace-mono-industrial .ace_string {\n background-color: #151C19;\n color: #FFFFFF\n}\n\n.ace-mono-industrial .ace_keyword,\n.ace-mono-industrial .ace_meta {\n color: #A39E64\n}\n\n.ace-mono-industrial .ace_constant,\n.ace-mono-industrial .ace_constant.ace_character,\n.ace-mono-industrial .ace_constant.ace_character.ace_escape,\n.ace-mono-industrial .ace_constant.ace_numeric,\n.ace-mono-industrial .ace_constant.ace_other {\n color: #E98800\n}\n\n.ace-mono-industrial .ace_entity.ace_name.ace_function,\n.ace-mono-industrial .ace_keyword.ace_operator,\n.ace-mono-industrial .ace_variable {\n color: #A8B3AB\n}\n\n.ace-mono-industrial .ace_invalid {\n color: #FFFFFF;\n background-color: rgba(153, 0, 0, 0.68)\n}\n\n.ace-mono-industrial .ace_support.ace_constant {\n color: #C87500\n}\n\n.ace-mono-industrial .ace_fold {\n background-color: #A8B3AB;\n border-color: #FFFFFF\n}\n\n.ace-mono-industrial .ace_support.ace_function {\n color: #588E60\n}\n\n.ace-mono-industrial .ace_entity.ace_name,\n.ace-mono-industrial .ace_support.ace_class,\n.ace-mono-industrial .ace_support.ace_type {\n color: #5778B6\n}\n\n.ace-mono-industrial .ace_storage {\n color: #C23B00\n}\n\n.ace-mono-industrial .ace_variable.ace_language,\n.ace-mono-industrial .ace_variable.ace_parameter {\n color: #648BD2\n}\n\n.ace-mono-industrial .ace_comment {\n color: #666C68;\n background-color: #151C19\n}\n\n.ace-mono-industrial .ace_entity.ace_other.ace_attribute-name {\n color: #909993\n}\n\n.ace-mono-industrial .ace_entity.ace_name.ace_tag {\n color: #A65EFF\n}\n\n.ace-mono-industrial .ace_indent-guide {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNQ1NbwZfALD/4PAAlTArlEC4r/AAAAAElFTkSuQmCC) right repeat-y\n}\n\n.ace-mono-industrial .ace_indent-guide-active {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQIW2PQ1dX9zzBz5sz/ABCcBFFentLlAAAAAElFTkSuQmCC) right repeat-y;\n}\n"}),ace.define("ace/theme/mono_industrial",["require","exports","module","ace/theme/mono_industrial-css","ace/lib/dom"],function(e,t,n){t.isDark=!0,t.cssClass="ace-mono-industrial",t.cssText=e("./mono_industrial-css");var r=e("../lib/dom");r.importCssString(t.cssText,t.cssClass,!1)}); (function() { 2 | ace.require(["ace/theme/mono_industrial"], function(m) { 3 | if (typeof module == "object" && typeof exports == "object" && module) { 4 | module.exports = m; 5 | } 6 | }); 7 | })(); 8 | -------------------------------------------------------------------------------- /lib-ace/theme-tomorrow_night.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/theme/tomorrow_night-css",["require","exports","module"],function(e,t,n){n.exports=".ace-tomorrow-night .ace_gutter {\n background: #25282c;\n color: #C5C8C6\n}\n\n.ace-tomorrow-night .ace_print-margin {\n width: 1px;\n background: #25282c\n}\n\n.ace-tomorrow-night {\n background-color: #1D1F21;\n color: #C5C8C6\n}\n\n.ace-tomorrow-night .ace_cursor {\n color: #AEAFAD\n}\n\n.ace-tomorrow-night .ace_marker-layer .ace_selection {\n background: #373B41\n}\n\n.ace-tomorrow-night.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px #1D1F21;\n}\n\n.ace-tomorrow-night .ace_marker-layer .ace_step {\n background: rgb(102, 82, 0)\n}\n\n.ace-tomorrow-night .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid #4B4E55\n}\n\n.ace-tomorrow-night .ace_marker-layer .ace_active-line {\n background: #282A2E\n}\n\n.ace-tomorrow-night .ace_gutter-active-line {\n background-color: #282A2E\n}\n\n.ace-tomorrow-night .ace_marker-layer .ace_selected-word {\n border: 1px solid #373B41\n}\n\n.ace-tomorrow-night .ace_invisible {\n color: #4B4E55\n}\n\n.ace-tomorrow-night .ace_keyword,\n.ace-tomorrow-night .ace_meta,\n.ace-tomorrow-night .ace_storage,\n.ace-tomorrow-night .ace_storage.ace_type,\n.ace-tomorrow-night .ace_support.ace_type {\n color: #B294BB\n}\n\n.ace-tomorrow-night .ace_keyword.ace_operator {\n color: #8ABEB7\n}\n\n.ace-tomorrow-night .ace_constant.ace_character,\n.ace-tomorrow-night .ace_constant.ace_language,\n.ace-tomorrow-night .ace_constant.ace_numeric,\n.ace-tomorrow-night .ace_keyword.ace_other.ace_unit,\n.ace-tomorrow-night .ace_support.ace_constant,\n.ace-tomorrow-night .ace_variable.ace_parameter {\n color: #DE935F\n}\n\n.ace-tomorrow-night .ace_constant.ace_other {\n color: #CED1CF\n}\n\n.ace-tomorrow-night .ace_invalid {\n color: #CED2CF;\n background-color: #DF5F5F\n}\n\n.ace-tomorrow-night .ace_invalid.ace_deprecated {\n color: #CED2CF;\n background-color: #B798BF\n}\n\n.ace-tomorrow-night .ace_fold {\n background-color: #81A2BE;\n border-color: #C5C8C6\n}\n\n.ace-tomorrow-night .ace_entity.ace_name.ace_function,\n.ace-tomorrow-night .ace_support.ace_function,\n.ace-tomorrow-night .ace_variable {\n color: #81A2BE\n}\n\n.ace-tomorrow-night .ace_support.ace_class,\n.ace-tomorrow-night .ace_support.ace_type {\n color: #F0C674\n}\n\n.ace-tomorrow-night .ace_heading,\n.ace-tomorrow-night .ace_markup.ace_heading,\n.ace-tomorrow-night .ace_string {\n color: #B5BD68\n}\n\n.ace-tomorrow-night .ace_entity.ace_name.ace_tag,\n.ace-tomorrow-night .ace_entity.ace_other.ace_attribute-name,\n.ace-tomorrow-night .ace_meta.ace_tag,\n.ace-tomorrow-night .ace_string.ace_regexp,\n.ace-tomorrow-night .ace_variable {\n color: #CC6666\n}\n\n.ace-tomorrow-night .ace_comment {\n color: #969896\n}\n\n.ace-tomorrow-night .ace_indent-guide {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYHB3d/8PAAOIAdULw8qMAAAAAElFTkSuQmCC) right repeat-y\n}\n\n.ace-tomorrow-night .ace_indent-guide-active {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQIW2PQ1dX9zzBz5sz/ABCcBFFentLlAAAAAElFTkSuQmCC) right repeat-y;\n}\n"}),ace.define("ace/theme/tomorrow_night",["require","exports","module","ace/theme/tomorrow_night-css","ace/lib/dom"],function(e,t,n){t.isDark=!0,t.cssClass="ace-tomorrow-night",t.cssText=e("./tomorrow_night-css");var r=e("../lib/dom");r.importCssString(t.cssText,t.cssClass,!1)}); (function() { 2 | ace.require(["ace/theme/tomorrow_night"], function(m) { 3 | if (typeof module == "object" && typeof exports == "object" && module) { 4 | module.exports = m; 5 | } 6 | }); 7 | })(); 8 | -------------------------------------------------------------------------------- /lib-ace/theme-chaos.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/theme/chaos-css",["require","exports","module"],function(e,t,n){n.exports=".ace-chaos .ace_gutter {\n background: #141414;\n color: #595959;\n border-right: 1px solid #282828;\n}\n.ace-chaos .ace_gutter-cell.ace_warning {\n background-image: none;\n background: #FC0;\n border-left: none;\n padding-left: 0;\n color: #000;\n}\n.ace-chaos .ace_gutter-cell.ace_error {\n background-position: -6px center;\n background-image: none;\n background: #F10;\n border-left: none;\n padding-left: 0;\n color: #000;\n}\n.ace-chaos .ace_print-margin {\n border-left: 1px solid #555;\n right: 0;\n background: #1D1D1D;\n}\n.ace-chaos {\n background-color: #161616;\n color: #E6E1DC;\n}\n\n.ace-chaos .ace_cursor {\n border-left: 2px solid #FFFFFF;\n}\n.ace-chaos .ace_cursor.ace_overwrite {\n border-left: 0px;\n border-bottom: 1px solid #FFFFFF;\n}\n.ace-chaos .ace_marker-layer .ace_selection {\n background: #494836;\n}\n.ace-chaos .ace_marker-layer .ace_step {\n background: rgb(198, 219, 174);\n}\n.ace-chaos .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid #FCE94F;\n}\n.ace-chaos .ace_marker-layer .ace_active-line {\n background: #333;\n}\n.ace-chaos .ace_gutter-active-line {\n background-color: #222;\n}\n.ace-chaos .ace_invisible {\n color: #404040;\n}\n.ace-chaos .ace_keyword {\n color:#00698F;\n}\n.ace-chaos .ace_keyword.ace_operator {\n color:#FF308F;\n}\n.ace-chaos .ace_constant {\n color:#1EDAFB;\n}\n.ace-chaos .ace_constant.ace_language {\n color:#FDC251;\n}\n.ace-chaos .ace_constant.ace_library {\n color:#8DFF0A;\n}\n.ace-chaos .ace_constant.ace_numeric {\n color:#58C554;\n}\n.ace-chaos .ace_invalid {\n color:#FFFFFF;\n background-color:#990000;\n}\n.ace-chaos .ace_invalid.ace_deprecated {\n color:#FFFFFF;\n background-color:#990000;\n}\n.ace-chaos .ace_support {\n color: #999;\n}\n.ace-chaos .ace_support.ace_function {\n color:#00AEEF;\n}\n.ace-chaos .ace_function {\n color:#00AEEF;\n}\n.ace-chaos .ace_string {\n color:#58C554;\n}\n.ace-chaos .ace_comment {\n color:#555;\n font-style:italic;\n padding-bottom: 0px;\n}\n.ace-chaos .ace_variable {\n color:#997744;\n}\n.ace-chaos .ace_meta.ace_tag {\n color:#BE53E6;\n}\n.ace-chaos .ace_entity.ace_other.ace_attribute-name {\n color:#FFFF89;\n}\n.ace-chaos .ace_markup.ace_underline {\n text-decoration: underline;\n}\n.ace-chaos .ace_fold-widget {\n text-align: center;\n}\n\n.ace-chaos .ace_fold-widget:hover {\n color: #777;\n}\n\n.ace-chaos .ace_fold-widget.ace_start,\n.ace-chaos .ace_fold-widget.ace_end,\n.ace-chaos .ace_fold-widget.ace_closed{\n background: none !important;\n border: none;\n box-shadow: none;\n}\n\n.ace-chaos .ace_fold-widget.ace_start:after {\n content: '\u25be'\n}\n\n.ace-chaos .ace_fold-widget.ace_end:after {\n content: '\u25b4'\n}\n\n.ace-chaos .ace_fold-widget.ace_closed:after {\n content: '\u2023'\n}\n\n.ace-chaos .ace_indent-guide {\n border-right:1px dotted #333333;\n margin-right:-1px;\n}\n\n.ace-chaos .ace_indent-guide-active {\n border-right:1px dotted #afafaf;\n margin-right:-1px;\n}\n\n.ace-chaos .ace_fold { \n background: #222; \n border-radius: 3px; \n color: #7AF; \n border: none; \n}\n.ace-chaos .ace_fold:hover {\n background: #CCC; \n color: #000;\n}\n"}),ace.define("ace/theme/chaos",["require","exports","module","ace/theme/chaos-css","ace/lib/dom"],function(e,t,n){t.isDark=!0,t.cssClass="ace-chaos",t.cssText=e("./chaos-css");var r=e("../lib/dom");r.importCssString(t.cssText,t.cssClass,!1)}); (function() { 2 | ace.require(["ace/theme/chaos"], function(m) { 3 | if (typeof module == "object" && typeof exports == "object" && module) { 4 | module.exports = m; 5 | } 6 | }); 7 | })(); 8 | -------------------------------------------------------------------------------- /lib-ace/theme-one_dark.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/theme/one_dark-css",["require","exports","module"],function(e,t,n){n.exports=".ace-one-dark .ace_gutter {\n background: #282c34;\n color: #6a6f7a\n}\n\n.ace-one-dark .ace_print-margin {\n width: 1px;\n background: #e8e8e8\n}\n\n.ace-one-dark {\n background-color: #282c34;\n color: #abb2bf\n}\n\n.ace-one-dark .ace_cursor {\n color: #528bff\n}\n\n.ace-one-dark .ace_marker-layer .ace_selection {\n background: #3d4350\n}\n\n.ace-one-dark.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0 #282c34;\n border-radius: 2px\n}\n\n.ace-one-dark .ace_marker-layer .ace_step {\n background: #c6dbae\n}\n\n.ace-one-dark .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid #747369\n}\n\n.ace-one-dark .ace_marker-layer .ace_active-line {\n background: rgba(76, 87, 103, .19)\n}\n\n.ace-one-dark .ace_gutter-active-line {\n background-color: rgba(76, 87, 103, .19)\n}\n\n.ace-one-dark .ace_marker-layer .ace_selected-word {\n border: 1px solid #3d4350\n}\n\n.ace-one-dark .ace_fold {\n background-color: #61afef;\n border-color: #abb2bf\n}\n\n.ace-one-dark .ace_keyword {\n color: #c678dd\n}\n\n.ace-one-dark .ace_keyword.ace_operator {\n color: #c678dd\n}\n\n.ace-one-dark .ace_keyword.ace_other.ace_unit {\n color: #d19a66\n}\n\n.ace-one-dark .ace_constant.ace_language {\n color: #d19a66\n}\n\n.ace-one-dark .ace_constant.ace_numeric {\n color: #d19a66\n}\n\n.ace-one-dark .ace_constant.ace_character {\n color: #56b6c2\n}\n\n.ace-one-dark .ace_constant.ace_other {\n color: #56b6c2\n}\n\n.ace-one-dark .ace_support.ace_function {\n color: #61afef\n}\n\n.ace-one-dark .ace_support.ace_constant {\n color: #d19a66\n}\n\n.ace-one-dark .ace_support.ace_class {\n color: #e5c07b\n}\n\n.ace-one-dark .ace_support.ace_type {\n color: #e5c07b\n}\n\n.ace-one-dark .ace_storage {\n color: #c678dd\n}\n\n.ace-one-dark .ace_storage.ace_type {\n color: #c678dd\n}\n\n.ace-one-dark .ace_invalid {\n color: #fff;\n background-color: #f2777a\n}\n\n.ace-one-dark .ace_invalid.ace_deprecated {\n color: #272b33;\n background-color: #d27b53\n}\n\n.ace-one-dark .ace_string {\n color: #98c379\n}\n\n.ace-one-dark .ace_string.ace_regexp {\n color: #e06c75\n}\n\n.ace-one-dark .ace_comment {\n font-style: italic;\n color: #5c6370\n}\n\n.ace-one-dark .ace_variable {\n color: #e06c75\n}\n\n.ace-one-dark .ace_variable.ace_parameter {\n color: #d19a66\n}\n\n.ace-one-dark .ace_meta.ace_tag {\n color: #e06c75\n}\n\n.ace-one-dark .ace_entity.ace_other.ace_attribute-name {\n color: #e06c75\n}\n\n.ace-one-dark .ace_entity.ace_name.ace_function {\n color: #61afef\n}\n\n.ace-one-dark .ace_entity.ace_name.ace_tag {\n color: #e06c75\n}\n\n.ace-one-dark .ace_markup.ace_heading {\n color: #98c379\n}\n\n.ace-one-dark .ace_indent-guide {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWPQ09NrYAgMjP4PAAtGAwchHMyAAAAAAElFTkSuQmCC) right repeat-y\n}\n\n.ace-one-dark .ace_indent-guide-active {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQIW2PQ1dX9zzBz5sz/ABCcBFFentLlAAAAAElFTkSuQmCC) right repeat-y;\n}\n"}),ace.define("ace/theme/one_dark",["require","exports","module","ace/theme/one_dark-css","ace/lib/dom"],function(e,t,n){t.isDark=!0,t.cssClass="ace-one-dark",t.cssText=e("./one_dark-css");var r=e("../lib/dom");r.importCssString(t.cssText,t.cssClass,!1)}); (function() { 2 | ace.require(["ace/theme/one_dark"], function(m) { 3 | if (typeof module == "object" && typeof exports == "object" && module) { 4 | module.exports = m; 5 | } 6 | }); 7 | })(); 8 | -------------------------------------------------------------------------------- /lib-ace/ext-split.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/split",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/lib/event_emitter","ace/editor","ace/virtual_renderer","ace/edit_session"],function(e,t,n){"use strict";var r=e("./lib/oop"),i=e("./lib/lang"),s=e("./lib/event_emitter").EventEmitter,o=e("./editor").Editor,u=e("./virtual_renderer").VirtualRenderer,a=e("./edit_session").EditSession,f;f=function(e,t,n){this.BELOW=1,this.BESIDE=0,this.$container=e,this.$theme=t,this.$splits=0,this.$editorCSS="",this.$editors=[],this.$orientation=this.BESIDE,this.setSplits(n||1),this.$cEditor=this.$editors[0],this.on("focus",function(e){this.$cEditor=e}.bind(this))},function(){r.implement(this,s),this.$createEditor=function(){var e=document.createElement("div");e.className=this.$editorCSS,e.style.cssText="position: absolute; top:0px; bottom:0px",this.$container.appendChild(e);var t=new o(new u(e,this.$theme));return t.on("focus",function(){this._emit("focus",t)}.bind(this)),this.$editors.push(t),t.setFontSize(this.$fontSize),t},this.setSplits=function(e){var t;if(e<1)throw"The number of splits have to be > 0!";if(e==this.$splits)return;if(e>this.$splits){while(this.$splitse)t=this.$editors[this.$splits-1],this.$container.removeChild(t.container),this.$splits--;this.resize()},this.getSplits=function(){return this.$splits},this.getEditor=function(e){return this.$editors[e]},this.getCurrentEditor=function(){return this.$cEditor},this.focus=function(){this.$cEditor.focus()},this.blur=function(){this.$cEditor.blur()},this.setTheme=function(e){this.$editors.forEach(function(t){t.setTheme(e)})},this.setKeyboardHandler=function(e){this.$editors.forEach(function(t){t.setKeyboardHandler(e)})},this.forEach=function(e,t){this.$editors.forEach(e,t)},this.$fontSize="",this.setFontSize=function(e){this.$fontSize=e,this.forEach(function(t){t.setFontSize(e)})},this.$cloneSession=function(e){var t=new a(e.getDocument(),e.getMode()),n=e.getUndoManager();return t.setUndoManager(n),t.setTabSize(e.getTabSize()),t.setUseSoftTabs(e.getUseSoftTabs()),t.setOverwrite(e.getOverwrite()),t.setBreakpoints(e.getBreakpoints()),t.setUseWrapMode(e.getUseWrapMode()),t.setUseWorker(e.getUseWorker()),t.setWrapLimitRange(e.$wrapLimitRange.min,e.$wrapLimitRange.max),t.$foldData=e.$cloneFoldData(),t},this.setSession=function(e,t){var n;t==null?n=this.$cEditor:n=this.$editors[t];var r=this.$editors.some(function(t){return t.session===e});return r&&(e=this.$cloneSession(e)),n.setSession(e),e},this.getOrientation=function(){return this.$orientation},this.setOrientation=function(e){if(this.$orientation==e)return;this.$orientation=e,this.resize()},this.resize=function(){var e=this.$container.clientWidth,t=this.$container.clientHeight,n;if(this.$orientation==this.BESIDE){var r=e/this.$splits;for(var i=0;i-1)continue;var s=this.$findCellWidthsForBlock(i),o=this.$setBlockCellWidthsToMax(s.cellWidths),u=s.firstRow;for(var a=0,f=o.length;a=0){n=this.$cellWidthsForRow(r);if(n.length==0)break;t.unshift(n),r--}var i=r+1;r=e;var s=this.$editor.session.getLength();while(r0&&(this.$editor.session.getDocument().insertInLine({row:e,column:f+1},Array(l+1).join(" ")+" "),this.$editor.session.getDocument().removeInLine(e,f,f+1),r+=l),l<0&&p>=-l&&(this.$editor.session.getDocument().removeInLine(e,f+l,f),r+=l)}},e.prototype.$izip_longest=function(e){if(!e[0])return[];var t=e[0].length,n=e.length;for(var r=1;rt&&(t=i)}var s=[];for(var o=0;o=t.length?t.length:e.length,r=[];for(var i=0;i")}return this.textContent&&e.push(this.textContent),this.type!="fragment"&&e.push(""),e.join("")},e}(),l={createTextNode:function(e,t){return a(e)},createElement:function(e){return new f(e)},createFragment:function(){return new f("fragment")}},c=function(){this.config={},this.dom=l};c.prototype=i.prototype;var h=function(e,t,n){var r=e.className.match(/lang-(\w+)/),i=t.mode||r&&"ace/mode/"+r[1];if(!i)return!1;var s=t.theme||"ace/theme/textmate",o="",a=[];if(e.firstElementChild){var f=0;for(var l=0;l-1}var r=e("../token_iterator").TokenIterator;t.singletonTags=["area","base","br","col","command","embed","hr","html","img","input","keygen","link","meta","param","source","track","wbr"],t.blockTags=["article","aside","blockquote","body","div","dl","fieldset","footer","form","head","header","html","nav","ol","p","script","section","style","table","tbody","tfoot","thead","ul"],t.formatOptions={lineBreaksAfterCommasInCurlyBlock:!0},t.beautify=function(e){var n=new r(e,0,0),s=n.getCurrentToken(),o=e.getTabString(),u=t.singletonTags,a=t.blockTags,f=t.formatOptions||{},l,c=!1,h=!1,p=!1,d="",v="",m="",g=0,y=0,b=0,w=0,E=0,S=0,x=0,T,N=0,C=0,k=[],L=!1,A,O=!1,M=!1,_=!1,D=!1,P={0:0},H=[],B=!1,j=function(){l&&l.value&&l.type!=="string.regexp"&&(l.value=l.value.replace(/^\s*/,""))},F=function(){var e=d.length-1;for(;;){if(e==0)break;if(d[e]!==" ")break;e-=1}d=d.slice(0,e+1)},I=function(){d=d.trimRight(),c=!1};while(s!==null){N=n.getCurrentTokenRow(),k=n.$rowTokens,l=n.stepForward();if(typeof s!="undefined"){v=s.value,E=0,_=m==="style"||e.$modeId==="ace/mode/css",i(s,"tag-open")?(M=!0,l&&(D=a.indexOf(l.value)!==-1),v==="0;C--)d+="\n";c=!0,!i(s,"comment")&&!s.type.match(/^(comment|string)$/)&&(v=v.trimLeft())}if(v){s.type==="keyword"&&v.match(/^(if|else|elseif|for|foreach|while|switch)$/)?(H[g]=v,j(),p=!0,v.match(/^(else|elseif)$/)&&d.match(/\}[\s]*$/)&&(I(),h=!0)):s.type==="paren.lparen"?(j(),v.substr(-1)==="{"&&(p=!0,O=!1,M||(C=1)),v.substr(0,1)==="{"&&(h=!0,d.substr(-1)!=="["&&d.trimRight().substr(-1)==="["?(I(),h=!1):d.trimRight().substr(-1)===")"?I():F())):s.type==="paren.rparen"?(E=1,v.substr(0,1)==="}"&&(H[g-1]==="case"&&E++,d.trimRight().substr(-1)==="{"?I():(h=!0,_&&(C+=2))),v.substr(0,1)==="]"&&d.substr(-1)!=="}"&&d.trimRight().substr(-1)==="}"&&(h=!1,w++,I()),v.substr(0,1)===")"&&d.substr(-1)!=="("&&d.trimRight().substr(-1)==="("&&(h=!1,w++,I()),F()):s.type!=="keyword.operator"&&s.type!=="keyword"||!v.match(/^(=|==|===|!=|!==|&&|\|\||and|or|xor|\+=|.=|>|>=|<|<=|=>)$/)?s.type==="punctuation.operator"&&v===";"?(I(),j(),p=!0,_&&C++):s.type==="punctuation.operator"&&v.match(/^(:|,)$/)?(I(),j(),v.match(/^(,)$/)&&x>0&&S===0&&f.lineBreaksAfterCommasInCurlyBlock?C++:(p=!0,c=!1)):s.type==="support.php_tag"&&v==="?>"&&!c?(I(),h=!0):i(s,"attribute-name")&&d.substr(-1).match(/^\s$/)?h=!0:i(s,"attribute-equals")?(F(),j()):i(s,"tag-close")?(F(),v==="/>"&&(h=!0)):s.type==="keyword"&&v.match(/^(case|default)$/)&&B&&(E=1):(I(),j(),h=!0,p=!0);if(c&&(!s.type.match(/^(comment)$/)||!!v.substr(0,1).match(/^[/#]$/))&&(!s.type.match(/^(string)$/)||!!v.substr(0,1).match(/^['"@]$/))){w=b;if(g>y){w++;for(A=g;A>y;A--)P[A]=w}else g")D&&l&&l.value===""&&g--),i(s,"tag-name")&&(m=v),T=N}}s=l}d=d.trim(),e.doc.setValue(d)},t.commands=[{name:"beautify",description:"Format selection (Beautify)",exec:function(e){t.beautify(e.session)},bindKey:"Ctrl-Shift-B"}]}); (function() { 2 | ace.require(["ace/ext/beautify"], function(m) { 3 | if (typeof module == "object" && typeof exports == "object" && module) { 4 | module.exports = m; 5 | } 6 | }); 7 | })(); 8 | -------------------------------------------------------------------------------- /web/ace-editor.js: -------------------------------------------------------------------------------- 1 | var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { 2 | function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } 3 | return new (P || (P = Promise))(function (resolve, reject) { 4 | function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } 5 | function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } 6 | function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } 7 | step((generator = generator.apply(thisArg, _arguments || [])).next()); 8 | }); 9 | }; 10 | import { nodeConfig } from "./config.js"; 11 | import { app } from "../../scripts/app.js"; 12 | export function initAceInstance(node, editorId) { 13 | return __awaiter(this, void 0, void 0, function* () { 14 | try { 15 | setTimeout(() => { 16 | var _a, _b; 17 | if (ace === null || ace === void 0 ? void 0 : ace.edit) { 18 | let editor = ace.edit(editorId); 19 | const savedCode = ((_a = node === null || node === void 0 ? void 0 : node.widgets_values) === null || _a === void 0 ? void 0 : _a.length) 20 | ? node.widgets_values[0] 21 | : nodeConfig.placeholderCode; 22 | const userTheme = (_b = app.ui.settings.getSettingValue("PythonInterpreter.Theme")) !== null && _b !== void 0 ? _b : nodeConfig.defaultTheme; 23 | console.log("User theme:", app.ui.settings.getSettingValue("PythonInterpreter.Theme")); 24 | editor.setValue(savedCode); 25 | editor.setOptions({ 26 | tabSize: 2, 27 | wrap: true, 28 | mode: "ace/mode/python", 29 | theme: `ace/theme/${userTheme}`, 30 | showPrintMargin: false, 31 | showGutter: false, 32 | customScrollbar: true, 33 | enableAutoIndent: true, 34 | }); 35 | ace.require("ace/ext/language_tools"); 36 | } 37 | }, 128); 38 | } 39 | catch (e) { 40 | console.debug("[onNodeCreated handler] Error trying to initialize ace editor for python code node", e); 41 | } 42 | }); 43 | } 44 | export function createAceDomElements(node, editorId) { 45 | return __awaiter(this, void 0, void 0, function* () { 46 | // Create ace editor container element 47 | const acePythonContainer = Object.assign(document.createElement("div"), { 48 | id: editorId, 49 | style: { 50 | width: "100%", 51 | height: "100%", 52 | position: "relative", 53 | }, 54 | }); 55 | // Add ace editor container to the node on creation 56 | if (node.addDOMWidget !== undefined) { 57 | node.addDOMWidget(editorId, "customtext", acePythonContainer, { 58 | getValue: function () { 59 | try { 60 | if (ace === null || ace === void 0 ? void 0 : ace.edit) { 61 | return ace.edit(editorId).getValue(); 62 | } 63 | } 64 | catch (e) { 65 | console.debug("[onNodeCreated handler] Error trying to get value from ace editor for python code node", e); 66 | } 67 | }, 68 | }); 69 | } 70 | // Mirror code editor text to hidden input widget 71 | function waitForElement(){ 72 | ace 73 | .edit(editorId) 74 | .getSession() 75 | .on("change", (e) => { 76 | node.widgets.find((w) => w.name === nodeConfig.hiddenInputId).value = 77 | ace.edit(editorId).getValue(); 78 | }); 79 | } 80 | //wait for ace editor to be loaded and ready 81 | 82 | try { 83 | waitForElement(); 84 | } 85 | catch (e) { 86 | console.debug("[onNodeCreated handler] Error trying to mirror code editor text to hidden input widget,try again after 1s", e); 87 | setTimeout(waitForElement,1000); 88 | } 89 | }); 90 | } 91 | -------------------------------------------------------------------------------- /lib-ace/theme-tomorrow_night_bright.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/theme/tomorrow_night_bright-css",["require","exports","module"],function(e,t,n){n.exports=".ace-tomorrow-night-bright .ace_gutter {\n background: #1a1a1a;\n color: #DEDEDE\n}\n\n.ace-tomorrow-night-bright .ace_print-margin {\n width: 1px;\n background: #1a1a1a\n}\n\n.ace-tomorrow-night-bright {\n background-color: #000000;\n color: #DEDEDE\n}\n\n.ace-tomorrow-night-bright .ace_cursor {\n color: #9F9F9F\n}\n\n.ace-tomorrow-night-bright .ace_marker-layer .ace_selection {\n background: #424242\n}\n\n.ace-tomorrow-night-bright.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px #000000;\n}\n\n.ace-tomorrow-night-bright .ace_marker-layer .ace_step {\n background: rgb(102, 82, 0)\n}\n\n.ace-tomorrow-night-bright .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid #888888\n}\n\n.ace-tomorrow-night-bright .ace_marker-layer .ace_highlight {\n border: 1px solid rgb(110, 119, 0);\n border-bottom: 0;\n box-shadow: inset 0 -1px rgb(110, 119, 0);\n margin: -1px 0 0 -1px;\n background: rgba(255, 235, 0, 0.1)\n}\n\n.ace-tomorrow-night-bright .ace_marker-layer .ace_active-line {\n background: #2A2A2A\n}\n\n.ace-tomorrow-night-bright .ace_gutter-active-line {\n background-color: #2A2A2A\n}\n\n.ace-tomorrow-night-bright .ace_stack {\n background-color: rgb(66, 90, 44)\n}\n\n.ace-tomorrow-night-bright .ace_marker-layer .ace_selected-word {\n border: 1px solid #888888\n}\n\n.ace-tomorrow-night-bright .ace_invisible {\n color: #343434\n}\n\n.ace-tomorrow-night-bright .ace_keyword,\n.ace-tomorrow-night-bright .ace_meta,\n.ace-tomorrow-night-bright .ace_storage,\n.ace-tomorrow-night-bright .ace_storage.ace_type,\n.ace-tomorrow-night-bright .ace_support.ace_type {\n color: #C397D8\n}\n\n.ace-tomorrow-night-bright .ace_keyword.ace_operator {\n color: #70C0B1\n}\n\n.ace-tomorrow-night-bright .ace_constant.ace_character,\n.ace-tomorrow-night-bright .ace_constant.ace_language,\n.ace-tomorrow-night-bright .ace_constant.ace_numeric,\n.ace-tomorrow-night-bright .ace_keyword.ace_other.ace_unit,\n.ace-tomorrow-night-bright .ace_support.ace_constant,\n.ace-tomorrow-night-bright .ace_variable.ace_parameter {\n color: #E78C45\n}\n\n.ace-tomorrow-night-bright .ace_constant.ace_other {\n color: #EEEEEE\n}\n\n.ace-tomorrow-night-bright .ace_invalid {\n color: #CED2CF;\n background-color: #DF5F5F\n}\n\n.ace-tomorrow-night-bright .ace_invalid.ace_deprecated {\n color: #CED2CF;\n background-color: #B798BF\n}\n\n.ace-tomorrow-night-bright .ace_fold {\n background-color: #7AA6DA;\n border-color: #DEDEDE\n}\n\n.ace-tomorrow-night-bright .ace_entity.ace_name.ace_function,\n.ace-tomorrow-night-bright .ace_support.ace_function,\n.ace-tomorrow-night-bright .ace_variable {\n color: #7AA6DA\n}\n\n.ace-tomorrow-night-bright .ace_support.ace_class,\n.ace-tomorrow-night-bright .ace_support.ace_type {\n color: #E7C547\n}\n\n.ace-tomorrow-night-bright .ace_heading,\n.ace-tomorrow-night-bright .ace_markup.ace_heading,\n.ace-tomorrow-night-bright .ace_string {\n color: #B9CA4A\n}\n\n.ace-tomorrow-night-bright .ace_entity.ace_name.ace_tag,\n.ace-tomorrow-night-bright .ace_entity.ace_other.ace_attribute-name,\n.ace-tomorrow-night-bright .ace_meta.ace_tag,\n.ace-tomorrow-night-bright .ace_string.ace_regexp,\n.ace-tomorrow-night-bright .ace_variable {\n color: #D54E53\n}\n\n.ace-tomorrow-night-bright .ace_comment {\n color: #969896\n}\n\n.ace-tomorrow-night-bright .ace_c9searchresults.ace_keyword {\n color: #C2C280\n}\n\n.ace-tomorrow-night-bright .ace_indent-guide {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYFBXV/8PAAJoAXX4kT2EAAAAAElFTkSuQmCC) right repeat-y\n}\n\n.ace-tomorrow-night-bright .ace_indent-guide-active {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQIW2PQ1dX9zzBz5sz/ABCcBFFentLlAAAAAElFTkSuQmCC) right repeat-y;\n}\n"}),ace.define("ace/theme/tomorrow_night_bright",["require","exports","module","ace/theme/tomorrow_night_bright-css","ace/lib/dom"],function(e,t,n){t.isDark=!0,t.cssClass="ace-tomorrow-night-bright",t.cssText=e("./tomorrow_night_bright-css");var r=e("../lib/dom");r.importCssString(t.cssText,t.cssClass,!1)}); (function() { 2 | ace.require(["ace/theme/tomorrow_night_bright"], function(m) { 3 | if (typeof module == "object" && typeof exports == "object" && module) { 4 | module.exports = m; 5 | } 6 | }); 7 | })(); 8 | -------------------------------------------------------------------------------- /lib-ace/theme-github_light_default.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/theme/github_light_default-css",["require","exports","module"],function(e,t,n){n.exports='.ace-github-light-default .ace_gutter {\n background: #ffffff;\n color: rgba(27, 31, 35, 0.3);\n}\n\n.ace-github-light-default .ace_print-margin {\n width: 1px;\n background: #e8e8e8;\n}\n\n.ace-github-light-default {\n background-color: #FFFFFF;\n color: #24292E;\n}\n\n.ace-github-light-default .ace_cursor {\n color: #044289;\n background: none;\n}\n\n.ace-github-light-default .ace_marker-layer .ace_selection {\n background: rgba(3, 102, 214, 0.14);\n}\n\n.ace-github-light-default.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px #FFFFFF;\n border-radius: 2px;\n}\n\n.ace-github-light-default .ace_marker-layer .ace_step {\n background: rgb(198, 219, 174);\n}\n\n.ace-github-light-default .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid rgba(52, 208, 88, 0);\n background: rgba(52, 208, 88, 0.25);\n}\n\n.ace-github-light-default .ace_marker-layer .ace_active-line {\n background: #f6f8fa;\n border: 2px solid #eeeeee;\n}\n\n.ace-github-light-default .ace_gutter-active-line {\n background-color: #f6f8fa;\n color: #24292e\n}\n\n.ace-github-light-default .ace_marker-layer .ace_selected-word {\n border: 1px solid rgba(3, 102, 214, 0.14);\n}\n\n.ace-github-light-default .ace_fold {\n background-color: #D73A49;\n border-color: #24292E;\n}\n\n.ace_tooltip.ace-github-light-default {\n background-color: #f6f8fa !important;\n color: #444d56 !important;\n border: 1px solid #444d56\n}\n\n.ace-github-light-default .language_highlight_error {\n border-bottom: dotted 1px #cb2431;\n background: none;\n}\n\n.ace-github-light-default .language_highlight_warning {\n border-bottom: solid 1px #f9c513;\n background: none;\n}\n\n.ace-github-light-default .language_highlight_info {\n border-bottom: dotted 1px #1a85ff;\n background: none;\n}\n\n.ace-github-light-default .ace_keyword {\n color: #D73A49;\n}\n\n.ace-github-light-default .ace_constant {\n color: #005CC5;\n}\n\n.ace-github-light-default .ace_support {\n color: #005CC5;\n}\n\n.ace-github-light-default .ace_support.ace_constant {\n color: #005CC5;\n}\n\n.ace-github-light-default .ace_support.ace_type {\n color: #D73A49;\n}\n\n.ace-github-light-default .ace_storage {\n color: #D73A49;\n}\n\n.ace-github-light-default .ace_storage.ace_type {\n color: #D73A49;\n}\n\n.ace-github-light-default .ace_invalid.ace_illegal {\n font-style: italic;\n color: #B31D28;\n}\n\n.ace-github-light-default .ace_invalid.ace_deprecated {\n font-style: italic;\n color: #B31D28;\n}\n\n.ace-github-light-default .ace_string {\n color: #032F62;\n}\n\n.ace-github-light-default .ace_string.ace_regexp {\n color: #032F62;\n}\n\n.ace-github-light-default .ace_comment {\n color: #6A737D;\n}\n\n.ace-github-light-default .ace_variable {\n color: #E36209;\n}\n\n.ace-github-light-default .ace_variable.ace_language {\n color: #005CC5;\n}\n\n.ace-github-light-default .ace_entity.ace_name {\n color: #6F42C1;\n}\n\n.ace-github-light-default .ace_entity {\n color: #6F42C1;\n}\n\n.ace-github-light-default .ace_entity.ace_name.ace_tag {\n color: #22863A;\n}\n\n.ace-github-light-default .ace_meta.ace_tag {\n color: #22863A;\n}\n\n.ace-github-light-default .ace_markup.ace_heading {\n color: #005CC5;\n}\n\n.ace-github-light-default .ace_indent-guide {\n background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==") right repeat-y;\n}\n\n.ace-github-light-default .ace_indent-guide-active {\n background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAAZSURBVHjaYvj///9/hivKyv8BAAAA//8DACLqBhbvk+/eAAAAAElFTkSuQmCC") right repeat-y;\n}\n'}),ace.define("ace/theme/github_light_default",["require","exports","module","ace/theme/github_light_default-css","ace/lib/dom"],function(e,t,n){t.isDark=!1,t.cssClass="ace-github-light-default",t.cssText=e("./github_light_default-css");var r=e("../lib/dom");r.importCssString(t.cssText,t.cssClass,!1)}); (function() { 2 | ace.require(["ace/theme/github_light_default"], function(m) { 3 | if (typeof module == "object" && typeof exports == "object" && module) { 4 | module.exports = m; 5 | } 6 | }); 7 | })(); 8 | -------------------------------------------------------------------------------- /example_workflows/Get Complementary Color Palette from Image.json: -------------------------------------------------------------------------------- 1 | {"last_node_id":80,"last_link_id":178,"nodes":[{"id":80,"type":"LoadImage","pos":[1140,75],"size":[390,465],"flags":{},"order":0,"mode":0,"inputs":[],"outputs":[{"name":"IMAGE","type":"IMAGE","links":[178]},{"name":"MASK","type":"MASK","links":null}],"properties":{"Node name for S&R":"LoadImage"},"widgets_values":["0000000000000000000example.png","image"]},{"id":79,"type":"Exec Python Code Script","pos":[1605,45],"size":[765,780],"flags":{},"order":1,"mode":0,"inputs":[{"name":"image1","type":"IMAGE","link":178,"shape":7},{"name":"image2","type":"IMAGE","link":null,"shape":7},{"name":"mask1","type":"MASK","link":null,"shape":7},{"name":"mask2","type":"MASK","link":null,"shape":7},{"name":"list1","type":"*","link":null,"shape":7},{"name":"dict1","type":"*","link":null,"shape":7},{"name":"any1","type":"*","link":null,"shape":7},{"name":"any2","type":"*","link":null,"shape":7},{"name":"any3","type":"*","link":null,"shape":7},{"name":"any4","type":"*","link":null,"shape":7}],"outputs":[{"name":"image1","type":"*","links":null},{"name":"image2","type":"*","links":null},{"name":"mask1","type":"*","links":null},{"name":"mask2","type":"*","links":null},{"name":"number1","type":"*","links":null},{"name":"number2","type":"*","links":null},{"name":"text1","type":"*","links":null},{"name":"text2","type":"*","links":null},{"name":"list1","type":"*","links":null},{"name":"dict1","type":"*","links":null},{"name":"any1","type":"*","links":null},{"name":"any2","type":"*","links":null},{"name":"any3","type":"*","links":null},{"name":"any4","type":"*","links":null}],"properties":{},"widgets_values":["from sklearn.cluster import KMeans\nimport webcolors\n\n\ndef get_colors(image):\n pixels = image.view(-1, image.shape[-1]).numpy() # torch already imported\n colors = KMeans(n_clusters=5).fit(pixels).cluster_centers_ * 255\n return colors\n\ndef get_complementary_colors(main_colors):\n ret = []\n for colors in main_colors:\n ret.append([(255 - colors[i]) % 256 for i in range(3)])\n return ret\n \ndef get_color_names(color_list):\n import webcolors\n colors = []\n for color in color_list:\n rgb = (int(color[0]), int(color[1]), int(color[2]))\n c, min_d = None, float(\"inf\")\n for name, color in webcolors.CSS3_HEX_TO_NAMES.items():\n distance = sum(abs(a - b) for a, b in zip(rgb, webcolors.hex_to_rgb(name)))\n if distance < min_d:\n min_d, c = distance, name\n colors.append(webcolors.CSS3_HEX_TO_NAMES[c])\n return \", \".join(colors[:-1]) + \" and \" + colors[-1]\n\ncolors = get_colors(image1)\ncomplementary_colors = get_complementary_colors(colors)\ncolors = get_color_names(colors)\ncomplementary_colors = get_color_names(complementary_colors)\n\nprint(f\"Main color palette: {colors}\")\nprint(f\"Complementary color palette: {complementary_colors}\")",0,0,"hello","world",true,"from sklearn.cluster import KMeans\nimport webcolors\n\n\ndef get_colors(image):\n pixels = image.view(-1, image.shape[-1]).numpy() # torch already imported\n colors = KMeans(n_clusters=5).fit(pixels).cluster_centers_ * 255\n return colors\n\ndef get_complementary_colors(main_colors):\n ret = []\n for colors in main_colors:\n ret.append([(255 - colors[i]) % 256 for i in range(3)])\n return ret\n \ndef get_color_names(color_list):\n import webcolors\n colors = []\n for color in color_list:\n rgb = (int(color[0]), int(color[1]), int(color[2]))\n c, min_d = None, float(\"inf\")\n for name, color in webcolors.CSS3_HEX_TO_NAMES.items():\n distance = sum(abs(a - b) for a, b in zip(rgb, webcolors.hex_to_rgb(name)))\n if distance < min_d:\n min_d, c = distance, name\n colors.append(webcolors.CSS3_HEX_TO_NAMES[c])\n return \", \".join(colors[:-1]) + \" and \" + colors[-1]\n\ncolors = get_colors(image1)\ncomplementary_colors = get_complementary_colors(colors)\ncolors = get_color_names(colors)\ncomplementary_colors = get_color_names(complementary_colors)\n\nprint(f\"Main color palette: {colors}\")\nprint(f\"Complementary color palette: {complementary_colors}\")","Output:\nMain color palette: lightgreen, cornflowerblue, beige, khaki and lightpink\nComplementary color palette: darkmagenta, olive, black, darkblue and darkgreen\n"]}],"links":[[178,80,0,79,0,"IMAGE"]],"groups":[],"config":{},"extra":{"ds":{"scale":0.7050000000000001,"offset":[-525.1052117701429,209.99557856388253]},"node_versions":{"comfy-core":"v0.3.10-33-g7da85fa","python-interpreter-node":"ac2547ada25643be7cfe4b8030e57059c9da5bd7"},"VHS_latentpreview":false,"VHS_latentpreviewrate":0},"version":0.4} -------------------------------------------------------------------------------- /lib-ace/theme-dracula.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/theme/dracula-css",["require","exports","module"],function(e,t,n){n.exports='/*\n * Copyright \u00a9 2017 Zeno Rocha \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \u201cSoftware\u201d), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \u201cAS IS\u201d, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n */\n\n.ace-dracula .ace_gutter {\n background: #282a36;\n color: rgb(144,145,148)\n}\n\n.ace-dracula .ace_print-margin {\n width: 1px;\n background: #44475a\n}\n\n.ace-dracula {\n background-color: #282a36;\n color: #f8f8f2\n}\n\n.ace-dracula .ace_cursor {\n color: #f8f8f0\n}\n\n.ace-dracula .ace_marker-layer .ace_selection {\n background: #44475a\n}\n\n.ace-dracula.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px #282a36;\n border-radius: 2px\n}\n\n.ace-dracula .ace_marker-layer .ace_step {\n background: rgb(198, 219, 174)\n}\n\n.ace-dracula .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid #a29709\n}\n\n.ace-dracula .ace_marker-layer .ace_active-line {\n background: #44475a\n}\n\n.ace-dracula .ace_gutter-active-line {\n background-color: #44475a\n}\n\n.ace-dracula .ace_marker-layer .ace_selected-word {\n box-shadow: 0px 0px 0px 1px #a29709;\n border-radius: 3px;\n}\n\n.ace-dracula .ace_fold {\n background-color: #50fa7b;\n border-color: #f8f8f2\n}\n\n.ace-dracula .ace_keyword {\n color: #ff79c6\n}\n\n.ace-dracula .ace_constant.ace_language {\n color: #bd93f9\n}\n\n.ace-dracula .ace_constant.ace_numeric {\n color: #bd93f9\n}\n\n.ace-dracula .ace_constant.ace_character {\n color: #bd93f9\n}\n\n.ace-dracula .ace_constant.ace_character.ace_escape {\n color: #ff79c6\n}\n\n.ace-dracula .ace_constant.ace_other {\n color: #bd93f9\n}\n\n.ace-dracula .ace_support.ace_function {\n color: #8be9fd\n}\n\n.ace-dracula .ace_support.ace_constant {\n color: #6be5fd\n}\n\n.ace-dracula .ace_support.ace_class {\n font-style: italic;\n color: #66d9ef\n}\n\n.ace-dracula .ace_support.ace_type {\n font-style: italic;\n color: #66d9ef\n}\n\n.ace-dracula .ace_storage {\n color: #ff79c6\n}\n\n.ace-dracula .ace_storage.ace_type {\n font-style: italic;\n color: #8be9fd\n}\n\n.ace-dracula .ace_invalid {\n color: #F8F8F0;\n background-color: #ff79c6\n}\n\n.ace-dracula .ace_invalid.ace_deprecated {\n color: #F8F8F0;\n background-color: #bd93f9\n}\n\n.ace-dracula .ace_string {\n color: #f1fa8c\n}\n\n.ace-dracula .ace_comment {\n color: #6272a4\n}\n\n.ace-dracula .ace_variable {\n color: #50fa7b\n}\n\n.ace-dracula .ace_variable.ace_parameter {\n font-style: italic;\n color: #ffb86c\n}\n\n.ace-dracula .ace_entity.ace_other.ace_attribute-name {\n color: #50fa7b\n}\n\n.ace-dracula .ace_entity.ace_name.ace_function {\n color: #50fa7b\n}\n\n.ace-dracula .ace_entity.ace_name.ace_tag {\n color: #ff79c6\n}\n.ace-dracula .ace_invisible {\n color: #626680;\n}\n\n.ace-dracula .ace_indent-guide {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYHB3d/8PAAOIAdULw8qMAAAAAElFTkSuQmCC) right repeat-y\n}\n\n.ace-dracula .ace_indent-guide-active {\n background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACAQMAAACjTyRkAAAABlBMVEUAAADCwsK76u2xAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjYGBoAAAAhACBGFbxzQAAAABJRU5ErkJggg==") right repeat-y;\n}\n'}),ace.define("ace/theme/dracula",["require","exports","module","ace/theme/dracula-css","ace/lib/dom"],function(e,t,n){t.isDark=!0,t.cssClass="ace-dracula",t.cssText=e("./dracula-css"),t.$selectionColorConflict=!0;var r=e("../lib/dom");r.importCssString(t.cssText,t.cssClass,!1)}); (function() { 2 | ace.require(["ace/theme/dracula"], function(m) { 3 | if (typeof module == "object" && typeof exports == "object" && module) { 4 | module.exports = m; 5 | } 6 | }); 7 | })(); 8 | -------------------------------------------------------------------------------- /lib-ace/ext-modelist.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/ext/modelist",["require","exports","module"],function(e,t,n){"use strict";function i(e){var t=a.text,n=e.split(/[\/\\]/).pop();for(var i=0;i [!TIP] 6 | > To install via manager, you must first open the ComfyUI Manager settings and set the `channel` setting to `dev`: 7 | > 8 | > 9 | > 10 | >
11 | > 12 | >   See Picture of Specified Setting 13 | > 14 | > ![channel setting in comfyui manager](https://github.com/christian-byrne/python-interpreter-node/blob/demo-files/wiki/comfyui-manager-setting.png?raw=true) 15 | > 16 | >
17 | > 18 | 19 | ## Description 20 | 21 | - Write Python code that executes when the workflow is queued 22 | - The stdout/err (e.g., prints, error tracebacks) are displayed in the node. 23 | - The input values can be accessed by their UI name. 24 | - The output values are the same as the input values, changes made to input values in the code are reflected in the output values. 25 | 26 | ## Requirements 27 | 28 | - python 3.10+ 29 | 30 | ## Installation 31 | 32 | 1. `cd` into `ComfyUI/custom_nodes` directory 33 | 2. `git clone` this repository 34 | 35 | To install via ComfyUI Manager, set the `channels` setting to `dev` and search for `Python Interpreter` in the manager. 36 | 37 | ## Usage 38 | 39 | - The variables in the UI (e.g., `image1`, `number1`, `text1`, etc.) can be accessed directly in the code by the same name 40 | ```python 41 | print(image1.shape) 42 | print(number1 * random.randint(0, 99)) 43 | ``` 44 | - The output values share the same names as the input values. Changes you make to these variables will be reflected in the output values. 45 | - The code will work as expected in almost all cases except for i. re-assignment and ii. passing the variables as arguments to external functions. 46 | 1. To re-assign a variable, you must use its `to()` method, regardless of the variable's type 47 | ```python 48 | # Instead of number1 = float(number1): 49 | number1.to(float(number1)) 50 | 51 | # Instead of image1 = 0.5 * (image1 + image2): 52 | image1.to(0.5 * (image1 + image2)) 53 | 54 | # Instead of mask1 = 1 - mask1: 55 | mask1.to(1 - mask1) 56 | 57 | # Instead of text1 = text1.replace("bad", ""): 58 | text1.to(text1.replace("bad", "")) 59 | 60 | # In-place operators (+=, ++, /=, etc.) will work normally 61 | number1++ 62 | text1 += " is good" 63 | ``` 64 | 2. To pass the variables as arguments to functions, just pass the `.data` attribute of the variable instead (regardless of the variable's type) 65 | ```python 66 | # Instead of pil_img = ToPILImage()(image1): 67 | pil_img = ToPILImage()(image1.data) 68 | 69 | # Instead of random.sample[number1, number2]: 70 | random.sample([number1.data, number2.data]) 71 | 72 | # Not necessary for built-in functions 73 | print(image1) # works 74 | print(len(text1)) # works 75 | ``` 76 | - Refer to the [Images, Latents, and Masks section of comfydocs.org](https://docs.comfy.org/essentials/custom_node_images_and_masks) for info regarding types. 77 | - Try to avoid re-assigning the input/output variables to objects of a different type. You may lose access to some instance methods. If it must be done (e.g., to get an ouput of a novel type), just do it at the end of the code, and use your own variables in the meantime. 78 | 79 | ## Examples 80 | 81 | #### Get Complementary Colors from Image -> Interpolate into a Prompt 82 | 83 | > 84 | > 85 | >
86 | >   Expand Image 87 | > 88 | > 89 | > ![demo picture - complementary color palette](https://github.com/christian-byrne/python-interpreter-node/blob/demo-files/wiki/demos/pictures/new-example-complementary-colors.png?raw=true) 90 | > 91 | >
92 | 93 | #### Paste Input Text on Image 94 | 95 | > 96 | > 97 | >
98 | >   Expand Image 99 | > 100 | > 101 | > ![demo picture = caption composite](https://github.com/christian-byrne/python-interpreter-node/blob/demo-files/wiki/demos/pictures/new-example-caption-draw.png?raw=true) 102 | > 103 | >
104 | 105 | #### Snippets 106 | 107 | - [Automatically get color palette and complements from image](https://github.com/christian-byrne/python-interpreter-node/blob/demo-files/wiki/code-snippets-from-demos/get_complementary_colors.py) 108 | - [Most recent image in folder](https://github.com/christian-byrne/python-interpreter-node/blob/demo-files/wiki/code-snippets-from-demos/most_recent_image_in_folder.py) 109 | - [Paste text on image](https://github.com/christian-byrne/python-interpreter-node/blob/demo-files/wiki/code-snippets-from-demos/paste_text_caption.py) 110 | - ...[More](https://github.com/christian-byrne/python-interpreter-node/tree/demo-files/wiki/code-snippets-from-demos) 111 | 112 | 113 | ---- 114 | 115 | *Disclaimer: Do not put this on a server that is accessible to the public. This node can run any Python code provided by a user, including malicious code.* -------------------------------------------------------------------------------- /lib-ace/keybinding-vscode.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/keyboard/vscode",["require","exports","module","ace/keyboard/hash_handler","ace/config"],function(e,t,n){"use strict";var r=e("../keyboard/hash_handler").HashHandler,i=e("../config");t.handler=new r,t.handler.$id="ace/keyboard/vscode",t.handler.addCommands([{name:"toggleWordWrap",exec:function(e){var t=e.session.getUseWrapMode();e.session.setUseWrapMode(!t)},readOnly:!0},{name:"navigateToLastEditLocation",exec:function(e){var t=e.session.getUndoManager().$lastDelta,n=t.action=="remove"?t.start:t.end;e.moveCursorTo(n.row,n.column),e.clearSelection()}},{name:"replaceAll",exec:function(e){e.searchBox?e.searchBox.active===!0&&e.searchBox.replaceOption.checked===!0&&e.searchBox.replaceAll():i.loadModule("ace/ext/searchbox",function(t){t.Search(e,!0)})}},{name:"replaceOne",exec:function(e){e.searchBox?e.searchBox.active===!0&&e.searchBox.replaceOption.checked===!0&&e.searchBox.replace():i.loadModule("ace/ext/searchbox",function(t){t.Search(e,!0)})}},{name:"selectAllMatches",exec:function(e){e.searchBox?e.searchBox.active===!0&&e.searchBox.findAll():i.loadModule("ace/ext/searchbox",function(t){t.Search(e,!1)})}},{name:"toggleFindCaseSensitive",exec:function(e){i.loadModule("ace/ext/searchbox",function(t){t.Search(e,!1);var n=e.searchBox;n.caseSensitiveOption.checked=!n.caseSensitiveOption.checked,n.$syncOptions()})}},{name:"toggleFindInSelection",exec:function(e){i.loadModule("ace/ext/searchbox",function(t){t.Search(e,!1);var n=e.searchBox;n.searchOption.checked=!n.searchRange,n.setSearchRange(n.searchOption.checked&&n.editor.getSelectionRange()),n.$syncOptions()})}},{name:"toggleFindRegex",exec:function(e){i.loadModule("ace/ext/searchbox",function(t){t.Search(e,!1);var n=e.searchBox;n.regExpOption.checked=!n.regExpOption.checked,n.$syncOptions()})}},{name:"toggleFindWholeWord",exec:function(e){i.loadModule("ace/ext/searchbox",function(t){t.Search(e,!1);var n=e.searchBox;n.wholeWordOption.checked=!n.wholeWordOption.checked,n.$syncOptions()})}},{name:"removeSecondaryCursors",exec:function(e){var t=e.selection.ranges;t&&t.length>1?e.selection.toSingleRange(t[t.length-1]):e.selection.clearSelection()}}]),[{bindKey:{mac:"Ctrl-G",win:"Ctrl-G"},name:"gotoline"},{bindKey:{mac:"Command-Shift-L|Command-F2",win:"Ctrl-Shift-L|Ctrl-F2"},name:"findAll"},{bindKey:{mac:"Shift-F8|Shift-Option-F8",win:"Shift-F8|Shift-Alt-F8"},name:"goToPreviousError"},{bindKey:{mac:"F8|Option-F8",win:"F8|Alt-F8"},name:"goToNextError"},{bindKey:{mac:"Command-Shift-P|F1",win:"Ctrl-Shift-P|F1"},name:"openCommandPalette"},{bindKey:{mac:"Shift-Option-Up",win:"Alt-Shift-Up"},name:"copylinesup"},{bindKey:{mac:"Shift-Option-Down",win:"Alt-Shift-Down"},name:"copylinesdown"},{bindKey:{mac:"Command-Shift-K",win:"Ctrl-Shift-K"},name:"removeline"},{bindKey:{mac:"Command-Enter",win:"Ctrl-Enter"},name:"addLineAfter"},{bindKey:{mac:"Command-Shift-Enter",win:"Ctrl-Shift-Enter"},name:"addLineBefore"},{bindKey:{mac:"Command-Shift-\\",win:"Ctrl-Shift-\\"},name:"jumptomatching"},{bindKey:{mac:"Command-]",win:"Ctrl-]"},name:"blockindent"},{bindKey:{mac:"Command-[",win:"Ctrl-["},name:"blockoutdent"},{bindKey:{mac:"Ctrl-PageDown",win:"Alt-PageDown"},name:"pagedown"},{bindKey:{mac:"Ctrl-PageUp",win:"Alt-PageUp"},name:"pageup"},{bindKey:{mac:"Shift-Option-A",win:"Shift-Alt-A"},name:"toggleBlockComment"},{bindKey:{mac:"Option-Z",win:"Alt-Z"},name:"toggleWordWrap"},{bindKey:{mac:"Command-G",win:"F3|Ctrl-K Ctrl-D"},name:"findnext"},{bindKey:{mac:"Command-Shift-G",win:"Shift-F3"},name:"findprevious"},{bindKey:{mac:"Option-Enter",win:"Alt-Enter"},name:"selectAllMatches"},{bindKey:{mac:"Command-D",win:"Ctrl-D"},name:"selectMoreAfter"},{bindKey:{mac:"Command-K Command-D",win:"Ctrl-K Ctrl-D"},name:"selectOrFindNext"},{bindKey:{mac:"Shift-Option-I",win:"Shift-Alt-I"},name:"splitSelectionIntoLines"},{bindKey:{mac:"Command-K M",win:"Ctrl-K M"},name:"modeSelect"},{bindKey:{mac:"Command-Option-[",win:"Ctrl-Shift-["},name:"toggleFoldWidget"},{bindKey:{mac:"Command-Option-]",win:"Ctrl-Shift-]"},name:"toggleFoldWidget"},{bindKey:{mac:"Command-K Command-0",win:"Ctrl-K Ctrl-0"},name:"foldall"},{bindKey:{mac:"Command-K Command-J",win:"Ctrl-K Ctrl-J"},name:"unfoldall"},{bindKey:{mac:"Command-K Command-1",win:"Ctrl-K Ctrl-1"},name:"foldOther"},{bindKey:{mac:"Command-K Command-Q",win:"Ctrl-K Ctrl-Q"},name:"navigateToLastEditLocation"},{bindKey:{mac:"Command-K Command-R|Command-K Command-S",win:"Ctrl-K Ctrl-R|Ctrl-K Ctrl-S"},name:"showKeyboardShortcuts"},{bindKey:{mac:"Command-K Command-X",win:"Ctrl-K Ctrl-X"},name:"trimTrailingSpace"},{bindKey:{mac:"Shift-Down|Command-Shift-Down",win:"Shift-Down|Ctrl-Shift-Down"},name:"selectdown"},{bindKey:{mac:"Shift-Up|Command-Shift-Up",win:"Shift-Up|Ctrl-Shift-Up"},name:"selectup"},{bindKey:{mac:"Command-Alt-Enter",win:"Ctrl-Alt-Enter"},name:"replaceAll"},{bindKey:{mac:"Command-Shift-1",win:"Ctrl-Shift-1"},name:"replaceOne"},{bindKey:{mac:"Option-C",win:"Alt-C"},name:"toggleFindCaseSensitive"},{bindKey:{mac:"Option-L",win:"Alt-L"},name:"toggleFindInSelection"},{bindKey:{mac:"Option-R",win:"Alt-R"},name:"toggleFindRegex"},{bindKey:{mac:"Option-W",win:"Alt-W"},name:"toggleFindWholeWord"},{bindKey:{mac:"Command-L",win:"Ctrl-L"},name:"expandtoline"},{bindKey:{mac:"Shift-Esc",win:"Shift-Esc"},name:"removeSecondaryCursors"}].forEach(function(e){var n=t.handler.commands[e.name];n&&(n.bindKey=e.bindKey),t.handler.bindKey(e.bindKey,n||e.name)})}); (function() { 2 | ace.require(["ace/keyboard/vscode"], function(m) { 3 | if (typeof module == "object" && typeof exports == "object" && module) { 4 | module.exports = m; 5 | } 6 | }); 7 | })(); 8 | -------------------------------------------------------------------------------- /lib-ace/ext-textarea.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/ext/textarea",["require","exports","module","ace/lib/event","ace/lib/useragent","ace/ace"],function(e,t,n){"use strict";function u(e,t){for(var n in t)e.style[n]=t[n]}function a(e,t){if(e.type!="textarea")throw new Error("Textarea required!");var n=e.parentNode,i=document.createElement("div"),s=function(){var t="position:relative;";["margin-top","margin-left","margin-right","margin-bottom"].forEach(function(n){t+=n+":"+o(e,i,n)+";"});var n=o(e,i,"width")||e.clientWidth+"px",r=o(e,i,"height")||e.clientHeight+"px";t+="height:"+r+";width:"+n+";",t+="display:inline-block;",i.style.cssText=t};r.addListener(window,"resize",s),s(),n.insertBefore(i,e.nextSibling);while(n!==document){if(n.tagName.toUpperCase()==="FORM"){var u=n.onsubmit;n.onsubmit=function(n){e.value=t(),u&&u.call(this,n)};break}n=n.parentNode}return i}function f(e,t,n,r,i){function s(e){return e==="true"||e==1}return e.setDisplaySettings=function(t){t==null&&(t=n.style.display=="none"),t?(n.style.display="block",n.hideButton.focus(),e.on("focus",function r(){e.removeListener("focus",r),n.style.display="none"})):e.focus()},e.$setOption=e.setOption,e.$getOption=e.getOption,e.setOption=function(t,n){switch(t){case"mode":e.$setOption("mode","ace/mode/"+n);break;case"theme":e.$setOption("theme","ace/theme/"+n);break;case"keybindings":switch(n){case"vim":e.setKeyboardHandler("ace/keyboard/vim");break;case"emacs":e.setKeyboardHandler("ace/keyboard/emacs");break;default:e.setKeyboardHandler(null)}break;case"wrap":case"fontSize":e.$setOption(t,n);break;default:e.$setOption(t,s(n))}},e.getOption=function(t){switch(t){case"mode":return e.$getOption("mode").substr("ace/mode/".length);case"theme":return e.$getOption("theme").substr("ace/theme/".length);case"keybindings":var n=e.getKeyboardHandler();switch(n&&n.$id){case"ace/keyboard/vim":return"vim";case"ace/keyboard/emacs":return"emacs";default:return"ace"}break;default:return e.$getOption(t)}},e.setOptions(i),e}function l(e,n,i){function f(e,t,n,r){if(!n){e.push("");return}e.push("")}var s=null,o={mode:"Mode:",wrap:"Soft Wrap:",theme:"Theme:",fontSize:"Font Size:",showGutter:"Display Gutter:",keybindings:"Keyboard",showPrintMargin:"Show Print Margin:",useSoftTabs:"Use Soft Tabs:",showInvisibles:"Show Invisibles"},u={mode:{text:"Plain",javascript:"JavaScript",xml:"XML",html:"HTML",css:"CSS",scss:"SCSS",python:"Python",php:"PHP",java:"Java",ruby:"Ruby",c_cpp:"C/C++",coffee:"CoffeeScript",json:"json",perl:"Perl",clojure:"Clojure",ocaml:"OCaml",csharp:"C#",haxe:"haXe",svg:"SVG",textile:"Textile",groovy:"Groovy",liquid:"Liquid",Scala:"Scala"},theme:{clouds:"Clouds",clouds_midnight:"Clouds Midnight",cobalt:"Cobalt",crimson_editor:"Crimson Editor",dawn:"Dawn",gob:"Green on Black",eclipse:"Eclipse",idle_fingers:"Idle Fingers",kr_theme:"Kr Theme",merbivore:"Merbivore",merbivore_soft:"Merbivore Soft",mono_industrial:"Mono Industrial",monokai:"Monokai",pastel_on_dark:"Pastel On Dark",solarized_dark:"Solarized Dark",solarized_light:"Solarized Light",textmate:"Textmate",twilight:"Twilight",vibrant_ink:"Vibrant Ink"},showGutter:s,fontSize:{"10px":"10px","11px":"11px","12px":"12px","14px":"14px","16px":"16px"},wrap:{off:"Off",40:"40",80:"80",free:"Free"},keybindings:{ace:"ace",vim:"vim",emacs:"emacs"},showPrintMargin:s,useSoftTabs:s,showInvisibles:s},a=[];a.push("");for(var l in t.defaultOptions)a.push(""),a.push("");a.push("
SettingValue
",o[l],""),f(a,l,u[l],i.getOption(l)),a.push("
"),e.innerHTML=a.join("");var c=function(e){var t=e.currentTarget;i.setOption(t.title,t.value)},h=function(e){var t=e.currentTarget;i.setOption(t.title,t.checked)},p=e.getElementsByTagName("select");for(var d=0;d bool: 17 | return False 18 | 19 | def __eq__(self, __value: object) -> bool: 20 | return True 21 | 22 | 23 | any = AnyType("*") 24 | 25 | 26 | class PythonInterpreter: 27 | @classmethod 28 | def INPUT_TYPES(cls): 29 | return { 30 | "required": { 31 | "raw_code": ( 32 | "STRING", 33 | {"default": ""}, 34 | ), 35 | }, 36 | "optional": { 37 | "image1": ("IMAGE",), 38 | "image2": ("IMAGE",), 39 | "mask1": ("MASK",), 40 | "mask2": ("MASK",), 41 | "number1": ( 42 | "FLOAT", 43 | { 44 | "default": 0.0, 45 | }, 46 | ), 47 | "number2": ( 48 | "INT", 49 | { 50 | "default": 0, 51 | }, 52 | ), 53 | "text1": ( 54 | "STRING", 55 | { 56 | "default": "hello", 57 | }, 58 | ), 59 | "text2": ( 60 | "STRING", 61 | { 62 | "default": "world", 63 | }, 64 | ), 65 | "list1": (any, {}), 66 | "dict1": (any, {}), 67 | "any1": (any, {}), 68 | "any2": (any, {}), 69 | "any3": (any, {}), 70 | "any4": (any, {}), 71 | "verbose": ( 72 | "BOOLEAN", 73 | { 74 | "default": True, 75 | "tooltip": "Whether to print full tracebacks in the output", 76 | }, 77 | ), 78 | }, 79 | "hidden": { 80 | "unique_id": "UNIQUE_ID", 81 | "extra_pnginfo": "EXTRA_PNGINFO", 82 | "output_text": ( 83 | "STRING", 84 | { 85 | "default": "", 86 | }, 87 | ), 88 | }, 89 | } 90 | 91 | FUNCTION = "run" 92 | OUTPUT_NODE = True 93 | RETURN_TYPES = ( 94 | any, 95 | any, 96 | any, 97 | any, 98 | any, 99 | any, 100 | any, 101 | any, 102 | any, 103 | any, 104 | any, 105 | any, 106 | any, 107 | any, 108 | ) 109 | RETURN_NAMES = ( 110 | "image1", 111 | "image2", 112 | "mask1", 113 | "mask2", 114 | "number1", 115 | "number2", 116 | "text1", 117 | "text2", 118 | "list1", 119 | "dict1", 120 | "any1", 121 | "any2", 122 | "any3", 123 | "any4", 124 | ) 125 | CATEGORY = "DevTools" 126 | 127 | def run( 128 | self, 129 | raw_code: str = "", 130 | image1: Optional[torch.Tensor] = torch.rand([1, 32, 32, 3]), 131 | image2: Optional[torch.Tensor] = torch.rand([1, 32, 32, 3]), 132 | mask1: Optional[torch.Tensor] = torch.rand([1, 32, 32]), 133 | mask2: Optional[torch.Tensor] = torch.rand([1, 32, 32]), 134 | number1: Optional[float] = 0.0, 135 | number2: Optional[int] = 0, 136 | text1: Optional[str] = "hello", 137 | text2: Optional[str] = "world", 138 | list1: Optional[List[Any]] = [1], 139 | dict1: Optional[Dict[str, Any]] = {"key": 1}, 140 | any1: Optional[Any] = torch.rand([1, 32, 32, 3]), 141 | any2: Optional[Any] = torch.rand([1, 32, 32, 3]), 142 | any3: Optional[Any] = torch.rand([1, 32, 32, 3]), 143 | any4: Optional[Any] = torch.rand([1, 32, 32, 3]), 144 | verbose: bool = True, 145 | output_text: str = "", 146 | unique_id=None, 147 | extra_pnginfo=None, 148 | ) -> Dict[str, Any]: 149 | self.image1 = WrapperFactory(image1) 150 | self.image2 = WrapperFactory(image2) 151 | self.mask1 = WrapperFactory(mask1) 152 | self.mask2 = WrapperFactory(mask2) 153 | self.number1 = WrapperFactory(number1) 154 | self.number2 = WrapperFactory(number2) 155 | self.text1 = WrapperFactory(text1) 156 | self.text2 = WrapperFactory(text2) 157 | self.list1 = WrapperFactory(list1) 158 | self.dict1 = WrapperFactory(dict1) 159 | self.any1 = WrapperFactory(any1) 160 | self.any2 = WrapperFactory(any2) 161 | self.any3 = WrapperFactory(any3) 162 | self.any4 = WrapperFactory(any4) 163 | 164 | self.shared_ref_dict = self.__map_ref_dict( 165 | [ 166 | "image1", 167 | "image2", 168 | "mask1", 169 | "mask2", 170 | "number1", 171 | "number2", 172 | "text1", 173 | "text2", 174 | "list1", 175 | "dict1", 176 | "any1", 177 | "any2", 178 | "any3", 179 | "any4", 180 | ] 181 | ) 182 | self.out_streams = StandardStreamManager(verbose) 183 | self.__exec_code(raw_code) 184 | result = self.close_scope(self.shared_ref_dict) 185 | return { 186 | "ui": {"text": str(self.out_streams)}, 187 | "result": result, 188 | } 189 | 190 | def close_scope(self, ref_dict: Dict[str, Wrapper]) -> List[Any]: 191 | ret = [] 192 | for value in ref_dict.values(): 193 | if isinstance(value, Wrapper): 194 | ret.append(value.resolve()) 195 | return ret 196 | 197 | def __exec_code(self, code_raw_text: str): 198 | compiled_code = compile(code_raw_text, "", "exec") 199 | try: 200 | with redirect_stdout(self.out_streams.get_out()), redirect_stderr( 201 | self.out_streams.get_err() 202 | ): 203 | exec( 204 | compiled_code, 205 | self.shared_ref_dict, 206 | ) 207 | except Exception as e: 208 | self.out_streams.write_err(e) 209 | 210 | def __map_ref_dict(self, attributes: List[Any]) -> Dict[str, Wrapper]: 211 | ref_dict = {attr: getattr(self, attr) for attr in attributes} 212 | return ref_dict 213 | -------------------------------------------------------------------------------- /lib-ace/keybinding-sublime.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/keyboard/sublime",["require","exports","module","ace/keyboard/hash_handler"],function(e,t,n){"use strict";function i(e,t,n){function f(e){return e?/\s/.test(e)?"s":e=="_"?"_":e.toUpperCase()==e&&e.toLowerCase()!=e?"W":e.toUpperCase()!=e&&e.toLowerCase()==e?"w":"o":"-"}var r=e.selection,i=r.lead.row,s=r.lead.column,o=e.session.getLine(i);if(!o[s+t]){var u=(n?"selectWord":"moveCursorShortWord")+(t==1?"Right":"Left");return e.selection[u]()}t==-1&&s--;while(o[s]){var a=f(o[s])+f(o[s+t]);s+=t;if(t==1){if(a=="WW"&&f(o[s+1])=="w")break}else{if(a=="wW"){if(f(o[s-1])=="W"){s-=1;break}continue}if(a=="Ww")break}if(/w[s_oW]|_[sWo]|o[s_wW]|s[W]|W[so]/.test(a))break}t==-1&&s++,n?e.selection.moveCursorTo(i,s):e.selection.moveTo(i,s)}var r=e("../keyboard/hash_handler").HashHandler;t.handler=new r,t.handler.addCommands([{name:"find_all_under",exec:function(e){e.selection.isEmpty()&&e.selection.selectWord(),e.findAll()},readOnly:!0},{name:"find_under",exec:function(e){e.selection.isEmpty()&&e.selection.selectWord(),e.findNext()},readOnly:!0},{name:"find_under_prev",exec:function(e){e.selection.isEmpty()&&e.selection.selectWord(),e.findPrevious()},readOnly:!0},{name:"find_under_expand",exec:function(e){e.selectMore(1,!1,!0)},scrollIntoView:"animate",readOnly:!0},{name:"find_under_expand_skip",exec:function(e){e.selectMore(1,!0,!0)},scrollIntoView:"animate",readOnly:!0},{name:"delete_to_hard_bol",exec:function(e){var t=e.selection.getCursor();e.session.remove({start:{row:t.row,column:0},end:t})},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"delete_to_hard_eol",exec:function(e){var t=e.selection.getCursor();e.session.remove({start:t,end:{row:t.row,column:Infinity}})},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"moveToWordStartLeft",exec:function(e){e.selection.moveCursorLongWordLeft(),e.clearSelection()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"moveToWordEndRight",exec:function(e){e.selection.moveCursorLongWordRight(),e.clearSelection()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"selectToWordStartLeft",exec:function(e){var t=e.selection;t.$moveSelection(t.moveCursorLongWordLeft)},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"selectToWordEndRight",exec:function(e){var t=e.selection;t.$moveSelection(t.moveCursorLongWordRight)},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"selectSubWordRight",exec:function(e){i(e,1,!0)},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selectSubWordLeft",exec:function(e){i(e,-1,!0)},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"moveSubWordRight",exec:function(e){i(e,1)},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"moveSubWordLeft",exec:function(e){i(e,-1)},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0}]),[{bindKey:{mac:"cmd-k cmd-backspace|cmd-backspace",win:"ctrl-shift-backspace|ctrl-k ctrl-backspace"},name:"removetolinestarthard"},{bindKey:{mac:"cmd-k cmd-k|cmd-delete|ctrl-k",win:"ctrl-shift-delete|ctrl-k ctrl-k"},name:"removetolineendhard"},{bindKey:{mac:"cmd-shift-d",win:"ctrl-shift-d"},name:"duplicateSelection"},{bindKey:{mac:"cmd-l",win:"ctrl-l"},name:"expandtoline"},{bindKey:{mac:"cmd-shift-a",win:"ctrl-shift-a"},name:"expandSelection",args:{to:"tag"}},{bindKey:{mac:"cmd-shift-j",win:"ctrl-shift-j"},name:"expandSelection",args:{to:"indentation"}},{bindKey:{mac:"ctrl-shift-m",win:"ctrl-shift-m"},name:"expandSelection",args:{to:"brackets"}},{bindKey:{mac:"cmd-shift-space",win:"ctrl-shift-space"},name:"expandSelection",args:{to:"scope"}},{bindKey:{mac:"ctrl-cmd-g",win:"alt-f3"},name:"find_all_under"},{bindKey:{mac:"alt-cmd-g",win:"ctrl-f3"},name:"find_under"},{bindKey:{mac:"shift-alt-cmd-g",win:"ctrl-shift-f3"},name:"find_under_prev"},{bindKey:{mac:"cmd-g",win:"f3"},name:"findnext"},{bindKey:{mac:"shift-cmd-g",win:"shift-f3"},name:"findprevious"},{bindKey:{mac:"cmd-d",win:"ctrl-d"},name:"find_under_expand"},{bindKey:{mac:"cmd-k cmd-d",win:"ctrl-k ctrl-d"},name:"find_under_expand_skip"},{bindKey:{mac:"cmd-alt-[",win:"ctrl-shift-["},name:"toggleFoldWidget"},{bindKey:{mac:"cmd-alt-]",win:"ctrl-shift-]"},name:"unfold"},{bindKey:{mac:"cmd-k cmd-0|cmd-k cmd-j",win:"ctrl-k ctrl-0|ctrl-k ctrl-j"},name:"unfoldall"},{bindKey:{mac:"cmd-k cmd-1",win:"ctrl-k ctrl-1"},name:"foldOther",args:{level:1}},{bindKey:{win:"ctrl-left",mac:"alt-left"},name:"moveToWordStartLeft"},{bindKey:{win:"ctrl-right",mac:"alt-right"},name:"moveToWordEndRight"},{bindKey:{win:"ctrl-shift-left",mac:"alt-shift-left"},name:"selectToWordStartLeft"},{bindKey:{win:"ctrl-shift-right",mac:"alt-shift-right"},name:"selectToWordEndRight"},{bindKey:{mac:"ctrl-alt-shift-right|ctrl-shift-right",win:"alt-shift-right"},name:"selectSubWordRight"},{bindKey:{mac:"ctrl-alt-shift-left|ctrl-shift-left",win:"alt-shift-left"},name:"selectSubWordLeft"},{bindKey:{mac:"ctrl-alt-right|ctrl-right",win:"alt-right"},name:"moveSubWordRight"},{bindKey:{mac:"ctrl-alt-left|ctrl-left",win:"alt-left"},name:"moveSubWordLeft"},{bindKey:{mac:"ctrl-m",win:"ctrl-m"},name:"jumptomatching",args:{to:"brackets"}},{bindKey:{mac:"ctrl-f6",win:"ctrl-f6"},name:"goToNextError"},{bindKey:{mac:"ctrl-shift-f6",win:"ctrl-shift-f6"},name:"goToPreviousError"},{bindKey:{mac:"ctrl-o"},name:"splitline"},{bindKey:{mac:"ctrl-shift-w",win:"alt-shift-w"},name:"surrowndWithTag"},{bindKey:{mac:"cmd-alt-.",win:"alt-."},name:"close_tag"},{bindKey:{mac:"cmd-j",win:"ctrl-j"},name:"joinlines"},{bindKey:{mac:"ctrl--",win:"alt--"},name:"jumpBack"},{bindKey:{mac:"ctrl-shift--",win:"alt-shift--"},name:"jumpForward"},{bindKey:{mac:"cmd-k cmd-l",win:"ctrl-k ctrl-l"},name:"tolowercase"},{bindKey:{mac:"cmd-k cmd-u",win:"ctrl-k ctrl-u"},name:"touppercase"},{bindKey:{mac:"cmd-shift-v",win:"ctrl-shift-v"},name:"paste_and_indent"},{bindKey:{mac:"cmd-k cmd-v|cmd-alt-v",win:"ctrl-k ctrl-v"},name:"paste_from_history"},{bindKey:{mac:"cmd-shift-enter",win:"ctrl-shift-enter"},name:"addLineBefore"},{bindKey:{mac:"cmd-enter",win:"ctrl-enter"},name:"addLineAfter"},{bindKey:{mac:"ctrl-shift-k",win:"ctrl-shift-k"},name:"removeline"},{bindKey:{mac:"ctrl-alt-up",win:"ctrl-up"},name:"scrollup"},{bindKey:{mac:"ctrl-alt-down",win:"ctrl-down"},name:"scrolldown"},{bindKey:{mac:"cmd-a",win:"ctrl-a"},name:"selectall"},{bindKey:{linux:"alt-shift-down",mac:"ctrl-shift-down",win:"ctrl-alt-down"},name:"addCursorBelow"},{bindKey:{linux:"alt-shift-up",mac:"ctrl-shift-up",win:"ctrl-alt-up"},name:"addCursorAbove"},{bindKey:{mac:"cmd-k cmd-c|ctrl-l",win:"ctrl-k ctrl-c"},name:"centerselection"},{bindKey:{mac:"f5",win:"f9"},name:"sortlines"},{bindKey:{mac:"ctrl-f5",win:"ctrl-f9"},name:"sortlines",args:{caseSensitive:!0}},{bindKey:{mac:"cmd-shift-l",win:"ctrl-shift-l"},name:"splitSelectionIntoLines"},{bindKey:{mac:"ctrl-cmd-down",win:"ctrl-shift-down"},name:"movelinesdown"},{bindKey:{mac:"ctrl-cmd-up",win:"ctrl-shift-up"},name:"movelinesup"},{bindKey:{mac:"alt-down",win:"alt-down"},name:"modifyNumberDown"},{bindKey:{mac:"alt-up",win:"alt-up"},name:"modifyNumberUp"},{bindKey:{mac:"cmd-/",win:"ctrl-/"},name:"togglecomment"},{bindKey:{mac:"cmd-alt-/",win:"ctrl-shift-/"},name:"toggleBlockComment"},{bindKey:{linux:"ctrl-alt-q",mac:"ctrl-q",win:"ctrl-q"},name:"togglerecording"},{bindKey:{linux:"ctrl-alt-shift-q",mac:"ctrl-shift-q",win:"ctrl-shift-q"},name:"replaymacro"},{bindKey:{mac:"ctrl-t",win:"ctrl-t"},name:"transpose"}].forEach(function(e){var n=t.handler.commands[e.name];n&&(n.bindKey=e.bindKey),t.handler.bindKey(e.bindKey,n||e.name)})}); (function() { 2 | ace.require(["ace/keyboard/sublime"], function(m) { 3 | if (typeof module == "object" && typeof exports == "object" && module) { 4 | module.exports = m; 5 | } 6 | }); 7 | })(); 8 | -------------------------------------------------------------------------------- /lib-ace/mode-python.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/mode/python_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text_highlight_rules").TextHighlightRules,s=function(){var e="and|as|assert|break|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|not|or|pass|print|raise|return|try|while|with|yield|async|await|nonlocal",t="True|False|None|NotImplemented|Ellipsis|__debug__",n="abs|divmod|input|open|staticmethod|all|enumerate|int|ord|str|any|eval|isinstance|pow|sum|basestring|execfile|issubclass|print|super|binfile|bin|iter|property|tuple|bool|filter|len|range|type|bytearray|float|list|raw_input|unichr|callable|format|locals|reduce|unicode|chr|frozenset|long|reload|vars|classmethod|getattr|map|repr|xrange|cmp|globals|max|reversed|zip|compile|hasattr|memoryview|round|__import__|complex|hash|min|apply|delattr|help|next|setattr|set|buffer|dict|hex|object|slice|coerce|dir|id|oct|sorted|intern|ascii|breakpoint|bytes",r=this.createKeywordMapper({"invalid.deprecated":"debugger","support.function":n,"variable.language":"self|cls","constant.language":t,keyword:e},"identifier"),i="[uU]?",s="[rR]",o="[fF]",u="(?:[rR][fF]|[fF][rR])",a="(?:(?:[1-9]\\d*)|(?:0))",f="(?:0[oO]?[0-7]+)",l="(?:0[xX][\\dA-Fa-f]+)",c="(?:0[bB][01]+)",h="(?:"+a+"|"+f+"|"+l+"|"+c+")",p="(?:[eE][+-]?\\d+)",d="(?:\\.\\d+)",v="(?:\\d+)",m="(?:(?:"+v+"?"+d+")|(?:"+v+"\\.))",g="(?:(?:"+m+"|"+v+")"+p+")",y="(?:"+g+"|"+m+")",b="\\\\(x[0-9A-Fa-f]{2}|[0-7]{3}|[\\\\abfnrtv'\"]|U[0-9A-Fa-f]{8}|u[0-9A-Fa-f]{4})";this.$rules={start:[{token:"comment",regex:"#.*$"},{token:"string",regex:i+'"{3}',next:"qqstring3"},{token:"string",regex:i+'"(?=.)',next:"qqstring"},{token:"string",regex:i+"'{3}",next:"qstring3"},{token:"string",regex:i+"'(?=.)",next:"qstring"},{token:"string",regex:s+'"{3}',next:"rawqqstring3"},{token:"string",regex:s+'"(?=.)',next:"rawqqstring"},{token:"string",regex:s+"'{3}",next:"rawqstring3"},{token:"string",regex:s+"'(?=.)",next:"rawqstring"},{token:"string",regex:o+'"{3}',next:"fqqstring3"},{token:"string",regex:o+'"(?=.)',next:"fqqstring"},{token:"string",regex:o+"'{3}",next:"fqstring3"},{token:"string",regex:o+"'(?=.)",next:"fqstring"},{token:"string",regex:u+'"{3}',next:"rfqqstring3"},{token:"string",regex:u+'"(?=.)',next:"rfqqstring"},{token:"string",regex:u+"'{3}",next:"rfqstring3"},{token:"string",regex:u+"'(?=.)",next:"rfqstring"},{token:"keyword.operator",regex:"\\+|\\-|\\*|\\*\\*|\\/|\\/\\/|%|@|<<|>>|&|\\||\\^|~|<|>|<=|=>|==|!=|<>|="},{token:"punctuation",regex:",|:|;|\\->|\\+=|\\-=|\\*=|\\/=|\\/\\/=|%=|@=|&=|\\|=|^=|>>=|<<=|\\*\\*="},{token:"paren.lparen",regex:"[\\[\\(\\{]"},{token:"paren.rparen",regex:"[\\]\\)\\}]"},{token:["keyword","text","entity.name.function"],regex:"(def|class)(\\s+)([\\u00BF-\\u1FFF\\u2C00-\\uD7FF\\w]+)"},{token:"text",regex:"\\s+"},{include:"constants"}],qqstring3:[{token:"constant.language.escape",regex:b},{token:"string",regex:'"{3}',next:"start"},{defaultToken:"string"}],qstring3:[{token:"constant.language.escape",regex:b},{token:"string",regex:"'{3}",next:"start"},{defaultToken:"string"}],qqstring:[{token:"constant.language.escape",regex:b},{token:"string",regex:"\\\\$",next:"qqstring"},{token:"string",regex:'"|$',next:"start"},{defaultToken:"string"}],qstring:[{token:"constant.language.escape",regex:b},{token:"string",regex:"\\\\$",next:"qstring"},{token:"string",regex:"'|$",next:"start"},{defaultToken:"string"}],rawqqstring3:[{token:"string",regex:'"{3}',next:"start"},{defaultToken:"string"}],rawqstring3:[{token:"string",regex:"'{3}",next:"start"},{defaultToken:"string"}],rawqqstring:[{token:"string",regex:"\\\\$",next:"rawqqstring"},{token:"string",regex:'"|$',next:"start"},{defaultToken:"string"}],rawqstring:[{token:"string",regex:"\\\\$",next:"rawqstring"},{token:"string",regex:"'|$",next:"start"},{defaultToken:"string"}],fqqstring3:[{token:"constant.language.escape",regex:b},{token:"string",regex:'"{3}',next:"start"},{token:"paren.lparen",regex:"{",push:"fqstringParRules"},{defaultToken:"string"}],fqstring3:[{token:"constant.language.escape",regex:b},{token:"string",regex:"'{3}",next:"start"},{token:"paren.lparen",regex:"{",push:"fqstringParRules"},{defaultToken:"string"}],fqqstring:[{token:"constant.language.escape",regex:b},{token:"string",regex:"\\\\$",next:"fqqstring"},{token:"string",regex:'"|$',next:"start"},{token:"paren.lparen",regex:"{",push:"fqstringParRules"},{defaultToken:"string"}],fqstring:[{token:"constant.language.escape",regex:b},{token:"string",regex:"'|$",next:"start"},{token:"paren.lparen",regex:"{",push:"fqstringParRules"},{defaultToken:"string"}],rfqqstring3:[{token:"string",regex:'"{3}',next:"start"},{token:"paren.lparen",regex:"{",push:"fqstringParRules"},{defaultToken:"string"}],rfqstring3:[{token:"string",regex:"'{3}",next:"start"},{token:"paren.lparen",regex:"{",push:"fqstringParRules"},{defaultToken:"string"}],rfqqstring:[{token:"string",regex:"\\\\$",next:"rfqqstring"},{token:"string",regex:'"|$',next:"start"},{token:"paren.lparen",regex:"{",push:"fqstringParRules"},{defaultToken:"string"}],rfqstring:[{token:"string",regex:"'|$",next:"start"},{token:"paren.lparen",regex:"{",push:"fqstringParRules"},{defaultToken:"string"}],fqstringParRules:[{token:"paren.lparen",regex:"[\\[\\(]"},{token:"paren.rparen",regex:"[\\]\\)]"},{token:"string",regex:"\\s+"},{token:"string",regex:"'[^']*'"},{token:"string",regex:'"[^"]*"'},{token:"function.support",regex:"(!s|!r|!a)"},{include:"constants"},{token:"paren.rparen",regex:"}",next:"pop"},{token:"paren.lparen",regex:"{",push:"fqstringParRules"}],constants:[{token:"constant.numeric",regex:"(?:"+y+"|\\d+)[jJ]\\b"},{token:"constant.numeric",regex:y},{token:"constant.numeric",regex:h+"[lL]\\b"},{token:"constant.numeric",regex:h+"\\b"},{token:["punctuation","function.support"],regex:"(\\.)([a-zA-Z_]+)\\b"},{token:r,regex:"[a-zA-Z_$][a-zA-Z0-9_$]*\\b"}]},this.normalizeRules()};r.inherits(s,i),t.PythonHighlightRules=s}),ace.define("ace/mode/folding/pythonic",["require","exports","module","ace/lib/oop","ace/mode/folding/fold_mode"],function(e,t,n){"use strict";var r=e("../../lib/oop"),i=e("./fold_mode").FoldMode,s=t.FoldMode=function(e){this.foldingStartMarker=new RegExp("([\\[{])(?:\\s*)$|("+e+")(?:\\s*)(?:#.*)?$")};r.inherits(s,i),function(){this.getFoldWidgetRange=function(e,t,n){var r=e.getLine(n),i=r.match(this.foldingStartMarker);if(i)return i[1]?this.openingBracketBlock(e,i[1],n,i.index):i[2]?this.indentationBlock(e,n,i.index+i[2].length):this.indentationBlock(e,n)}}.call(s.prototype)}),ace.define("ace/mode/python",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/python_highlight_rules","ace/mode/folding/pythonic","ace/range"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text").Mode,s=e("./python_highlight_rules").PythonHighlightRules,o=e("./folding/pythonic").FoldMode,u=e("../range").Range,a=function(){this.HighlightRules=s,this.foldingRules=new o("\\:"),this.$behaviour=this.$defaultBehaviour};r.inherits(a,i),function(){this.lineCommentStart="#",this.$pairQuotesAfter={"'":/[ruf]/i,'"':/[ruf]/i},this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t),i=this.getTokenizer().getLineTokens(t,e),s=i.tokens;if(s.length&&s[s.length-1].type=="comment")return r;if(e=="start"){var o=t.match(/^.*[\{\(\[:]\s*$/);o&&(r+=n)}return r};var e={pass:1,"return":1,raise:1,"break":1,"continue":1};this.checkOutdent=function(t,n,r){if(r!=="\r\n"&&r!=="\r"&&r!=="\n")return!1;var i=this.getTokenizer().getLineTokens(n.trim(),t).tokens;if(!i)return!1;do var s=i.pop();while(s&&(s.type=="comment"||s.type=="text"&&s.value.match(/^\s+$/)));return s?s.type=="keyword"&&e[s.value]:!1},this.autoOutdent=function(e,t,n){n+=1;var r=this.$getIndent(t.getLine(n)),i=t.getTabString();r.slice(-i.length)==i&&t.remove(new u(n,r.length-i.length,n,r.length))},this.$id="ace/mode/python",this.snippetFileId="ace/snippets/python"}.call(a.prototype),t.Mode=a}); (function() { 2 | ace.require(["ace/mode/python"], function(m) { 3 | if (typeof module == "object" && typeof exports == "object" && module) { 4 | module.exports = m; 5 | } 6 | }); 7 | })(); 8 | --------------------------------------------------------------------------------