72 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			72 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| 
								 | 
							
								from lnx.logicnode.lnx_nodes import *
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class RegularExpressionNode(LnxLogicTreeNode):
							 | 
						||
| 
								 | 
							
								    """
							 | 
						||
| 
								 | 
							
								    The first argument is a string with a regular expression pattern, the second one is a string with flags.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    @input RegExp Pattern: regular expression patterns such as
							 | 
						||
| 
								 | 
							
								        - `.`: any character
							 | 
						||
| 
								 | 
							
								        - `*`: repeat zero-or-more
							 | 
						||
| 
								 | 
							
								        - `+`: repeat one-or-more
							 | 
						||
| 
								 | 
							
								        - `?`: optional zero-or-one
							 | 
						||
| 
								 | 
							
								        - `[A-Z0-9]`: character ranges
							 | 
						||
| 
								 | 
							
								        - `[^\\r\\n\\t]`: character not-in-range
							 | 
						||
| 
								 | 
							
								        - `(...)`: parenthesis to match groups of characters
							 | 
						||
| 
								 | 
							
								        - `^`: beginning of the string (beginning of a line in multiline matching mode)
							 | 
						||
| 
								 | 
							
								        - `$`: end of the string (end of a line in multiline matching mode)
							 | 
						||
| 
								 | 
							
								        - `|`: "OR" statement.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    @input RegExp Flags: possible flags are the following
							 | 
						||
| 
								 | 
							
								        - `i`: case insensitive matching
							 | 
						||
| 
								 | 
							
								        - `g`: global replace or split, see below
							 | 
						||
| 
								 | 
							
								        - `m`: multiline matching, ^ and $ represent the beginning and end of a line
							 | 
						||
| 
								 | 
							
								        - `s`: the dot . will also match newlines (not supported by C# and JavaScript versions before ES2018)
							 | 
						||
| 
								 | 
							
								        - `u`: use UTF-8 matching (Neko and C++ targets only)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    @input String: String to match, split or replace
							 | 
						||
| 
								 | 
							
								    @input Replace: String to use when replace
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    @output Match: boolean result comparing the regular expression pattern with the string
							 | 
						||
| 
								 | 
							
								    @output Matched: array containing list of matched patterns
							 | 
						||
| 
								 | 
							
								    @output Split: array string of string splits using the pattern
							 | 
						||
| 
								 | 
							
								    @output Replace: new string with the pattern replaced
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    """
							 | 
						||
| 
								 | 
							
								    bl_idname = 'LNRegularExpressionNode'
							 | 
						||
| 
								 | 
							
								    bl_label = 'Regular Expression'
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    lnx_version = 1
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def remove_extra_inputs(self, context):
							 | 
						||
| 
								 | 
							
								        while len(self.outputs) > 0:
							 | 
						||
| 
								 | 
							
								            self.outputs.remove(self.outputs[-1])
							 | 
						||
| 
								 | 
							
								        if len(self.inputs) != 3:
							 | 
						||
| 
								 | 
							
								            self.inputs.remove(self.inputs[-1])
							 | 
						||
| 
								 | 
							
								        if self.property0 == 'Match':
							 | 
						||
| 
								 | 
							
								            self.add_output('LnxBoolSocket', 'Match')
							 | 
						||
| 
								 | 
							
								            self.add_output('LnxNodeSocketArray', 'Matched', is_var=False)
							 | 
						||
| 
								 | 
							
								        if self.property0 == 'Split':
							 | 
						||
| 
								 | 
							
								            self.add_output('LnxNodeSocketArray', 'Split', is_var=False)
							 | 
						||
| 
								 | 
							
								        if self.property0 == 'Replace':
							 | 
						||
| 
								 | 
							
								            self.add_input('LnxStringSocket', 'Replace')
							 | 
						||
| 
								 | 
							
								            self.add_output('LnxStringSocket', 'String')
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    property0: HaxeEnumProperty(
							 | 
						||
| 
								 | 
							
								        'property0',
							 | 
						||
| 
								 | 
							
								        items = [('Match', 'Match', 'A regular expression is used to compare a string. Use () in the pattern to retrieve Matched groups'),
							 | 
						||
| 
								 | 
							
								                ('Split', 'Split', 'A regular expression can also be used to split a string into several substrings'),
							 | 
						||
| 
								 | 
							
								                ('Replace', 'Replace', 'A regular expression can also be used to replace a part of the string')],
							 | 
						||
| 
								 | 
							
								        name='', default='Match', update=remove_extra_inputs)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def lnx_init(self, context):
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        self.add_input('LnxStringSocket', 'RegExp Pattern')
							 | 
						||
| 
								 | 
							
								        self.add_input('LnxStringSocket', 'RegExp Flags')
							 | 
						||
| 
								 | 
							
								        self.add_input('LnxStringSocket', 'String')
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        self.add_output('LnxBoolSocket', 'Match')
							 | 
						||
| 
								 | 
							
								        self.add_output('LnxNodeSocketArray', 'Matched', is_var=False)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def draw_buttons(self, context, layout):
							 | 
						||
| 
								 | 
							
								        layout.prop(self, 'property0')
							 |