<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://en.bharatpedia.org/w/index.php?action=history&amp;feed=atom&amp;title=Module%3ASST</id>
	<title>Module:SST - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://en.bharatpedia.org/w/index.php?action=history&amp;feed=atom&amp;title=Module%3ASST"/>
	<link rel="alternate" type="text/html" href="https://en.bharatpedia.org/w/index.php?title=Module:SST&amp;action=history"/>
	<updated>2026-10-29T19:58:38Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.6</generator>
	<entry>
		<id>https://en.bharatpedia.org/w/index.php?title=Module:SST&amp;diff=556139&amp;oldid=prev</id>
		<title>WikiDwarf: Add missing module</title>
		<link rel="alternate" type="text/html" href="https://en.bharatpedia.org/w/index.php?title=Module:SST&amp;diff=556139&amp;oldid=prev"/>
		<updated>2026-04-18T03:30:05Z</updated>

		<summary type="html">&lt;p&gt;Add missing module&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;require(&amp;#039;strict&amp;#039;)&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; H O S T _ M A P &amp;gt;--------------------------------------------]]&lt;br /&gt;
local host_map = {&lt;br /&gt;
    [&amp;#039;ia&amp;#039;]              = { engine = &amp;#039;IA&amp;#039;,         shard_key = &amp;#039;ia&amp;#039; },&lt;br /&gt;
    [&amp;#039;internetarchive&amp;#039;] = { engine = &amp;#039;IA&amp;#039;,         shard_key = &amp;#039;ia&amp;#039; },&lt;br /&gt;
    [&amp;#039;hathi&amp;#039;]           = { engine = &amp;#039;Hathi&amp;#039;,      shard_key = &amp;#039;hathi&amp;#039; },&lt;br /&gt;
    [&amp;#039;hathitrust&amp;#039;]      = { engine = &amp;#039;Hathi&amp;#039;,      shard_key = &amp;#039;hathi&amp;#039; },&lt;br /&gt;
    [&amp;#039;guten&amp;#039;]           = { engine = &amp;#039;Gutenberg&amp;#039;,  shard_key = &amp;#039;guten&amp;#039; },&lt;br /&gt;
    [&amp;#039;gutenberg&amp;#039;]       = { engine = &amp;#039;Gutenberg&amp;#039;,  shard_key = &amp;#039;guten&amp;#039; },&lt;br /&gt;
    [&amp;#039;wikisrc&amp;#039;]         = { engine = &amp;#039;Wikisource&amp;#039;, shard_key = &amp;#039;wikisrc&amp;#039; },&lt;br /&gt;
    [&amp;#039;wikisource&amp;#039;]      = { engine = &amp;#039;Wikisource&amp;#039;, shard_key = &amp;#039;wikisrc&amp;#039; },&lt;br /&gt;
    [&amp;#039;gbook&amp;#039;]           = { engine = &amp;#039;GBook&amp;#039;,      shard_key = &amp;#039;gbook&amp;#039; },&lt;br /&gt;
    [&amp;#039;googlebooks&amp;#039;]     = { engine = &amp;#039;GBook&amp;#039;,      shard_key = &amp;#039;gbook&amp;#039; },&lt;br /&gt;
    [&amp;#039;web&amp;#039;]             = { engine = &amp;#039;Web&amp;#039;,        shard_key = &amp;#039;web&amp;#039; },&lt;br /&gt;
    [&amp;#039;physical&amp;#039;]        = { engine = &amp;#039;Physical&amp;#039;,   shard_key = &amp;#039;physical&amp;#039; } &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; P A R A M E T E R   M A P &amp;gt;----------------------------------]]&lt;br /&gt;
-- SSTS Architecture Note:&lt;br /&gt;
-- The parameter_map is designed specifically for sub-divisions of a single work&lt;br /&gt;
-- (like individual chapters or dictionary entries). &lt;br /&gt;
-- To maintain the Single-Source Template (SSTS) philosophy, core identity &lt;br /&gt;
-- parameters like &amp;#039;title&amp;#039;, &amp;#039;year&amp;#039;, or &amp;#039;isbn&amp;#039; are managed at the variant &lt;br /&gt;
-- level (creating a new library entry) rather than through this map.&lt;br /&gt;
local parameter_map_guardrail = {&lt;br /&gt;
    [&amp;#039;chapter&amp;#039;] = true,&lt;br /&gt;
    [&amp;#039;entry&amp;#039;]   = true,&lt;br /&gt;
    [&amp;#039;article&amp;#039;] = true,&lt;br /&gt;
    [&amp;#039;section&amp;#039;] = true,&lt;br /&gt;
    [&amp;#039;part&amp;#039;]    = true&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local function apply_parameter_map(user_args, book_data, library)&lt;br /&gt;
    -- Follow the pointer if an alias exists&lt;br /&gt;
    local map_source = book_data&lt;br /&gt;
    if book_data.parameter_map_alias and library and library[book_data.parameter_map_alias] then&lt;br /&gt;
        map_source = library[book_data.parameter_map_alias]&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if not map_source.parameter_map then return end&lt;br /&gt;
    &lt;br /&gt;
    for param, map_table in pairs(map_source.parameter_map) do&lt;br /&gt;
        if parameter_map_guardrail[param] then&lt;br /&gt;
            local user_input = user_args[param]&lt;br /&gt;
            if user_input then&lt;br /&gt;
                -- Trim whitespace so &amp;quot;|chapter= 8 &amp;quot; matches key [&amp;#039;8&amp;#039;]&lt;br /&gt;
                local clean_input = mw.text.trim(tostring(user_input))&lt;br /&gt;
                if map_table[clean_input] then&lt;br /&gt;
                    user_args[param] = map_table[clean_input]&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; H E L P E R S &amp;gt;----------------------------------------------]]&lt;br /&gt;
local function error_msg(msg, tracking_category)&lt;br /&gt;
    local err_text = string.format(&amp;#039;&amp;lt;strong class=&amp;quot;error&amp;quot;&amp;gt;SSTS Error: %s&amp;lt;/strong&amp;gt;&amp;#039;, msg)&lt;br /&gt;
    local title = mw.title.getCurrentTitle()&lt;br /&gt;
    &lt;br /&gt;
    if title and (title.namespace == 0 or title.namespace == 118) then&lt;br /&gt;
        if tracking_category then&lt;br /&gt;
            return err_text .. &amp;#039;[[Category:&amp;#039; .. tracking_category .. &amp;#039;]]&amp;#039;&lt;br /&gt;
        else&lt;br /&gt;
            return err_text .. &amp;#039;[[Category:SSTS errors]]&amp;#039;&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    return err_text&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; C O R E _ E X E C U T I O N &amp;gt;--------------------------------]]&lt;br /&gt;
-- Shared function to build the citation regardless of how it was routed&lt;br /&gt;
local function build_citation(frame, book_data, target_host, library)&lt;br /&gt;
    if not target_host then return error_msg(&amp;quot;No host defined for this record.&amp;quot;) end&lt;br /&gt;
    &lt;br /&gt;
    -- 1. Route to the correct Host/Engine&lt;br /&gt;
    local host_info = host_map[string.lower(mw.text.trim(target_host))]&lt;br /&gt;
    if not host_info then return error_msg(&amp;quot;Unsupported host &amp;#039;&amp;quot; .. target_host .. &amp;quot;&amp;#039;&amp;quot;) end&lt;br /&gt;
&lt;br /&gt;
    -- 2. Validate Host Data within the record&lt;br /&gt;
    local host_data = book_data.hosts and book_data.hosts[host_info.shard_key]&lt;br /&gt;
    if not host_data then &lt;br /&gt;
        return error_msg(&amp;quot;Host &amp;#039;&amp;quot; .. host_info.shard_key .. &amp;quot;&amp;#039; is not defined for this book.&amp;quot;) &lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- 3. Load the Hosts module&lt;br /&gt;
    local success_engine, hosts_module = pcall(require, &amp;#039;Module:SST/hosts&amp;#039;)&lt;br /&gt;
    if not success_engine then &lt;br /&gt;
        return error_msg(&amp;quot;Could not load Module:SST/hosts.&amp;quot;) &lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    local engine = hosts_module[host_info.engine]&lt;br /&gt;
    if not engine then &lt;br /&gt;
        return error_msg(&amp;quot;Engine &amp;#039;&amp;quot; .. host_info.engine .. &amp;quot;&amp;#039; not found in hosts module.&amp;quot;) &lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- 4. Process Arguments &amp;amp; Apply ignore_args Filter&lt;br /&gt;
    local ignore_list = { &lt;br /&gt;
        [&amp;#039;ignore_args&amp;#039;] = true, &lt;br /&gt;
        [&amp;#039;id&amp;#039;] = true, &lt;br /&gt;
        [&amp;#039;key&amp;#039;] = true, &lt;br /&gt;
        [&amp;#039;default&amp;#039;] = true &lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    if frame.args[&amp;#039;ignore_args&amp;#039;] then&lt;br /&gt;
        for key in string.gmatch(frame.args[&amp;#039;ignore_args&amp;#039;], &amp;#039;([^,]+)&amp;#039;) do&lt;br /&gt;
            ignore_list[mw.text.trim(key)] = true&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local combined_args = {}&lt;br /&gt;
    &lt;br /&gt;
    -- Grab parent args (user input), skipping ignored keys&lt;br /&gt;
    for k, v in pairs(frame:getParent().args) do&lt;br /&gt;
        if type(k) == &amp;#039;string&amp;#039; and not ignore_list[k] then&lt;br /&gt;
            combined_args[k] = v&lt;br /&gt;
        elseif type(k) == &amp;#039;number&amp;#039; and not ignore_list[tostring(k)] then&lt;br /&gt;
            combined_args[k] = v&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- Grab current frame args (template overrides like our generated &amp;#039;chapter&amp;#039;)&lt;br /&gt;
    for k, v in pairs(frame.args) do&lt;br /&gt;
        if type(k) == &amp;#039;string&amp;#039; and not ignore_list[k] then&lt;br /&gt;
            combined_args[k] = v&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- ==========================================================&lt;br /&gt;
    -- 4.5 APPLY PARAMETER MAP (Translate shorthand into full titles)&lt;br /&gt;
    -- ==========================================================&lt;br /&gt;
    apply_parameter_map(combined_args, book_data, library)&lt;br /&gt;
&lt;br /&gt;
    local citeArgs = {}&lt;br /&gt;
    for k, v in pairs(book_data.cite_params or {}) do &lt;br /&gt;
        citeArgs[k] = v &lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- ==========================================================&lt;br /&gt;
    -- 4.7 SILENT LOGIC TRAP (Inspect raw shard data for faults)&lt;br /&gt;
    -- ==========================================================&lt;br /&gt;
    local has_logic_fault = false&lt;br /&gt;
    local t_type = citeArgs[&amp;#039;_template&amp;#039;] or &amp;#039;cite book&amp;#039;&lt;br /&gt;
    &lt;br /&gt;
    if t_type == &amp;#039;cite encyclopedia&amp;#039; then&lt;br /&gt;
        -- Encyclopedia shards must use &amp;#039;encyclopedia&amp;#039;, not &amp;#039;title&amp;#039; or specific entries.&lt;br /&gt;
        -- They also cannot contain book or journal container names.&lt;br /&gt;
        if citeArgs[&amp;#039;title&amp;#039;] or citeArgs[&amp;#039;title-link&amp;#039;] or citeArgs[&amp;#039;article&amp;#039;] or citeArgs[&amp;#039;entry&amp;#039;] then&lt;br /&gt;
            has_logic_fault = true&lt;br /&gt;
        elseif citeArgs[&amp;#039;journal&amp;#039;] or citeArgs[&amp;#039;magazine&amp;#039;] or citeArgs[&amp;#039;work&amp;#039;] then&lt;br /&gt;
            has_logic_fault = true&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
    elseif t_type == &amp;#039;cite journal&amp;#039; then&lt;br /&gt;
        -- Journal shards must have a journal container.&lt;br /&gt;
        -- They cannot be locked to specific chapters, nor contain book/encyclopedia containers.&lt;br /&gt;
        if not citeArgs[&amp;#039;journal&amp;#039;] and not citeArgs[&amp;#039;work&amp;#039;] and not citeArgs[&amp;#039;magazine&amp;#039;] then&lt;br /&gt;
            has_logic_fault = true&lt;br /&gt;
        end&lt;br /&gt;
        if citeArgs[&amp;#039;chapter&amp;#039;] or citeArgs[&amp;#039;encyclopedia&amp;#039;] then&lt;br /&gt;
            has_logic_fault = true&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
    elseif t_type == &amp;#039;cite book&amp;#039; then&lt;br /&gt;
        -- Book shards cannot contain encyclopedia or journal container names.&lt;br /&gt;
        if citeArgs[&amp;#039;encyclopedia&amp;#039;] or citeArgs[&amp;#039;journal&amp;#039;] or citeArgs[&amp;#039;magazine&amp;#039;] or citeArgs[&amp;#039;work&amp;#039;] then&lt;br /&gt;
            has_logic_fault = true&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- 5. Pass execution to the Hosts module for parsing and link-building&lt;br /&gt;
    if type(hosts_module.process) == &amp;quot;function&amp;quot; then&lt;br /&gt;
        citeArgs = hosts_module.process(engine, host_data, citeArgs, combined_args)&lt;br /&gt;
    else&lt;br /&gt;
        return error_msg(&amp;quot;System Error: hosts_module.process is missing.&amp;quot;)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- 6. Render standard Cite Book/Encyclopedia template&lt;br /&gt;
    local template_name = citeArgs[&amp;#039;_template&amp;#039;] or &amp;#039;cite book&amp;#039;&lt;br /&gt;
    citeArgs[&amp;#039;_template&amp;#039;] = nil &lt;br /&gt;
    &lt;br /&gt;
    if citeArgs[&amp;#039;ref&amp;#039;] and mw.ustring.match(citeArgs[&amp;#039;ref&amp;#039;], &amp;#039;^{{&amp;#039;) then&lt;br /&gt;
        local pre_ref = frame:preprocess(citeArgs[&amp;#039;ref&amp;#039;])&lt;br /&gt;
        citeArgs[&amp;#039;ref&amp;#039;] = mw.ustring.gsub(pre_ref, &amp;quot; &amp;quot;, &amp;quot;_&amp;quot;)&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    local citation = frame:expandTemplate{ title = template_name, args = citeArgs }&lt;br /&gt;
&lt;br /&gt;
    -- 7. Catch CS1/CS2 errors and inject silent tracking categories&lt;br /&gt;
    local current_page = mw.title.getCurrentTitle()&lt;br /&gt;
    if current_page and (current_page.namespace == 0 or current_page.namespace == 118) then&lt;br /&gt;
        -- Catch native CS1 red errors&lt;br /&gt;
        local has_cs1_error = string.find(citation, &amp;quot;cs1%-visible%-error&amp;quot;) or &lt;br /&gt;
                              string.find(citation, &amp;quot;cs1%-hidden%-error&amp;quot;) or &lt;br /&gt;
                              string.find(citation, &amp;quot;Category:CS1 errors&amp;quot;)&lt;br /&gt;
                              &lt;br /&gt;
        if has_cs1_error then&lt;br /&gt;
            citation = citation .. &amp;quot;[[Category:SSTS errors]]&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        &lt;br /&gt;
        -- Catch parameter logical faults&lt;br /&gt;
        if has_logic_fault then&lt;br /&gt;
            citation = citation .. &amp;quot;[[Category:SSTS parameter logic faults]]&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return citation&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; T H E   B R I D G E &amp;gt;----------------------------------------]]&lt;br /&gt;
-- LEGACY ROUTER: Supports existing live templates. DO NOT DELETE until Phase 4.&lt;br /&gt;
function p.main(frame)&lt;br /&gt;
    local raw_host = frame.args[1]&lt;br /&gt;
    local book_key = frame.args[2]&lt;br /&gt;
    &lt;br /&gt;
    if not raw_host then return error_msg(&amp;quot;No host specified in #invoke.&amp;quot;) end&lt;br /&gt;
    if not book_key then return error_msg(&amp;quot;No book key specified in #invoke.&amp;quot;) end&lt;br /&gt;
    &lt;br /&gt;
    local shard_letter = mw.ustring.upper(mw.ustring.sub(mw.text.trim(book_key), 1, 1))&lt;br /&gt;
    local success_shard, library = pcall(mw.loadData, &amp;#039;Module:SST/shards/&amp;#039; .. shard_letter)&lt;br /&gt;
    &lt;br /&gt;
    if not success_shard then return error_msg(&amp;quot;Could not load shard module &amp;#039;&amp;quot; .. shard_letter .. &amp;quot;&amp;#039;.&amp;quot;) end&lt;br /&gt;
    &lt;br /&gt;
    local book_data = library[mw.text.trim(book_key)]&lt;br /&gt;
    if not book_data then return error_msg(&amp;quot;Book key &amp;#039;&amp;quot; .. book_key .. &amp;quot;&amp;#039; not found.&amp;quot;, &amp;quot;SSTS missing records&amp;quot;) end&lt;br /&gt;
    &lt;br /&gt;
    -- Smart Host Fallback&lt;br /&gt;
    local final_host = book_data.host&lt;br /&gt;
    &lt;br /&gt;
    if not final_host then&lt;br /&gt;
        -- Fallback 1: Try to grab the first available host from the hosts table&lt;br /&gt;
        if book_data.hosts and type(book_data.hosts) == &amp;#039;table&amp;#039; then&lt;br /&gt;
            for k, _ in pairs(book_data.hosts) do&lt;br /&gt;
                final_host = k&lt;br /&gt;
                break&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
        &lt;br /&gt;
        -- Fallback 2: If still nothing, treat it as a physical book&lt;br /&gt;
        if not final_host then&lt;br /&gt;
            final_host = &amp;#039;physical&amp;#039;&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    local output = build_citation(frame, book_data, final_host, library)&lt;br /&gt;
    &lt;br /&gt;
    -- Only categorize in Main (0) and Template (10) namespaces to ignore sandboxes&lt;br /&gt;
    local ns = mw.title.getCurrentTitle().namespace&lt;br /&gt;
    if ns == 0 or ns == 10 then&lt;br /&gt;
        output = output .. &amp;quot;[[Category:SSTS errors|*LEGACY]]&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    return output&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; A R C H I T E C T U R E &amp;gt;----------------------------]]&lt;br /&gt;
&lt;br /&gt;
-- ROUTER: Single A-Z Books&lt;br /&gt;
function p.single(frame)&lt;br /&gt;
    local base_id = frame.args.id&lt;br /&gt;
    if not base_id then return error_msg(&amp;quot;No id specified in #invoke.&amp;quot;) end&lt;br /&gt;
    &lt;br /&gt;
    local shard_letter = mw.ustring.upper(mw.ustring.sub(mw.text.trim(base_id), 1, 1))&lt;br /&gt;
    local success_shard, library = pcall(mw.loadData, &amp;#039;Module:SST/shards/&amp;#039; .. shard_letter)&lt;br /&gt;
    &lt;br /&gt;
    if not success_shard then return error_msg(&amp;quot;Could not load shard module &amp;#039;&amp;quot; .. shard_letter .. &amp;quot;&amp;#039;.&amp;quot;) end&lt;br /&gt;
    &lt;br /&gt;
    local book_data = library[mw.text.trim(base_id)]&lt;br /&gt;
    if not book_data then return error_msg(&amp;quot;Record &amp;#039;&amp;quot; .. base_id .. &amp;quot;&amp;#039; not found.&amp;quot;, &amp;quot;SSTS missing records&amp;quot;) end&lt;br /&gt;
    &lt;br /&gt;
    -- Smart Host Fallback&lt;br /&gt;
    local final_host = book_data.host&lt;br /&gt;
    if not final_host then&lt;br /&gt;
        if book_data.hosts and type(book_data.hosts) == &amp;#039;table&amp;#039; then&lt;br /&gt;
            for k, _ in pairs(book_data.hosts) do&lt;br /&gt;
                final_host = k&lt;br /&gt;
                break&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
        if not final_host then final_host = &amp;#039;physical&amp;#039; end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    return build_citation(frame, book_data, final_host, library)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- ROUTER: Multi-Volume Sets&lt;br /&gt;
function p.set(frame)&lt;br /&gt;
    local base_id = frame.args.id&lt;br /&gt;
    if not base_id then return error_msg(&amp;quot;No id specified for the set in #invoke.&amp;quot;) end&lt;br /&gt;
    &lt;br /&gt;
    -- Determine target key (e.g. &amp;quot;1&amp;quot;, &amp;quot;2&amp;quot;, &amp;quot;ALL&amp;quot;)&lt;br /&gt;
    local raw_key = frame.args.key&lt;br /&gt;
    local target_key&lt;br /&gt;
    if not raw_key or mw.text.trim(raw_key) == &amp;quot;&amp;quot; then&lt;br /&gt;
        target_key = frame.args.default or &amp;quot;ALL&amp;quot;&lt;br /&gt;
    else&lt;br /&gt;
        target_key = mw.text.trim(raw_key)&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    local prefix = base_id .. &amp;quot;_&amp;quot;&lt;br /&gt;
    local lookup_id&lt;br /&gt;
    &lt;br /&gt;
    -- Smart detection: Check if the editor accidentally passed the full book key instead of the short variant&lt;br /&gt;
    if mw.ustring.sub(target_key, 1, mw.ustring.len(prefix)) == prefix then&lt;br /&gt;
        lookup_id = target_key&lt;br /&gt;
        -- Strip the prefix from target_key so error messages still look clean&lt;br /&gt;
        target_key = mw.ustring.sub(target_key, mw.ustring.len(prefix) + 1)&lt;br /&gt;
    else&lt;br /&gt;
        lookup_id = prefix .. target_key&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    -- Route to dedicated /sets/ module&lt;br /&gt;
    local success_shard, library = pcall(mw.loadData, &amp;#039;Module:SST/shards/sets/&amp;#039; .. base_id)&lt;br /&gt;
    if not success_shard then return error_msg(&amp;quot;Could not load set module for &amp;#039;&amp;quot; .. base_id .. &amp;quot;&amp;#039;.&amp;quot;) end&lt;br /&gt;
    &lt;br /&gt;
    local book_data = library[lookup_id]&lt;br /&gt;
    if not book_data then return error_msg(&amp;quot;Part &amp;#039;&amp;quot; .. target_key .. &amp;quot;&amp;#039; not found in set &amp;#039;&amp;quot; .. base_id .. &amp;quot;&amp;#039;.&amp;quot;, &amp;quot;SSTS missing records&amp;quot;) end&lt;br /&gt;
    &lt;br /&gt;
    -- Smart Host Fallback&lt;br /&gt;
    local final_host = book_data.host&lt;br /&gt;
    if not final_host then&lt;br /&gt;
        if book_data.hosts and type(book_data.hosts) == &amp;#039;table&amp;#039; then&lt;br /&gt;
            for k, _ in pairs(book_data.hosts) do&lt;br /&gt;
                final_host = k&lt;br /&gt;
                break&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
        if not final_host then final_host = &amp;#039;physical&amp;#039; end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    return build_citation(frame, book_data, final_host, library)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>WikiDwarf</name></author>
	</entry>
</feed>