From 441c9210296a3efab24c5e2b9cd22557d7ae48df Mon Sep 17 00:00:00 2001 From: Face <69168154+face-hh@users.noreply.github.com> Date: Tue, 22 Jul 2025 21:15:57 +0300 Subject: [PATCH] group inline text tags, new tag - span --- Scenes/Styles/BrowserText.tres | 3 +- Scenes/Tags/bold.tscn | 23 ---------- Scenes/Tags/h1.tscn | 0 Scenes/Tags/italic.tscn | 22 ---------- Scenes/Tags/mark.tscn | 22 ---------- Scenes/Tags/p.tscn | 1 - Scenes/Tags/small.tscn | 22 ---------- Scenes/Tags/{code.tscn => span.tscn} | 13 +++--- Scenes/Tags/underline.tscn | 22 ---------- Scripts/B9/HTMLParser.gd | 43 ++++++++++++++++++- Scripts/Tags/bold.gd | 5 --- Scripts/Tags/bold.gd.uid | 1 - Scripts/Tags/code.gd | 5 --- Scripts/Tags/code.gd.uid | 1 - Scripts/Tags/italic.gd | 5 --- Scripts/Tags/italic.gd.uid | 1 - Scripts/Tags/mark.gd | 5 --- Scripts/Tags/mark.gd.uid | 1 - Scripts/Tags/p.gd | 2 +- Scripts/Tags/small.gd | 5 --- Scripts/Tags/small.gd.uid | 1 - Scripts/Tags/span.gd | 5 +++ Scripts/Tags/span.gd.uid | 1 + Scripts/Tags/underline.gd | 5 --- Scripts/Tags/underline.gd.uid | 1 - Scripts/main.gd | 64 +++++++++++++--------------- 26 files changed, 86 insertions(+), 193 deletions(-) delete mode 100644 Scenes/Tags/bold.tscn delete mode 100644 Scenes/Tags/h1.tscn delete mode 100644 Scenes/Tags/italic.tscn delete mode 100644 Scenes/Tags/mark.tscn delete mode 100644 Scenes/Tags/small.tscn rename Scenes/Tags/{code.tscn => span.tscn} (54%) delete mode 100644 Scenes/Tags/underline.tscn delete mode 100644 Scripts/Tags/bold.gd delete mode 100644 Scripts/Tags/bold.gd.uid delete mode 100644 Scripts/Tags/code.gd delete mode 100644 Scripts/Tags/code.gd.uid delete mode 100644 Scripts/Tags/italic.gd delete mode 100644 Scripts/Tags/italic.gd.uid delete mode 100644 Scripts/Tags/mark.gd delete mode 100644 Scripts/Tags/mark.gd.uid delete mode 100644 Scripts/Tags/small.gd delete mode 100644 Scripts/Tags/small.gd.uid create mode 100644 Scripts/Tags/span.gd create mode 100644 Scripts/Tags/span.gd.uid delete mode 100644 Scripts/Tags/underline.gd delete mode 100644 Scripts/Tags/underline.gd.uid diff --git a/Scenes/Styles/BrowserText.tres b/Scenes/Styles/BrowserText.tres index 4580c8a..6f49502 100644 --- a/Scenes/Styles/BrowserText.tres +++ b/Scenes/Styles/BrowserText.tres @@ -14,7 +14,8 @@ font_names = PackedStringArray("Serif") font_italic = true [sub_resource type="SystemFont" id="SystemFont_u0shw"] -font_names = PackedStringArray("Monospace") +font_names = PackedStringArray("Consolas") +oversampling = 2.0 [sub_resource type="SystemFont" id="SystemFont_g4dwp"] font_names = PackedStringArray("Serif") diff --git a/Scenes/Tags/bold.tscn b/Scenes/Tags/bold.tscn deleted file mode 100644 index 2101c2c..0000000 --- a/Scenes/Tags/bold.tscn +++ /dev/null @@ -1,23 +0,0 @@ -[gd_scene load_steps=3 format=3 uid="uid://ijrbim6j8e36"] - -[ext_resource type="Script" uid="uid://chdftsciuecfk" path="res://Scripts/Tags/bold.gd" id="1_04sgx"] -[ext_resource type="Theme" uid="uid://bn6rbmdy60lhr" path="res://Scenes/Styles/BrowserText.tres" id="1_mtsji"] - -[node name="BOLD" type="VBoxContainer"] -anchors_preset = 10 -anchor_right = 1.0 -grow_horizontal = 2 -theme = ExtResource("1_mtsji") -script = ExtResource("1_04sgx") - -[node name="RichTextLabel" type="RichTextLabel" parent="."] -layout_mode = 2 -size_flags_horizontal = 3 -focus_mode = 2 -mouse_default_cursor_shape = 1 -theme = ExtResource("1_mtsji") -theme_override_colors/default_color = Color(0, 0, 0, 1) -bbcode_enabled = true -text = "What the sigma" -fit_content = true -selection_enabled = true diff --git a/Scenes/Tags/h1.tscn b/Scenes/Tags/h1.tscn deleted file mode 100644 index e69de29..0000000 diff --git a/Scenes/Tags/italic.tscn b/Scenes/Tags/italic.tscn deleted file mode 100644 index 0de7c4f..0000000 --- a/Scenes/Tags/italic.tscn +++ /dev/null @@ -1,22 +0,0 @@ -[gd_scene load_steps=3 format=3 uid="uid://bdw0ahhesgnvr"] - -[ext_resource type="Script" uid="uid://bamty87whxwxi" path="res://Scripts/Tags/italic.gd" id="1_ch1cm"] -[ext_resource type="Theme" uid="uid://bn6rbmdy60lhr" path="res://Scenes/Styles/BrowserText.tres" id="1_vh1cg"] - -[node name="ITALIC" type="VBoxContainer"] -anchors_preset = 10 -anchor_right = 1.0 -grow_horizontal = 2 -theme = ExtResource("1_vh1cg") -script = ExtResource("1_ch1cm") - -[node name="RichTextLabel" type="RichTextLabel" parent="."] -layout_mode = 2 -size_flags_horizontal = 3 -focus_mode = 2 -mouse_default_cursor_shape = 1 -theme_override_colors/default_color = Color(0, 0, 0, 1) -bbcode_enabled = true -text = "What the sigma" -fit_content = true -selection_enabled = true diff --git a/Scenes/Tags/mark.tscn b/Scenes/Tags/mark.tscn deleted file mode 100644 index f59d724..0000000 --- a/Scenes/Tags/mark.tscn +++ /dev/null @@ -1,22 +0,0 @@ -[gd_scene load_steps=3 format=3 uid="uid://dlj64k35igexw"] - -[ext_resource type="Script" uid="uid://c2i8dwyyuufff" path="res://Scripts/Tags/mark.gd" id="1_j8rvb"] -[ext_resource type="Theme" uid="uid://bn6rbmdy60lhr" path="res://Scenes/Styles/BrowserText.tres" id="1_jr508"] - -[node name="MARK" type="VBoxContainer"] -anchors_preset = 10 -anchor_right = 1.0 -grow_horizontal = 2 -theme = ExtResource("1_jr508") -script = ExtResource("1_j8rvb") - -[node name="RichTextLabel" type="RichTextLabel" parent="."] -layout_mode = 2 -size_flags_horizontal = 3 -focus_mode = 2 -mouse_default_cursor_shape = 1 -theme_override_colors/default_color = Color(0, 0, 0, 1) -bbcode_enabled = true -text = "What the sigma" -fit_content = true -selection_enabled = true diff --git a/Scenes/Tags/p.tscn b/Scenes/Tags/p.tscn index 576101c..b4c94d4 100644 --- a/Scenes/Tags/p.tscn +++ b/Scenes/Tags/p.tscn @@ -17,6 +17,5 @@ mouse_default_cursor_shape = 1 theme = ExtResource("2_1glvj") theme_override_colors/default_color = Color(0, 0, 0, 1) bbcode_enabled = true -text = "What the sigma" fit_content = true selection_enabled = true diff --git a/Scenes/Tags/small.tscn b/Scenes/Tags/small.tscn deleted file mode 100644 index 03a490a..0000000 --- a/Scenes/Tags/small.tscn +++ /dev/null @@ -1,22 +0,0 @@ -[gd_scene load_steps=3 format=3 uid="uid://btiiex1eu1krs"] - -[ext_resource type="Script" uid="uid://xr7n1lat501x" path="res://Scripts/Tags/small.gd" id="1_5vt6h"] -[ext_resource type="Theme" uid="uid://bn6rbmdy60lhr" path="res://Scenes/Styles/BrowserText.tres" id="1_yi3vu"] - -[node name="SMALL" type="VBoxContainer"] -anchors_preset = 10 -anchor_right = 1.0 -grow_horizontal = 2 -theme = ExtResource("1_yi3vu") -script = ExtResource("1_5vt6h") - -[node name="RichTextLabel" type="RichTextLabel" parent="."] -layout_mode = 2 -size_flags_horizontal = 3 -focus_mode = 2 -mouse_default_cursor_shape = 1 -theme_override_colors/default_color = Color(0, 0, 0, 1) -bbcode_enabled = true -text = "What the sigma" -fit_content = true -selection_enabled = true diff --git a/Scenes/Tags/code.tscn b/Scenes/Tags/span.tscn similarity index 54% rename from Scenes/Tags/code.tscn rename to Scenes/Tags/span.tscn index 5e2cab9..259b813 100644 --- a/Scenes/Tags/code.tscn +++ b/Scenes/Tags/span.tscn @@ -1,22 +1,21 @@ -[gd_scene load_steps=3 format=3 uid="uid://i5otagppegeo"] +[gd_scene load_steps=3 format=3 uid="uid://bkj3x5y2m8qrl"] -[ext_resource type="Script" uid="uid://c3dnmqsnj0akr" path="res://Scripts/Tags/code.gd" id="1_g4dwp"] -[ext_resource type="Theme" uid="uid://bn6rbmdy60lhr" path="res://Scenes/Styles/BrowserText.tres" id="2_u0shw"] +[ext_resource type="Script" uid="uid://cjk4x6y8m9wts" path="res://Scripts/Tags/span.gd" id="1_span"] +[ext_resource type="Theme" uid="uid://bn6rbmdy60lhr" path="res://Scenes/Styles/BrowserText.tres" id="2_theme"] -[node name="CODE" type="VBoxContainer"] +[node name="SPAN" type="VBoxContainer"] anchors_preset = 10 anchor_right = 1.0 grow_horizontal = 2 -script = ExtResource("1_g4dwp") +script = ExtResource("1_span") [node name="RichTextLabel" type="RichTextLabel" parent="."] layout_mode = 2 size_flags_horizontal = 3 focus_mode = 2 mouse_default_cursor_shape = 1 -theme = ExtResource("2_u0shw") +theme = ExtResource("2_theme") theme_override_colors/default_color = Color(0, 0, 0, 1) bbcode_enabled = true -text = "What the sigma" fit_content = true selection_enabled = true diff --git a/Scenes/Tags/underline.tscn b/Scenes/Tags/underline.tscn deleted file mode 100644 index dfaa164..0000000 --- a/Scenes/Tags/underline.tscn +++ /dev/null @@ -1,22 +0,0 @@ -[gd_scene load_steps=3 format=3 uid="uid://br7ys1wgsp5om"] - -[ext_resource type="Script" uid="uid://x0hphtm8kf12" path="res://Scripts/Tags/underline.gd" id="1_7hb8m"] -[ext_resource type="Theme" uid="uid://bn6rbmdy60lhr" path="res://Scenes/Styles/BrowserText.tres" id="1_xp1ft"] - -[node name="UNDERLINE" type="VBoxContainer"] -anchors_preset = 10 -anchor_right = 1.0 -grow_horizontal = 2 -theme = ExtResource("1_xp1ft") -script = ExtResource("1_7hb8m") - -[node name="RichTextLabel" type="RichTextLabel" parent="."] -layout_mode = 2 -size_flags_horizontal = 3 -focus_mode = 2 -mouse_default_cursor_shape = 1 -theme_override_colors/default_color = Color(0, 0, 0, 1) -bbcode_enabled = true -text = "What the sigma" -fit_content = true -selection_enabled = true diff --git a/Scripts/B9/HTMLParser.gd b/Scripts/B9/HTMLParser.gd index 447dac6..558abea 100644 --- a/Scripts/B9/HTMLParser.gd +++ b/Scripts/B9/HTMLParser.gd @@ -25,7 +25,6 @@ class HTMLElement: return get_attribute("id") func get_collapsed_text() -> String: - # Collapse whitespace: replace multiple spaces, tabs, newlines with single space var collapsed = text_content.strip_edges() # Replace multiple whitespace characters with single space var regex = RegEx.new() @@ -33,8 +32,48 @@ class HTMLElement: return regex.sub(collapsed, " ", true) func get_preserved_text() -> String: - # For pre tags - preserve all whitespace return text_content + + func get_bbcode_formatted_text() -> String: + var result = "" + var has_previous_content = false + + if text_content.length() > 0: + result += get_collapsed_text() + has_previous_content = true + + for child in children: + var child_content = "" + match child.tag_name: + "b": + child_content = "[b]" + child.get_bbcode_formatted_text() + "[/b]" + "i": + child_content = "[i]" + child.get_bbcode_formatted_text() + "[/i]" + "u": + child_content = "[u]" + child.get_bbcode_formatted_text() + "[/u]" + "small": + child_content = "[font_size=20]" + child.get_bbcode_formatted_text() + "[/font_size]" + "mark": + child_content = "[bgcolor=#FFFF00]" + child.get_bbcode_formatted_text() + "[/bgcolor]" + "code": + child_content = "[font_size=20][code]" + child.get_bbcode_formatted_text() + "[/code][/font_size]" + "span": + child_content = child.get_bbcode_formatted_text() + _: + child_content = child.get_bbcode_formatted_text() + + if has_previous_content and child_content.length() > 0: + result += " " + + result += child_content + + if child_content.length() > 0: + has_previous_content = true + + return result + + func is_inline_element() -> bool: + return tag_name in ["b", "i", "u", "small", "mark", "code", "span"] class ParseResult: var root: HTMLElement diff --git a/Scripts/Tags/bold.gd b/Scripts/Tags/bold.gd deleted file mode 100644 index b7c7403..0000000 --- a/Scripts/Tags/bold.gd +++ /dev/null @@ -1,5 +0,0 @@ -extends VBoxContainer - -func init(element: HTMLParser.HTMLElement) -> void: - var label: RichTextLabel = $RichTextLabel - label.text = "[font_size=24][b]%s[/b][/font_size]" % element.get_collapsed_text() diff --git a/Scripts/Tags/bold.gd.uid b/Scripts/Tags/bold.gd.uid deleted file mode 100644 index 9fb8059..0000000 --- a/Scripts/Tags/bold.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://chdftsciuecfk diff --git a/Scripts/Tags/code.gd b/Scripts/Tags/code.gd deleted file mode 100644 index 670d888..0000000 --- a/Scripts/Tags/code.gd +++ /dev/null @@ -1,5 +0,0 @@ -extends VBoxContainer - -func init(element: HTMLParser.HTMLElement) -> void: - var label: RichTextLabel = $RichTextLabel - label.text = "[font_size=20][code]%s[/code][/font_size]" % element.get_collapsed_text() diff --git a/Scripts/Tags/code.gd.uid b/Scripts/Tags/code.gd.uid deleted file mode 100644 index 2d000d1..0000000 --- a/Scripts/Tags/code.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://c3dnmqsnj0akr diff --git a/Scripts/Tags/italic.gd b/Scripts/Tags/italic.gd deleted file mode 100644 index 68f5577..0000000 --- a/Scripts/Tags/italic.gd +++ /dev/null @@ -1,5 +0,0 @@ -extends VBoxContainer - -func init(element: HTMLParser.HTMLElement) -> void: - var label: RichTextLabel = $RichTextLabel - label.text = "[font_size=24][i]%s[/i][/font_size]" % element.get_collapsed_text() diff --git a/Scripts/Tags/italic.gd.uid b/Scripts/Tags/italic.gd.uid deleted file mode 100644 index ca360bd..0000000 --- a/Scripts/Tags/italic.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://bamty87whxwxi diff --git a/Scripts/Tags/mark.gd b/Scripts/Tags/mark.gd deleted file mode 100644 index c6e3e1c..0000000 --- a/Scripts/Tags/mark.gd +++ /dev/null @@ -1,5 +0,0 @@ -extends VBoxContainer - -func init(element: HTMLParser.HTMLElement) -> void: - var label: RichTextLabel = $RichTextLabel - label.text = "[font_size=24][bgcolor=#FFFF00]%s[/bgcolor][/font_size]" % element.get_collapsed_text() diff --git a/Scripts/Tags/mark.gd.uid b/Scripts/Tags/mark.gd.uid deleted file mode 100644 index 57a6073..0000000 --- a/Scripts/Tags/mark.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://c2i8dwyyuufff diff --git a/Scripts/Tags/p.gd b/Scripts/Tags/p.gd index 1b83ded..43261b2 100644 --- a/Scripts/Tags/p.gd +++ b/Scripts/Tags/p.gd @@ -2,4 +2,4 @@ extends Control func init(element: HTMLParser.HTMLElement) -> void: var label: RichTextLabel = $RichTextLabel - label.text = "[font_size=24]%s[/font_size]" % element.get_collapsed_text() + label.text = "[font_size=24]%s[/font_size]" % element.get_bbcode_formatted_text() diff --git a/Scripts/Tags/small.gd b/Scripts/Tags/small.gd deleted file mode 100644 index 4dd1ad4..0000000 --- a/Scripts/Tags/small.gd +++ /dev/null @@ -1,5 +0,0 @@ -extends VBoxContainer - -func init(element: HTMLParser.HTMLElement) -> void: - var label: RichTextLabel = $RichTextLabel - label.text = "[font_size=18]%s[/font_size]" % element.get_collapsed_text() diff --git a/Scripts/Tags/small.gd.uid b/Scripts/Tags/small.gd.uid deleted file mode 100644 index 74fc901..0000000 --- a/Scripts/Tags/small.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://xr7n1lat501x diff --git a/Scripts/Tags/span.gd b/Scripts/Tags/span.gd new file mode 100644 index 0000000..43261b2 --- /dev/null +++ b/Scripts/Tags/span.gd @@ -0,0 +1,5 @@ +extends Control + +func init(element: HTMLParser.HTMLElement) -> void: + var label: RichTextLabel = $RichTextLabel + label.text = "[font_size=24]%s[/font_size]" % element.get_bbcode_formatted_text() diff --git a/Scripts/Tags/span.gd.uid b/Scripts/Tags/span.gd.uid new file mode 100644 index 0000000..86c5fca --- /dev/null +++ b/Scripts/Tags/span.gd.uid @@ -0,0 +1 @@ +uid://4pbphta3r67k diff --git a/Scripts/Tags/underline.gd b/Scripts/Tags/underline.gd deleted file mode 100644 index e3726ea..0000000 --- a/Scripts/Tags/underline.gd +++ /dev/null @@ -1,5 +0,0 @@ -extends VBoxContainer - -func init(element: HTMLParser.HTMLElement) -> void: - var label: RichTextLabel = $RichTextLabel - label.text = "[font_size=24][u]%s[/u][/font_size]" % element.get_collapsed_text() diff --git a/Scripts/Tags/underline.gd.uid b/Scripts/Tags/underline.gd.uid deleted file mode 100644 index 9e71dc7..0000000 --- a/Scripts/Tags/underline.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://x0hphtm8kf12 diff --git a/Scripts/main.gd b/Scripts/main.gd index e050d00..ba6162c 100644 --- a/Scripts/main.gd +++ b/Scripts/main.gd @@ -10,14 +10,9 @@ var loading_tween: Tween const P = preload("res://Scenes/Tags/p.tscn") const IMG = preload("res://Scenes/Tags/img.tscn") const SEPARATOR = preload("res://Scenes/Tags/separator.tscn") -const BOLD = preload("res://Scenes/Tags/bold.tscn") -const ITALIC = preload("res://Scenes/Tags/italic.tscn") -const UNDERLINE = preload("res://Scenes/Tags/underline.tscn") -const SMALL = preload("res://Scenes/Tags/small.tscn") -const MARK = preload("res://Scenes/Tags/mark.tscn") -const CODE = preload("res://Scenes/Tags/code.tscn") const PRE = preload("res://Scenes/Tags/pre.tscn") const BR = preload("res://Scenes/Tags/br.tscn") +const SPAN = preload("res://Scenes/Tags/span.tscn") func render(): # Clear existing content @@ -26,7 +21,7 @@ func render(): var html_bytes = "
Hey there! this is a test
This is bold - This is italic + This is italic actually, and it's pretty cool This is underline this is small this is marked -this is code
+ this is code THIS IS A SPAN AND SHOULDNT BE ANY DIFFERENT
Text in a pre element
@@ -78,7 +73,26 @@ line breaks
stop_loading_icon()
var body = parser.find_first("body")
- for element: HTMLParser.HTMLElement in body.children:
+ var i = 0
+ while i < body.children.size():
+ var element: HTMLParser.HTMLElement = body.children[i]
+
+ if element.is_inline_element():
+ # Collect consecutive inline elements and flatten nested ones
+ var inline_elements: Array[HTMLParser.HTMLElement] = []
+ while i < body.children.size() and body.children[i].is_inline_element():
+ inline_elements.append(body.children[i])
+ i += 1
+
+ var inline_container = P.instantiate()
+
+ var temp_parent = HTMLParser.HTMLElement.new()
+ temp_parent.tag_name = "p"
+ temp_parent.children = inline_elements
+ inline_container.init(temp_parent)
+ website_container.add_child(inline_container)
+ continue
+
match element.tag_name:
"p":
var p = P.instantiate()
@@ -92,10 +106,6 @@ line breaks
var br = BR.instantiate()
br.init(element)
website_container.add_child(br)
- "b":
- var bold = BOLD.instantiate()
- bold.init(element)
- website_container.add_child(bold)
"img":
var img = IMG.instantiate()
img.init(element)
@@ -104,28 +114,14 @@ line breaks
var separator = SEPARATOR.instantiate()
separator.init(element)
website_container.add_child(separator)
- "i":
- var italic = ITALIC.instantiate()
- italic.init(element)
- website_container.add_child(italic)
- "u":
- var underline = UNDERLINE.instantiate()
- underline.init(element)
- website_container.add_child(underline)
- "small":
- var small = SMALL.instantiate()
- small.init(element)
- website_container.add_child(small)
- "mark":
- var mark = MARK.instantiate()
- mark.init(element)
- website_container.add_child(mark)
- "code":
- var code = CODE.instantiate()
- code.init(element)
- website_container.add_child(code)
+ "span":
+ var span = SPAN.instantiate()
+ span.init(element)
+ website_container.add_child(span)
_:
print("Couldn't parse unsupported HTML tag \"%s\"" % element.tag_name)
+
+ i += 1
func set_loading_icon(tab: Tab) -> void:
tab.set_icon(LOADER_CIRCLE)