MagicNStuff/source/addons/bbcode_edit.editor/completions_db/completions.gd
2025-02-25 22:07:11 +01:00

266 lines
5.2 KiB
GDScript

extends Object
const Scraper = preload("res://addons/bbcode_edit.editor/editor_interface_scraper.gd")
const PATH_BUILTIN_COMPLETIONS = "res://addons/bbcode_edit.editor/completions_db/builtin_classes.txt"
# TODO add all tags and classify them between Documentation Only, Documentation Forbidden, Universal
const TAGS_UNIVERSAL: Array[String] = [
"b]|[/b",
"u]|[/u",
"i]|[/i",
"s]|[/s",
"code]|[/code",
"color=|][/color",
"lb||",
"rb||",
"font=|][/font",
"img]res://|[/img",
"img width=| height=]res://[/img",
"url]|[/url",
"url=https://|][/url",
"center]|[/center",
]
const TAGS_DOC_COMMENT_REFERENCE: Array[String] = [
"annotation |",
"constant |",
"enum |",
"member |",
"method |",
"constructor |",
"operator |",
"signal |",
"theme_item |",
]
const TAGS_DOC_COMMENT_FORMATTING: Array[String] = [
"codeblock]|[/codeblock",
"br||",
"kbd]|[/kbd",
]
# TODO add all tags
const TAGS_RICH_TEXT_LABEL: Array[String] = [
# TODO complete with all options
"font name=| size=][/font]",
'url={"|": }][/url',
]
const COLORS: Array[StringName] = [
"alice_blue",
"antique_white",
"aqua",
"aquamarine",
"azure",
"beige",
"bisque",
"black",
"blanched_almond",
"blue",
"blue_violet",
"brown",
"burlywood",
"cadet_blue",
"chartreuse",
"chocolate",
"coral",
"cornflower_blue",
"cornsilk",
"crimson",
"cyan",
"dark_blue",
"dark_cyan",
"dark_goldenrod",
"dark_gray",
"dark_green",
"dark_khaki",
"dark_magenta",
"dark_olive_green",
"dark_orange",
"dark_orchid",
"dark_red",
"dark_salmon",
"dark_sea_green",
"dark_slate_blue",
"dark_slate_gray",
"dark_turquoise",
"dark_violet",
"deep_pink",
"deep_sky_blue",
"dim_gray",
"dodger_blue",
"firebrick",
"floral_white",
"forest_green",
"fuchsia",
"gainsboro",
"ghost_white",
"gold",
"goldenrod",
"gray",
"green",
"green_yellow",
"honeydew",
"hot_pink",
"indian_red",
"indigo",
"ivory",
"khaki",
"lavender",
"lavender_blush",
"lawn_green",
"lemon_chiffon",
"light_blue",
"light_coral",
"light_cyan",
"light_goldenrod",
"light_gray",
"light_green",
"light_pink",
"light_salmon",
"light_sea_green",
"light_sky_blue",
"light_slate_gray",
"light_steel_blue",
"light_yellow",
"lime",
"lime_green",
"linen",
"magenta",
"maroon",
"medium_aquamarine",
"medium_blue",
"medium_orchid",
"medium_purple",
"medium_sea_green",
"medium_slate_blue",
"medium_spring_green",
"medium_turquoise",
"medium_violet_red",
"midnight_blue",
"mint_cream",
"misty_rose",
"moccasin",
"navajo_white",
"navy_blue",
"old_lace",
"olive",
"olive_drab",
"orange",
"orange_red",
"orchid",
"pale_goldenrod",
"pale_green",
"pale_turquoise",
"pale_violet_red",
"papaya_whip",
"peach_puff",
"peru",
"pink",
"plum",
"powder_blue",
"purple",
"rebecca_purple",
"red",
"rosy_brown",
"royal_blue",
"saddle_brown",
"salmon",
"sandy_brown",
"sea_green",
"seashell",
"sienna",
"silver",
"sky_blue",
"slate_blue",
"slate_gray",
"snow",
"spring_green",
"steel_blue",
"tan",
"teal",
"thistle",
"tomato",
"transparent",
"turquoise",
"violet",
"web_gray",
"web_green",
"web_maroon",
"web_purple",
"wheat",
"white",
"white_smoke",
"yellow",
"yellow_green",
]
static var _BUILTIN_CLASSES = PackedStringArray()
static func get_builtin_classes() -> PackedStringArray:
if not _BUILTIN_CLASSES:
var file: FileAccess = FileAccess.open(PATH_BUILTIN_COMPLETIONS, FileAccess.READ)
if FileAccess.get_open_error():
push_error(
"Failed to open "
+ PATH_BUILTIN_COMPLETIONS
+ ", error is:"
+ error_string(FileAccess.get_open_error())
)
_BUILTIN_CLASSES = file.get_as_text().split("\n")
return _BUILTIN_CLASSES
static var icon_cache: Dictionary = {}
static func get_class_completions() -> ClassCompletions:
var class_names: PackedStringArray = get_builtin_classes().duplicate()
var icons: Array[Texture2D] = []
for class_name_ in class_names:
icons.append(Scraper.get_builtin_class_icon(class_name_))
var classes: Array[Dictionary] = ProjectSettings.get_global_class_list()
var class_to_icon: Dictionary = {}
var class_to_base: Dictionary = {}
for class_ in classes:
var class_name_: String = class_["class"]
class_names.append(class_name_)
var icon_path: String = class_.get("icon", "")
if icon_path:
icons.append(load(icon_path))
elif class_name_ in icon_cache:
icons.append(icon_cache[class_name_])
else:
if class_to_base.is_empty():
for class__ in classes:
if class__["icon"]:
class_to_icon[class__["class"]] = class__["icon"]
class_to_base[class__["class"]] = class__["base"]
var icon_class: String = class_name_
while icon_class in class_to_base:
icon_class = class_to_base[icon_class]
if icon_class in class_to_icon:
icon_cache[class_name_] = load(class_to_icon[icon_class])
icons.append(icon_cache[class_name_])
break
if len(icons) != len(class_names):
icon_cache[class_name_] = Scraper.get_builtin_class_icon(icon_class)
icons.append(icon_cache[class_name_])
return ClassCompletions.new(
class_names,
icons,
)
class ClassCompletions:
var names: PackedStringArray
var icons: Array[Texture2D]
func _init(_names: PackedStringArray, _icons: Array[Texture2D]) -> void:
names = _names
icons = _icons