mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-06-23 15:14:43 +01:00
2dfbf0b81a
## About The Pull Request There's a few of these that conflict, mostly relating to timing. This conflicting won't actually break anything but it does muddy "what is this doing" somewhat and it's good to be clear so here we go ## Why It's Good For The Game Makes the MC very slightly harder to confuse yourself with
137 lines
5.8 KiB
Plaintext
137 lines
5.8 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(isalist(owner))
|
|
. = "<li style='backgroundColor:white'>(READ ONLY) "
|
|
else if(islist(owner))
|
|
var/list/list_owner = owner
|
|
var/index = name
|
|
if (isnull(value))
|
|
value = list_owner[name]
|
|
else
|
|
name = list_owner[name] //name is really the index until this line
|
|
. = "<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='byond://?_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='byond://?_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 separate proc mostly to make errors that happen not break things too much
|
|
/proc/_debug_variable_value(name, value, level, datum/owner, sanitize, display_flags)
|
|
if(isappearance(value))
|
|
value = get_vv_appearance(value)
|
|
|
|
. = "<font color='red'>DISPLAY_ERROR:</font> ([value] [REF(value)])" // Make sure this line can never runtime
|
|
|
|
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(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(isalist(value))
|
|
var/alist/alist_value = value
|
|
var/list/items = list()
|
|
|
|
var/link_vars = "Vars=[REF(value)]"
|
|
|
|
if (!(display_flags & VV_ALWAYS_CONTRACT_LIST) && alist_value.len > 0 && alist_value.len <= VV_NORMAL_LIST_NO_EXPAND_THRESHOLD)
|
|
for(var/key, val in alist_value)
|
|
items += debug_variable(key, val, level + 1, sanitize = sanitize)
|
|
return "<a href='byond://?_src_=vars;[HrefToken()];[link_vars]'>/alist ([alist_value.len])</a><ul>[items.Join()]</ul>"
|
|
return "<a href='byond://?_src_=vars;[HrefToken()];[link_vars]'>/alist ([alist_value.len])</a>"
|
|
|
|
if(islist(value) || (name in GLOB.vv_special_lists)) // Some special lists aren't detectable as a list through istype
|
|
var/list/list_value = value
|
|
var/list/items = list()
|
|
|
|
// This is because some lists either don't count as lists or a locate on their ref will return null
|
|
var/link_vars = "Vars=[REF(value)]"
|
|
if(name in GLOB.vv_special_lists)
|
|
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='byond://?_src_=vars;[HrefToken()];[link_vars]'>/list ([list_value.len])</a><ul>[items.Join()]</ul>"
|
|
return "<a href='byond://?_src_=vars;[HrefToken()];[link_vars]'>/list ([list_value.len])</a>"
|
|
|
|
// if it's a number, is it a bitflag?
|
|
var/list/matching_bitflags = get_matching_bitflags(name, value)
|
|
|
|
if(!isnull(matching_bitflags))
|
|
if(length(matching_bitflags))
|
|
return "[VV_HTML_ENCODE(matching_bitflags.Join(", "))]"
|
|
return "NONE"
|
|
|
|
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='byond://?_src_=vars;[HrefToken()];Vars=[REF(src)]'>[src] [type] [REF(src)]</a>"
|
|
else
|
|
return "<a href='byond://?_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='byond://?_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
|