PageSourceSearch

https://shirecraft.us/forum/applications/vanilla/js/spoilers.js?v=2025.010

js shirecraft.us collected 2026-10-05 01:29:54 UTC 2,919 bytes, 84 lines download raw bytes

1/**
2 * A utility for attaching listeners and handling events associated with spoiler visibility toggling.
3 */
4var spoilers = {
5
6    /**
7     * Gather all UserSpoiler DIVs and attempt to augment them with spoiler capabilities.
8     */
9    findAndReplace: function() {
10        jQuery("div.Spoiler", this).each(function(i, el) {
11            spoilers.replaceSpoiler(el);
12        });
13    },
14
15    /**
16     * Add spoiler capabilities to a specific HTML element.
17     * @param {HTMLElement} spoiler The element we're adding hide/show capabilities to.
18     */
19    replaceSpoiler: function(spoiler) {
20        var spoilerObject = jQuery(spoiler);
21
22        // Has this element already been setup as a spoiler? Skip it.
23        if (spoilerObject.hasClass("SpoilerConfigured")) {
24            return;
25        }
26
27        // Build the individual elements.
28        var text = document.createElement("div");
29        text.className = "SpoilerText";
30        while(spoiler.firstChild) {
31            text.appendChild(spoiler.firstChild);
32        }
33
34        var title = document.createElement("div");
35        title.className = "SpoilerTitle";
36        title.innerHTML = gdn.definition("Spoiler", "Spoiler");
37
38        var reveal = document.createElement("div");
39        reveal.className = "SpoilerReveal";
40
41        var spoilerButton       = document.createElement("input");
42        spoilerButton.type      = "button";
43        spoilerButton.value     = gdn.definition("show", "show");
44        spoilerButton.className = "SpoilerToggle";
45
46        // Assemble the elements.
47        spoiler.appendChild(title);
48        spoiler.appendChild(reveal);
49        spoiler.appendChild(text);
50        title.appendChild(spoilerButton);
51
52        // Add an event listener to the toggle button.
53        spoilerObject.on("click", "input.SpoilerToggle", function(event) {
54            event.stopPropagation();
55            spoilers.toggleSpoiler(jQuery(event.delegateTarget), jQuery(event.target));
56        });
57
58        // Flag this spoiler as setup.
59        spoilerObject.addClass("SpoilerConfigured");
60    },
61
62    /**
63     * Toggle a spoiler's visibility on or off.
64     * @param {object} spoiler The primary spoiler HTML element.
65     * @param {object} spoilerButton The button HTML element used to trigger the toggle.
66     */
67    toggleSpoiler: function(spoiler, spoilerButton) {
68        var thisSpoilerText   = spoiler.find("div.SpoilerText").first();
69        var thisSpoilerStatus = thisSpoilerText.css("display");
70        var newSpoilerStatus  = (thisSpoilerStatus === "none") ? "block" : "none";
71
72        thisSpoilerText.css("display", newSpoilerStatus);
73
74        if (newSpoilerStatus === "none") {
75            spoilerButton.val(gdn.definition("show", "show"));
76        } else {
77            spoilerButton.val(gdn.definition("hide", "hide"));
78        }
79    }
80};
81
82jQuery(document).on("contentLoad", function(e) {
83    spoilers.findAndReplace.apply(e.target);
84});

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.