diff --git a/src/Artemis.VisualScripting/Nodes/Text/StringContainsNode.cs b/src/Artemis.VisualScripting/Nodes/Text/StringContainsNode.cs new file mode 100644 index 000000000..71ea85f68 --- /dev/null +++ b/src/Artemis.VisualScripting/Nodes/Text/StringContainsNode.cs @@ -0,0 +1,32 @@ +using Artemis.Core; + +namespace Artemis.VisualScripting.Nodes.Text; + +[Node("Contains", "Checks whether the first input is contained in the second input.", "Text", InputType = typeof(string), OutputType = typeof(bool))] +public class StringContainsNode : Node +{ + public StringContainsNode() + : base("Contains", "Checks whether the first input is contained in the second input.") + { + Input1 = CreateInputPin(); + Input2 = CreateInputPin(); + Result = CreateOutputPin(); + } + + public InputPin Input1 { get; } + public InputPin Input2 { get; } + + public OutputPin Result { get; } + + public override void Evaluate() + { + if (Input1.Value == null && Input2.Value == null) + Result.Value = false; + else if (Input1.Value == null && Input2.Value != null) + Result.Value = false; + else if (Input1.Value != null && Input2.Value == null) + Result.Value = true; + else if (Input1.Value != null && Input2.Value != null) + Result.Value = Input1.Value.Contains(Input2.Value, StringComparison.InvariantCultureIgnoreCase); + } +} \ No newline at end of file diff --git a/src/Artemis.VisualScripting/Nodes/Text/StringRegexMatchNode.cs b/src/Artemis.VisualScripting/Nodes/Text/StringRegexMatchNode.cs new file mode 100644 index 000000000..c3c1d1a8b --- /dev/null +++ b/src/Artemis.VisualScripting/Nodes/Text/StringRegexMatchNode.cs @@ -0,0 +1,51 @@ +using System.Text.RegularExpressions; +using Artemis.Core; + +namespace Artemis.VisualScripting.Nodes.Text; + +[Node("Regex Match", "Checks provided regex pattern matches the input.", "Text", InputType = typeof(string), OutputType = typeof(bool))] +public class StringRegexMatchNode : Node +{ + private string? _lastPattern; + private Regex? _regex; + private bool _broken; + + public StringRegexMatchNode() : base("Regex Match", "Checks provided regex pattern matches the input.") + { + Pattern = CreateInputPin("Pattern"); + Input = CreateInputPin("Input"); + Result = CreateOutputPin(); + } + + public InputPin Pattern { get; } + public InputPin Input { get; } + public OutputPin Result { get; } + + public override void Evaluate() + { + if (Input.Value == null || Pattern.Value == null) + return; + if (_broken && _lastPattern == Pattern.Value) + return; + + if (_regex == null || _lastPattern != Pattern.Value) + { + try + { + _regex = new Regex(Pattern.Value, RegexOptions.Compiled); + _broken = false; + } + catch (Exception) + { + _broken = true; + return; + } + finally + { + _lastPattern = Pattern.Value; + } + } + + Result.Value = _regex.IsMatch(Input.Value); + } +} \ No newline at end of file