mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-01-11 09:22:41 +00:00
* Precalculates special list var names and avoids incorrect vv targets (#79154) ## About The Pull Request This adds a global list to precalculate lists that need to be handled special by vv instead of manually updating such a list. @ LemonInTheDark brought up a potential issue with handling all lists in the way special lists are handled, that modifying a list in vv can in some cases result in the wrong list being opened for editing. This makes only special lists have the issue instead of blindly accessing all lists the same way. * Precalculates special list var names and avoids incorrect vv targets --------- Co-authored-by: Emmett Gaines <ninjanomnom@gmail.com>
126 lines
5.1 KiB
Plaintext
126 lines
5.1 KiB
Plaintext
#define VV_HTML_ENCODE(thing) ( sanitize ? html_encode(thing) : thing )
|
|
/// Get displayed variable in VV variable list
|
|
/proc/debug_variable(name, value, level, datum/owner, sanitize = TRUE, display_flags = NONE) //if D is a list, name will be index, and value will be assoc value.
|
|
if(owner)
|
|
if(islist(owner))
|
|
var/index = name
|
|
if (value)
|
|
name = owner[name] //name is really the index until this line
|
|
else
|
|
value = owner[name]
|
|
. = "<li style='backgroundColor:white'>([VV_HREF_TARGET_1V(owner, VV_HK_LIST_EDIT, "E", index)]) ([VV_HREF_TARGET_1V(owner, VV_HK_LIST_CHANGE, "C", index)]) ([VV_HREF_TARGET_1V(owner, VV_HK_LIST_REMOVE, "-", index)]) "
|
|
else
|
|
. = "<li style='backgroundColor:white'>([VV_HREF_TARGET_1V(owner, VV_HK_BASIC_EDIT, "E", name)]) ([VV_HREF_TARGET_1V(owner, VV_HK_BASIC_CHANGE, "C", name)]) ([VV_HREF_TARGET_1V(owner, VV_HK_BASIC_MASSEDIT, "M", name)]) "
|
|
else
|
|
. = "<li>"
|
|
|
|
var/name_part = VV_HTML_ENCODE(name)
|
|
if(level > 0 || islist(owner)) //handling keys in assoc lists
|
|
if(istype(name,/datum))
|
|
name_part = "<a href='?_src_=vars;[HrefToken()];Vars=[REF(name)]'>[VV_HTML_ENCODE(name)] [REF(name)]</a>"
|
|
else if(islist(name))
|
|
var/list/list_value = name
|
|
name_part = "<a href='?_src_=vars;[HrefToken()];Vars=[REF(name)]'> /list ([length(list_value)]) [REF(name)]</a>"
|
|
|
|
. = "[.][name_part] = "
|
|
|
|
var/item = _debug_variable_value(name, value, level, owner, sanitize, display_flags)
|
|
|
|
return "[.][item]</li>"
|
|
|
|
// This is split into a seperate proc mostly to make errors that happen not break things too much
|
|
/proc/_debug_variable_value(name, value, level, datum/owner, sanitize, display_flags)
|
|
. = "<font color='red'>DISPLAY_ERROR</font>"
|
|
|
|
if(isnull(value))
|
|
return "<span class='value'>null</span>"
|
|
|
|
if(istext(value))
|
|
return "<span class='value'>\"[VV_HTML_ENCODE(value)]\"</span>"
|
|
|
|
if(isicon(value))
|
|
#ifdef VARSICON
|
|
var/icon/icon_value = icon(value)
|
|
var/rnd = rand(1,10000)
|
|
var/rname = "tmp[REF(icon_value)][rnd].png"
|
|
usr << browse_rsc(icon_value, rname)
|
|
return "(<span class='value'>[value]</span>) <img class=icon src=\"[rname]\">"
|
|
#else
|
|
return "/icon (<span class='value'>[value]</span>)"
|
|
#endif
|
|
|
|
if(isappearance(value))
|
|
var/image/actually_an_appearance = value
|
|
return "/appearance (<span class='value'>[actually_an_appearance.icon]</span>)"
|
|
|
|
if(isfilter(value))
|
|
var/datum/filter_value = value
|
|
return "/filter (<span class='value'>[filter_value.type] [REF(filter_value)]</span>)"
|
|
|
|
if(isfile(value))
|
|
return "<span class='value'>'[value]'</span>"
|
|
|
|
if(isdatum(value))
|
|
var/datum/datum_value = value
|
|
return datum_value.debug_variable_value(name, level, owner, sanitize, display_flags)
|
|
|
|
if(islist(value) || GLOB.vv_special_lists[name]) // Some special lists arent detectable as a list through istype
|
|
var/list/list_value = value
|
|
var/list/items = list()
|
|
|
|
// This is becuse some lists either dont count as lists or a locate on their ref will return null
|
|
var/link_vars = "Vars=[REF(value)]"
|
|
if(GLOB.vv_special_lists[name])
|
|
link_vars = "Vars=[REF(owner)];special_varname=[name]"
|
|
|
|
if (!(display_flags & VV_ALWAYS_CONTRACT_LIST) && list_value.len > 0 && list_value.len <= (IS_NORMAL_LIST(list_value) ? VV_NORMAL_LIST_NO_EXPAND_THRESHOLD : VV_SPECIAL_LIST_NO_EXPAND_THRESHOLD))
|
|
for (var/i in 1 to list_value.len)
|
|
var/key = list_value[i]
|
|
var/val
|
|
if (IS_NORMAL_LIST(list_value) && !isnum(key))
|
|
val = list_value[key]
|
|
if (isnull(val)) // we still want to display non-null false values, such as 0 or ""
|
|
val = key
|
|
key = i
|
|
|
|
items += debug_variable(key, val, level + 1, sanitize = sanitize)
|
|
|
|
return "<a href='?_src_=vars;[HrefToken()];[link_vars]'>/list ([list_value.len])</a><ul>[items.Join()]</ul>"
|
|
else
|
|
return "<a href='?_src_=vars;[HrefToken()];[link_vars]'>/list ([list_value.len])</a>"
|
|
|
|
if(name in GLOB.bitfields)
|
|
var/list/flags = list()
|
|
for (var/i in GLOB.bitfields[name])
|
|
if (value & GLOB.bitfields[name][i])
|
|
flags += i
|
|
if(length(flags))
|
|
return "[VV_HTML_ENCODE(jointext(flags, ", "))]"
|
|
else
|
|
return "NONE"
|
|
else
|
|
return "<span class='value'>[VV_HTML_ENCODE(value)]</span>"
|
|
|
|
/datum/proc/debug_variable_value(name, level, datum/owner, sanitize, display_flags)
|
|
if("[src]" != "[type]") // If we have a name var, let's use it.
|
|
return "<a href='?_src_=vars;[HrefToken()];Vars=[REF(src)]'>[src] [type] [REF(src)]</a>"
|
|
else
|
|
return "<a href='?_src_=vars;[HrefToken()];Vars=[REF(src)]'>[type] [REF(src)]</a>"
|
|
|
|
/datum/weakref/debug_variable_value(name, level, datum/owner, sanitize, display_flags)
|
|
. = ..()
|
|
return "[.] <a href='?_src_=vars;[HrefToken()];Vars=[reference]'>(Resolve)</a>"
|
|
|
|
/matrix/debug_variable_value(name, level, datum/owner, sanitize, display_flags)
|
|
return {"<span class='value'>
|
|
<table class='matrixbrak'><tbody><tr><td class='lbrak'> </td><td>
|
|
<table class='matrix'>
|
|
<tbody>
|
|
<tr><td>[a]</td><td>[d]</td><td>0</td></tr>
|
|
<tr><td>[b]</td><td>[e]</td><td>0</td></tr>
|
|
<tr><td>[c]</td><td>[f]</td><td>1</td></tr>
|
|
</tbody>
|
|
</table></td><td class='rbrak'> </td></tr></tbody></table></span>"} //TODO link to modify_transform wrapper for all matrices
|
|
|
|
#undef VV_HTML_ENCODE
|