From 8a6a3a8eef6985f721659a6934b6725afc6fef91 Mon Sep 17 00:00:00 2001 From: Hugo Locurcio Date: Tue, 17 Jan 2023 21:38:33 +0100 Subject: [PATCH] Improve Regular Expressions (RegEx) demo (#821) Co-authored-by: Cykyrios --- gui/regex/README.md | 4 +- gui/regex/icon.png | Bin 1536 -> 1493 bytes gui/regex/icon.png.import | 29 ++++++----- gui/regex/project.godot | 9 +++- gui/regex/regex.gd | 41 ++++++++++++---- gui/regex/regex.tscn | 80 +++++++++++++++++++++++-------- gui/regex/screenshots/regex.png | Bin 3780 -> 0 bytes gui/regex/screenshots/regex.webp | Bin 0 -> 22234 bytes 8 files changed, 116 insertions(+), 47 deletions(-) delete mode 100644 gui/regex/screenshots/regex.png create mode 100644 gui/regex/screenshots/regex.webp diff --git a/gui/regex/README.md b/gui/regex/README.md index c953a8d1..1772dd85 100644 --- a/gui/regex/README.md +++ b/gui/regex/README.md @@ -5,10 +5,10 @@ Can also serve as a playground for regex testing. Language: GDScript -Renderer: GLES 2 +Renderer: Compatibility Check out this demo on the asset library: https://godotengine.org/asset-library/asset/149 ## Screenshots -![Screenshot](screenshots/regex.png) +![Screenshot](screenshots/regex.webp) diff --git a/gui/regex/icon.png b/gui/regex/icon.png index 5327f5e6fea2074cd1afbca3ee213eb107180e46..49128a60d2743f16cf9a47fe6cf2bba240077c7e 100644 GIT binary patch literal 1493 zcmV;`1uFW9P)z{glIUB&~Zv(g=nvWf4M*u#Qv=LbS7Qi-rx4OR8nRQ2~H=65!EDCf4Fu zfWfc$wio8Td>9!k!{0Z3t49D_P$95F8=?TNY$<_7p zo~=3cRmJ{O@E|zPS{w^-uaQf)q08s6hN&`~?@l)27#jp=4KIxj$nSWdfE41EP91BpGN4|@B;oF$Q?11Xopbj{xYQUr2(E-~7nFYowNPp9j@@AR^ zU}y}S?y#{h16ZOKYjF&K)!RB`4WL%noTRNUg>sz(QeJdL1*D9ghvvZ)tSrC{%_FU+ zt!}aqz-MneC*Wgku?BclixoZ39Hyuw8sLkt3kqk}%m&aP7n`*z*SHDLKM@z;3$3>X z990%p?3EjML&u^4+U^5f8BUoEIHyu@J8`E1bot@}xV6U`kpB*Lx#1>&p^<0+yV-yi zBghD0KDk626Sp8uu&ZV zoAen_q)?ve5NhfQLobY z043q`)|fjRus1h@**S76RSQr2nb>9i^oaNXoC&$C5g$O>$m}8?Mjoxfj#Jac@dDC3 zE^EXC$ocTY4|ADa+OOA@Qn3s>sHr4gKpa_sKh6)6!~_14P=G1;+usva1d#iegk=JL ztt>x5S%Acq1SJ2Wu>nay5|9KW0ZG7jiqy?rmGDaK)W#UsZ;2nkp(|I~)OqE~i9`W_ zE!qQcSH=Gsz>a?z;Py^Gth$U9 zv2^E)=`7f+Q<&Yma_Dq$BAuhUfAHc&z6n?>uanenwH_Kb%Hfv!>N^59AoP6SabxDE z=53wY11mIo=!&k-0k{MO>VYP$g{|7kX{`pY%CW0g6?au(Jp}7NFgmkfjhdiLHz^8_ zX5jeN2IxJwqMPuV9>9p2q(l!`Xmnwgeqvy1CM*vdTSAL4VJ1$Ns2!vV*%6*AO8u6lo6Yp+(t29yJSKLliUAHFvhZqRPb zF6!R$@@9Ep#h{E@2Rk*bNtd~$S&(ho3#_&QKH!K}K)O1pRHWUp0VNh-H0*KzS_N#- znujxs0dNF@sc=~y!12M5HnUUh>(u6iChc|qS`A<5G_c(Uy!dB8o_gKCmG}FA%le#1 znZYa5kBI<6eg_#7@{k6&Rck&88+8&^s{ykT4Wz=u=m18h^0Au}kncCH9;@$I1~eI3 zO(d^w9`5@MaR1@){ayOh1Y`_`YjC#7d*a;VLvT-B=fCmA0DKbmHympkb^bnpq8onW z#jQNxZ3Q!lRN$TRoqJ6lw)F>tT^ld~R2xqhl67v}`0<+>Sa>}cXsV6@VENa<>9Iz~ zD}5Nfp(}~~G`yvE5(rpa`&jo#Aix#yU(EWY-8vWo0000OYhN=Z*XJVQ1#JlNRS zVqs@@c6ySLlyh-*e0zU=e1JnjNuHgcs;R5LzQB8WepORiFD*67%FET&)md0xOiEG4 z#>d*)+E`azjf{}Y%*`?|H$FW?i;9j`Ra-PNIzc~1OiWBXJ3mWHPF7V|Nk~jsS6jlu z!i0l{e|~|3f`rV>%+}V|oSU6JJU~xQQnInL!otI4WM`(Pr?a!PU0q;TR$5wFUAeis z$;rxeb9QTLZN$XIzrVm=Ut)=gi_+55N=Z#!TwlS#!lR?4$j8W_pP@)cN?~AQY;0~n zK0-xANPc~P)YR2RMM!FDY~9`6Mny@Gkdi_{MS6LBK|n-%dVP_Ql2K4pZ*OwV&CQyb zn{I7zyu7_)VPr^0OKNFsK0QIv(9w8zdc?%Uh=++oLPkJ8L)qEcL_&vXlt9Aob0hCSpWb6`bk7VRCwCdlLN2gQ5;0?o@cYR z?RIV3w$1M!?49J+ZPe(UWG3?qPWd-8b7)2kGjad~bMx~HI9Qxt8W$|DtSZw5YY5gi zHn-SbVrLhJ*1BPD9~+O?=kqTEfuJivC@cYy){485G#Pa+S;1Xj})?fZ)br>gFwk1fJV>xO?yZ1GF&n52@O~qvR&y z@sl-IJ;BpwtUd1uD85M5AHRHsmKB6~Z3A!K0%&wx^#l$l;N5$7Y3UuDwt?CQ1l&3Q z(bW{erx)(hGM_Jl!k4e0?*P7KQ0bT?`1t*YyR^)kpP;a@5Be40ZXA`4NrE3&mffXg zKK%NPGQgwTe_Txz`2XV2GWa)9CLzJtv+ytZzuj^`mLm$IaBx=<>?L+mu3kZOi@|xe zZQHhOjcv!tDl&gp?7T6)cK4~Tb@lYqk+?^7;hDJnBR|xIFlY~aZxemyxsODHAoN`u zeB=ZYSR(#T5=+Jpq@;?1G+zbqgCIR4GbKm>%HjyBK1kEk2_uAU?nmanXx_f&2(4PXLsefRwH))6u4~(28!6+ZYr&Rm+ zM9bv8FM>p1s%HA)3~+UJZhiraOCXlBvBFvhR%_PQ6G@P}0enhr_O1ab-wJMRZ8KsA zyL10vfa%nu43 diff --git a/gui/regex/icon.png.import b/gui/regex/icon.png.import index 889af9df..6eb5c949 100644 --- a/gui/regex/icon.png.import +++ b/gui/regex/icon.png.import @@ -1,8 +1,9 @@ [remap] importer="texture" -type="StreamTexture2D" -path="res://.godot/imported/icon.png-487276ed1e3a0c39cad0279d744ee560.stex" +type="CompressedTexture2D" +uid="uid://bogy8x2ym0p20" +path="res://.godot/imported/icon.png-487276ed1e3a0c39cad0279d744ee560.ctex" metadata={ "vram_texture": false } @@ -10,26 +11,24 @@ metadata={ [deps] source_file="res://icon.png" -dest_files=["res://.godot/imported/icon.png-487276ed1e3a0c39cad0279d744ee560.stex"] +dest_files=["res://.godot/imported/icon.png-487276ed1e3a0c39cad0279d744ee560.ctex"] [params] compress/mode=0 compress/lossy_quality=0.7 -compress/hdr_mode=0 +compress/hdr_compression=1 compress/bptc_ldr=0 compress/normal_map=0 -flags/repeat=0 -flags/filter=true -flags/mipmaps=false -flags/anisotropic=false -flags/srgb=2 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" process/fix_alpha_border=true process/premult_alpha=false -process/HDR_as_SRGB=false -process/invert_color=false process/normal_map_invert_y=false -stream=false -size_limit=0 -detect_3d=true -svg/scale=1.0 +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/gui/regex/project.godot b/gui/regex/project.godot index 40838940..186a4c7c 100644 --- a/gui/regex/project.godot +++ b/gui/regex/project.godot @@ -6,7 +6,7 @@ ; [section] ; section goes between [] ; param=value ; assign values to parameters -config_version=4 +config_version=5 [application] @@ -14,9 +14,16 @@ config/name="RegEx (Regular Expressions)" config/description="A demo showing regex functionality and usage. Can also serve as a playground for regex testing." run/main_scene="res://regex.tscn" +config/features=PackedStringArray("4.0") config/icon="res://icon.png" [display] window/stretch/mode="canvas_items" window/stretch/aspect="expand" + +[rendering] + +renderer/rendering_method="gl_compatibility" +renderer/rendering_method.mobile="gl_compatibility" +environment/defaults/default_clear_color=Color(0.266667, 0.266667, 0.266667, 1) diff --git a/gui/regex/regex.gd b/gui/regex/regex.gd index ed1b6fd2..d25fbdd5 100644 --- a/gui/regex/regex.gd +++ b/gui/regex/regex.gd @@ -3,8 +3,8 @@ extends VBoxContainer var regex = RegEx.new() func _ready(): - $Text.set_text("They asked me \"What's going on \\\"in the manor\\\"?\"") - update_expression($Expression.text) + %Text.set_text("They asked me \"What's going on \\\"in the manor\\\"?\"") + update_expression(%Expression.text) func update_expression(text): @@ -13,12 +13,35 @@ func update_expression(text): func update_text(): - for child in $List.get_children(): + for child in %List.get_children(): child.queue_free() if regex.is_valid(): - var matches = regex.search($Text.get_text()) - if matches != null: - for result in matches.get_strings(): - var label = Label.new() - label.text = result - $List.add_child(label) + $HBoxContainer.modulate = Color.WHITE + var matches = regex.search_all(%Text.get_text()) + if matches.size() >= 1: + # List all matches and their respective captures. + var match_number = 0 + for regex_match in matches: + match_number += 1 + # `match` is a reserved GDScript keyword. + var match_label = Label.new() + match_label.text = "RegEx match #%d:" % match_number + match_label.modulate = Color(0.6, 0.9, 1.0) + %List.add_child(match_label) + + var capture_number = 0 + for result in regex_match.get_strings(): + capture_number += 1 + var capture_label = Label.new() + capture_label.text = " Capture group #%d: %s" % [capture_number, result] + %List.add_child(capture_label) + else: + $HBoxContainer.modulate = Color(1, 0.2, 0.1) + var label = Label.new() + label.text = "Error: Invalid regular expression. Check if the expression is correctly escaped and terminated." + %List.add_child(label) + + +func _on_help_meta_clicked(_meta): + # Workaround for clickable link doing nothing when clicked. + OS.shell_open("https://regexr.com") diff --git a/gui/regex/regex.tscn b/gui/regex/regex.tscn index 3c67900d..0ea0e00e 100644 --- a/gui/regex/regex.tscn +++ b/gui/regex/regex.tscn @@ -1,34 +1,74 @@ -[gd_scene load_steps=2 format=2] +[gd_scene load_steps=2 format=3 uid="uid://cimp70l7c0y2p"] -[ext_resource path="res://regex.gd" type="Script" id=1] +[ext_resource type="Script" path="res://regex.gd" id="1"] [node name="Regex" type="VBoxContainer"] +anchors_preset = 15 anchor_right = 1.0 anchor_bottom = 1.0 offset_left = 14.0 offset_top = 20.0 offset_right = -14.0 offset_bottom = -20.0 -script = ExtResource( 1 ) -__meta__ = { -"_edit_use_anchors_": false -} +grow_horizontal = 2 +grow_vertical = 2 +theme_override_constants/separation = 10 +script = ExtResource("1") -[node name="Expression" type="LineEdit" parent="."] -offset_right = 996.0 -offset_bottom = 24.0 +[node name="Help" type="RichTextLabel" parent="."] +modulate = Color(1, 1, 1, 0.752941) +custom_minimum_size = Vector2(0, 50) +layout_mode = 2 +bbcode_enabled = true +text = "Regular expressions (RegEx) can be used for advanced text matching. +You can use [url=https://regexr.com]RegExr[/url] to test regular expressions online and compare results." + +[node name="HBoxContainer" type="HBoxContainer" parent="."] +layout_mode = 2 +theme_override_constants/separation = 10 + +[node name="Label" type="Label" parent="HBoxContainer"] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 5 +size_flags_stretch_ratio = 0.08 +text = "RegEx" +horizontal_alignment = 2 + +[node name="Expression" type="LineEdit" parent="HBoxContainer"] +unique_name_in_owner = true +layout_mode = 2 +size_flags_horizontal = 3 text = "\"((?:\\\\.|[^\"])*)\"" +placeholder_text = "Regular expression to match against" -[node name="Text" type="TextEdit" parent="."] -offset_top = 28.0 -offset_right = 996.0 -offset_bottom = 328.0 -rect_min_size = Vector2(0, 300) +[node name="HBoxContainer2" type="HBoxContainer" parent="."] +layout_mode = 2 +theme_override_constants/separation = 10 -[node name="List" type="VBoxContainer" parent="."] -offset_top = 332.0 -offset_right = 996.0 -offset_bottom = 332.0 +[node name="Label" type="Label" parent="HBoxContainer2"] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 5 +size_flags_stretch_ratio = 0.08 +text = "Text" +horizontal_alignment = 2 -[connection signal="text_changed" from="Expression" to="." method="update_expression"] -[connection signal="text_changed" from="Text" to="." method="update_text"] +[node name="Text" type="TextEdit" parent="HBoxContainer2"] +unique_name_in_owner = true +custom_minimum_size = Vector2(0, 200) +layout_mode = 2 +size_flags_horizontal = 3 +placeholder_text = "Text to search in" + +[node name="ScrollContainer" type="ScrollContainer" parent="."] +layout_mode = 2 +size_flags_vertical = 3 + +[node name="List" type="VBoxContainer" parent="ScrollContainer"] +unique_name_in_owner = true +layout_mode = 2 + +[connection signal="meta_clicked" from="Help" to="." method="_on_help_meta_clicked"] +[connection signal="text_changed" from="HBoxContainer/Expression" to="." method="update_expression"] +[connection signal="text_changed" from="HBoxContainer2/Text" to="." method="update_text"] diff --git a/gui/regex/screenshots/regex.png b/gui/regex/screenshots/regex.png deleted file mode 100644 index 17930bfaefd92697b0fd88998f4dd9af74105204..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3780 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 diff --git a/gui/regex/screenshots/regex.webp b/gui/regex/screenshots/regex.webp new file mode 100644 index 0000000000000000000000000000000000000000..0e81add241e5dded66c24595604a029cdcdeb28c GIT binary patch literal 22234 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 literal 0 HcmV?d00001