<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.roatpkz.com/index.php?action=history&amp;feed=atom&amp;title=Module%3AGet_drop_info</id>
	<title>Module:Get drop info - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.roatpkz.com/index.php?action=history&amp;feed=atom&amp;title=Module%3AGet_drop_info"/>
	<link rel="alternate" type="text/html" href="https://wiki.roatpkz.com/index.php?title=Module:Get_drop_info&amp;action=history"/>
	<updated>2026-04-28T11:22:42Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.41.0</generator>
	<entry>
		<id>https://wiki.roatpkz.com/index.php?title=Module:Get_drop_info&amp;diff=19156&amp;oldid=prev</id>
		<title>Hefner at 13:27, 5 April 2024</title>
		<link rel="alternate" type="text/html" href="https://wiki.roatpkz.com/index.php?title=Module:Get_drop_info&amp;diff=19156&amp;oldid=prev"/>
		<updated>2024-04-05T13:27:23Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 13:27, 5 April 2024&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l115&quot;&gt;Line 115:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 115:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     local t1 = os.clock()&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     local t1 = os.clock()&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;    local smwdata = mw.smw.ask(q)&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-added&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     local t2 = os.clock()&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     local t2 = os.clock()&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Hefner</name></author>
	</entry>
	<entry>
		<id>https://wiki.roatpkz.com/index.php?title=Module:Get_drop_info&amp;diff=4349&amp;oldid=prev</id>
		<title>Hefner: 1 revision imported</title>
		<link rel="alternate" type="text/html" href="https://wiki.roatpkz.com/index.php?title=Module:Get_drop_info&amp;diff=4349&amp;oldid=prev"/>
		<updated>2024-03-30T22:33:12Z</updated>

		<summary type="html">&lt;p&gt;1 revision imported&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 22:33, 30 March 2024&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;en&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(No difference)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Hefner</name></author>
	</entry>
	<entry>
		<id>https://wiki.roatpkz.com/index.php?title=Module:Get_drop_info&amp;diff=4348&amp;oldid=prev</id>
		<title>Wilderness&gt;Riblet15: rm trailblazer column</title>
		<link rel="alternate" type="text/html" href="https://wiki.roatpkz.com/index.php?title=Module:Get_drop_info&amp;diff=4348&amp;oldid=prev"/>
		<updated>2024-01-11T01:37:48Z</updated>

		<summary type="html">&lt;p&gt;rm trailblazer column&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
local onmain = require(&amp;#039;Module:Mainonly&amp;#039;).on_main&lt;br /&gt;
local yesno = require(&amp;#039;Module:Yesno&amp;#039;)&lt;br /&gt;
local purge = require(&amp;#039;Module:Purge&amp;#039;)._purge&lt;br /&gt;
local params = require(&amp;#039;Module:Paramtest&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
local images = {&lt;br /&gt;
    agility = &amp;#039;&amp;lt;span class=&amp;quot;drops-agility&amp;quot; style=&amp;quot;margin-left:0.3em;&amp;quot;&amp;gt;[[File:Agility icon.png|link=Agility|frameless|20px]]&amp;lt;/span&amp;gt;&amp;#039;,&lt;br /&gt;
    combat = &amp;#039;&amp;lt;span class=&amp;quot;drops-combat&amp;quot; style=&amp;quot;margin-left:0.3em;&amp;quot;&amp;gt;[[File:Multicombat.png|link=Combat level|frameless|20px]]&amp;lt;/span&amp;gt;&amp;#039;,&lt;br /&gt;
    hunter = &amp;#039;&amp;lt;span class=&amp;quot;drops-hunter&amp;quot; style=&amp;quot;margin-left:0.3em;&amp;quot;&amp;gt;[[File:Hunter icon.png|link=Hunter|frameless|20px]]&amp;lt;/span&amp;gt;&amp;#039;,&lt;br /&gt;
    farming = &amp;#039;&amp;lt;span class=&amp;quot;drops-farming&amp;quot; style=&amp;quot;margin-left:0.3em;&amp;quot;&amp;gt;[[File:Farming icon.png|link=Farming|frameless|20px]]&amp;lt;/span&amp;gt;&amp;#039;,&lt;br /&gt;
    firemaking = &amp;#039;&amp;lt;span class=&amp;quot;drops-firemaking&amp;quot; style=&amp;quot;margin-left:0.3em;&amp;quot;&amp;gt;[[File:Firemaking icon.png|link=Firemaking|frameless|20px]]&amp;lt;/span&amp;gt;&amp;#039;,&lt;br /&gt;
    fishing = &amp;#039;&amp;lt;span class=&amp;quot;drops-fishing&amp;quot; style=&amp;quot;margin-left:0.3em;&amp;quot;&amp;gt;[[File:Fishing icon.png|link=Fishing|frameless|20px]]&amp;lt;/span&amp;gt;&amp;#039;,&lt;br /&gt;
    mining = &amp;#039;&amp;lt;span class=&amp;quot;drops-mining&amp;quot; style=&amp;quot;margin-left:0.3em;&amp;quot;&amp;gt;[[File:Mining icon.png|link=Mining|frameless|20px]]&amp;lt;/span&amp;gt;&amp;#039;,&lt;br /&gt;
    reward = &amp;#039;&amp;lt;span class=&amp;quot;drops-reward&amp;quot; style=&amp;quot;margin-left:0.3em;&amp;quot;&amp;gt;[[File:Casket.png|link=Reward|frameless|20px]]&amp;lt;/span&amp;gt;&amp;#039;,&lt;br /&gt;
    woodcutting  = &amp;#039;&amp;lt;span class=&amp;quot;drops-woodcutting&amp;quot; style=&amp;quot;margin-left:0.3em;&amp;quot;&amp;gt;[[File:Woodcutting icon.png|link=Woodcutting|frameless|20px]]&amp;lt;/span&amp;gt;&amp;#039;,&lt;br /&gt;
    smithing  = &amp;#039;&amp;lt;span class=&amp;quot;drops-smithing&amp;quot; style=&amp;quot;margin-left:0.3em;&amp;quot;&amp;gt;[[File:Smithing icon.png|link=Smithing|frameless|20px]]&amp;lt;/span&amp;gt;&amp;#039;,&lt;br /&gt;
    thieving = &amp;#039;&amp;lt;span class=&amp;quot;drops-thieving&amp;quot; style=&amp;quot;margin-left:0.3em;&amp;quot;&amp;gt;[[File:Thieving icon.png|link=Thieving|frameless|20px]]&amp;lt;/span&amp;gt;&amp;#039;&lt;br /&gt;
}&lt;br /&gt;
--class, sort&lt;br /&gt;
local rarities = {&lt;br /&gt;
    always = { &amp;#039;table-bg-blue&amp;#039;, 1 },&lt;br /&gt;
    common = { &amp;#039;table-bg-green&amp;#039;, 16 },&lt;br /&gt;
    uncommon = { &amp;#039;table-bg-yellow&amp;#039;, 64 },&lt;br /&gt;
    rare = { &amp;#039;table-bg-orange&amp;#039;, 256 },&lt;br /&gt;
    [&amp;#039;very rare&amp;#039;] = { &amp;#039;table-bg-red&amp;#039;, 1024 },&lt;br /&gt;
    random = { &amp;#039;table-bg-pink&amp;#039;, 4096 },&lt;br /&gt;
    varies = { &amp;#039;table-bg-pink&amp;#039;, 4096 },&lt;br /&gt;
    once = { &amp;#039;table-bg-pink&amp;#039;, 65536 },&lt;br /&gt;
    conditional = { &amp;#039;table-bg-pink&amp;#039;, 65536 },&lt;br /&gt;
    _default = { &amp;#039;table-bg-grey&amp;#039;, 65536 }&lt;br /&gt;
}&lt;br /&gt;
-- arbitrary numbers&lt;br /&gt;
local rarities2 = {&lt;br /&gt;
    { 1, &amp;#039;table-bg-blue&amp;#039; },&lt;br /&gt;
    { 1/25, &amp;#039;table-bg-green&amp;#039; },&lt;br /&gt;
    { 1/99.99, &amp;#039;table-bg-yellow&amp;#039; },&lt;br /&gt;
    { 1/999.99, &amp;#039;table-bg-orange&amp;#039; },&lt;br /&gt;
    { 1/9999999, &amp;#039;table-bg-red&amp;#039; }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local lang = mw.language.getContentLanguage()&lt;br /&gt;
local commas = function (n) return lang:formatNum(tonumber(n)) end&lt;br /&gt;
&lt;br /&gt;
local _noted = &amp;#039;&amp;amp;nbsp;&amp;lt;span class=&amp;quot;dropsline-noted&amp;quot;&amp;gt;(noted)&amp;lt;/span&amp;gt;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
-- supporting function for number =&amp;gt; colour&lt;br /&gt;
function get_rarity_class(val)&lt;br /&gt;
    for i,v in ipairs(rarities2) do&lt;br /&gt;
        curr = v&lt;br /&gt;
        if val &amp;gt;= v[1] then&lt;br /&gt;
            break&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return curr[2]&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function expr(t)&lt;br /&gt;
    t = t:gsub(&amp;#039;,&amp;#039;, &amp;#039;&amp;#039;)&lt;br /&gt;
    local err, val = pcall(mw.ext.ParserFunctions.expr, t)&lt;br /&gt;
    if err then&lt;br /&gt;
        return tonumber(val)&lt;br /&gt;
    else&lt;br /&gt;
        return false&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function sigfig(n, f)&lt;br /&gt;
    f = math.floor(f-1)&lt;br /&gt;
    if n == 0 then return 0 end&lt;br /&gt;
    local m = math.floor(math.log10(n))&lt;br /&gt;
    f = math.max(m, f)&lt;br /&gt;
    local v = n / (10^(m-f))&lt;br /&gt;
    v = math.floor(v + 0.5) * 10^(m-f)&lt;br /&gt;
    return v&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.main(frame)&lt;br /&gt;
    return p._main(frame:getParent().args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._main(args)&lt;br /&gt;
    local item = args.item or args[1]&lt;br /&gt;
    local skipheader = yesno(params.default_to(args.skipheader,&amp;#039;no&amp;#039;))&lt;br /&gt;
    local smwitem&lt;br /&gt;
    if item then&lt;br /&gt;
        local cleanedName = item&lt;br /&gt;
        local dropVers = &amp;#039;&amp;#039;&lt;br /&gt;
        if item:match(&amp;#039; ?%(%d%)$&amp;#039;) then&lt;br /&gt;
            cleanedName, dropVers = mw.ustring.match(item, &amp;#039;^(.-) ?(%(%d%))$&amp;#039;)&lt;br /&gt;
        elseif item:match(&amp;#039; ?%(p%+*%)$&amp;#039;) then&lt;br /&gt;
            cleanedName, dropVers = mw.ustring.match(item, &amp;#039;^(.-) ?(%(p%+*%))$&amp;#039;)&lt;br /&gt;
        elseif item:match(&amp;#039;%#&amp;#039;) then&lt;br /&gt;
            cleanedName, dropVers = mw.ustring.match(item, &amp;#039;^(.-)%#([%w%s%(%)]+)$&amp;#039;)&lt;br /&gt;
        end&lt;br /&gt;
        if dropVers ~= nil and dropVers ~= &amp;#039;&amp;#039; then&lt;br /&gt;
            smwitem = cleanedName .. &amp;#039;#&amp;#039; .. dropVers&lt;br /&gt;
        end&lt;br /&gt;
    else&lt;br /&gt;
        item = mw.title.getCurrentTitle().text&lt;br /&gt;
    end&lt;br /&gt;
    if not smwitem then&lt;br /&gt;
        smwitem = item&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local q = {&lt;br /&gt;
        &amp;#039;[[Dropped item::&amp;#039;..smwitem..&amp;#039;]]&amp;#039;,&lt;br /&gt;
        &amp;#039;?Drop JSON&amp;#039;,&lt;br /&gt;
        limit = args.limit or 500,&lt;br /&gt;
    }&lt;br /&gt;
    if args.incrdt == &amp;#039;y&amp;#039; then&lt;br /&gt;
        q[1] = &amp;#039;[[Dropped item::&amp;#039;..smwitem..&amp;#039;]] OR [[Dropped item from RDT::&amp;#039;..smwitem..&amp;#039;]]&amp;#039;&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local t1 = os.clock()&lt;br /&gt;
    local smwdata = mw.smw.ask(q)&lt;br /&gt;
    local t2 = os.clock()&lt;br /&gt;
&lt;br /&gt;
    if not smwdata then&lt;br /&gt;
        return &amp;quot;:&amp;#039;&amp;#039;No drop sources found. To force an update, click &amp;quot;&lt;br /&gt;
                ..purge(&amp;#039;dml-&amp;#039;..mw.uri.anchorEncode(item), &amp;#039;here&amp;#039;, &amp;#039;span&amp;#039;)&lt;br /&gt;
                ..&amp;quot;.&amp;#039;&amp;#039;[[Category:Empty drop lists]]&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    mw.log(string.format(&amp;#039;SMW: entries: %d, time elapsed: %.3f ms.&amp;#039;, #smwdata, (t2 - t1) * 1000))&lt;br /&gt;
&lt;br /&gt;
    if params.has_content(args.sort) then&lt;br /&gt;
        assert(smwdata[1][args.sort], &amp;#039;Invalid sorting key specified.&amp;#039;)&lt;br /&gt;
        table.sort(smwdata, function(a, b) return a[args.sort] &amp;lt; b[args.sort] end)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local ret = {}&lt;br /&gt;
    if smwdata then&lt;br /&gt;
        for i,v in ipairs(smwdata) do&lt;br /&gt;
            local dropJSON = mw.text.jsonDecode(v[&amp;#039;Drop JSON&amp;#039;] or &amp;#039;{}&amp;#039;)&lt;br /&gt;
            table.insert(ret, makeLine(item, dropJSON))&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    local t = mw.html.create(&amp;#039;table&amp;#039;)&lt;br /&gt;
    t   :addClass(&amp;#039;wikitable sortable filterable item-drops align-center-2 align-center-3 align-center-4 autosort=4,a&amp;#039;)&lt;br /&gt;
        :tag(&amp;#039;tr&amp;#039;)&lt;br /&gt;
            :tag(&amp;#039;th&amp;#039;):addClass(&amp;#039;drop-disp-btn btn-first&amp;#039;):wikitext(&amp;#039;Source&amp;#039;):done()&lt;br /&gt;
            :tag(&amp;#039;th&amp;#039;):wikitext(&amp;#039;Level&amp;#039;):done()&lt;br /&gt;
            :tag(&amp;#039;th&amp;#039;):wikitext(&amp;#039;Quantity&amp;#039;):done()&lt;br /&gt;
            :tag(&amp;#039;th&amp;#039;):wikitext(&amp;#039;Rarity&amp;#039;):addClass(&amp;#039;drops-rarity-header&amp;#039;):done()&lt;br /&gt;
    for i,v in ipairs(ret) do&lt;br /&gt;
        t:node(v)&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    if skipheader then&lt;br /&gt;
        return tostring(t)&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    local text = {&lt;br /&gt;
        &amp;quot;&amp;lt;div class=\&amp;quot;seealso\&amp;quot;&amp;gt;For an exhaustive list of all known sources for this item, see &amp;lt;span class=&amp;#039;plainlinks&amp;#039;&amp;gt;[&amp;quot;, tostring(mw.uri.fullUrl(&amp;#039;RuneScape:Autolists/full&amp;#039;))..&amp;#039;#&amp;#039;..mw.uri.buildQueryString({type=&amp;#039;drops&amp;#039;,page=smwitem}), &amp;quot; here]&amp;lt;/span&amp;gt;.&amp;lt;/div&amp;gt;\n&amp;quot;,&lt;br /&gt;
        tostring(t)&lt;br /&gt;
    }&lt;br /&gt;
    local cat = &amp;#039;&amp;#039;&lt;br /&gt;
    if smwdata and onmain() then&lt;br /&gt;
        cat = &amp;#039;[[Category:Items dropped by monster]]&amp;#039;&lt;br /&gt;
        table.insert(text, cat)&lt;br /&gt;
    end&lt;br /&gt;
    return table.concat(text, &amp;#039;&amp;#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function makeLine(item, data)&lt;br /&gt;
    local dropType = data[&amp;#039;Drop type&amp;#039;] or &amp;#039;combat&amp;#039;&lt;br /&gt;
    local img = images[dropType]&lt;br /&gt;
    if img == nil then&lt;br /&gt;
        return nil&lt;br /&gt;
    end&lt;br /&gt;
    local level = data[&amp;#039;Drop level&amp;#039;] or &amp;#039;Not Available&amp;#039;&lt;br /&gt;
    local levelsort = data[&amp;#039;Drop level&amp;#039;] or -1&lt;br /&gt;
    if dropType == &amp;#039;reward&amp;#039; then&lt;br /&gt;
        level = &amp;#039;N/A&amp;#039;&lt;br /&gt;
        levelsort = -1000&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    if string.find(level, &amp;#039;,&amp;#039;) then&lt;br /&gt;
        levelsort = tonumber(mw.text.split(level, &amp;#039;,&amp;#039;)[1])&lt;br /&gt;
        level = level:gsub(&amp;#039;,&amp;#039;, &amp;#039;; &amp;#039;)&lt;br /&gt;
    end&lt;br /&gt;
    local cleanSrc = data[&amp;#039;Dropped from&amp;#039;] or &amp;#039;&amp;#039;&lt;br /&gt;
    local splitSrc = mw.text.split(data[&amp;#039;Dropped from&amp;#039;] or &amp;#039;&amp;#039;, &amp;#039;%#&amp;#039;)&lt;br /&gt;
    if #splitSrc == 2 then&lt;br /&gt;
        splitSrc[2] = splitSrc[2]:gsub(&amp;#039;_&amp;#039;, &amp;#039; &amp;#039;)&lt;br /&gt;
        cleanSrc = string.format(&amp;#039;%s|%s &amp;lt;span class=&amp;quot;beast-version&amp;quot;&amp;gt;%s&amp;lt;/span&amp;gt;&amp;#039;, cleanSrc, splitSrc[1], splitSrc[2])&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    return line(cleanSrc, data[&amp;#039;Name Notes&amp;#039;], level, img, levelsort, data[&amp;#039;Drop Quantity&amp;#039;], &amp;#039;&amp;#039;, data[&amp;#039;Rarity&amp;#039;], data[&amp;#039;Alt Rarity&amp;#039;], data[&amp;#039;Alt Rarity Dash&amp;#039;], dropType, data[&amp;#039;Rolls&amp;#039;])&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function line(name,namenotes,&lt;br /&gt;
        combat,cbnotes,dtype,&lt;br /&gt;
        quantity,quantitynotes,&lt;br /&gt;
        rarity,altrarity,altraritydash,dtype,rolls)&lt;br /&gt;
    &lt;br /&gt;
    -- missing notes to empty string (and not nil)&lt;br /&gt;
    namenotes = namenotes or &amp;#039;&amp;#039;&lt;br /&gt;
    cbnotes = cbnotes or &amp;#039;&amp;#039;&lt;br /&gt;
    quantitynotes = quantitynotes or &amp;#039;&amp;#039;&lt;br /&gt;
    local rarity_value&lt;br /&gt;
    if rarities[string.lower(tostring(rarity))] then&lt;br /&gt;
        rarity = params.ucflc(rarity)&lt;br /&gt;
    else&lt;br /&gt;
        rarity_value = rarity:gsub(&amp;#039;,&amp;#039;,&amp;#039;&amp;#039;) --temp place to put this without overriding rarity&lt;br /&gt;
        local rv1, rv2 = string.match(rarity_value, &amp;#039;([%d%.]+)/([%d%.]+)&amp;#039;)&lt;br /&gt;
        if rv1 and rv2 then&lt;br /&gt;
            rarity = commas(rv1) .. &amp;#039;/&amp;#039; .. commas(rv2)&lt;br /&gt;
            rarity_value = rv1/rv2&lt;br /&gt;
        else&lt;br /&gt;
            rarity_value = expr(rarity)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local rare_class, rare_sort = &amp;#039;&amp;#039;, nil&lt;br /&gt;
    if rarity_value == undefined then&lt;br /&gt;
        rare_class, rare_sort = unpack(rarities[string.lower(tostring(rarity))] or rarities._default)&lt;br /&gt;
    elseif rarity_value == false then&lt;br /&gt;
        rare_class, rare_sort = unpack(rarities._default)&lt;br /&gt;
    else&lt;br /&gt;
        rare_sort = 1/rarity_value&lt;br /&gt;
        rare_class = get_rarity_class(rarity_value)&lt;br /&gt;
    end&lt;br /&gt;
    local rollstext = &amp;#039;&amp;#039;&lt;br /&gt;
    if rolls ~= 1 and rolls then&lt;br /&gt;
        rollstext = rolls .. &amp;#039; × &amp;#039;&lt;br /&gt;
        rare_sort = rare_sort / rolls&lt;br /&gt;
        rare_class = get_rarity_class(math.min(1/rare_sort,0.99))&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    -- Clean up the lists&lt;br /&gt;
    quantity = qty(quantity)&lt;br /&gt;
    local qtysort = mw.text.split(quantity, &amp;#039;[^%d,]&amp;#039;)[1]&lt;br /&gt;
    if qtysort == &amp;#039;&amp;#039; then&lt;br /&gt;
        qtysort = 0&lt;br /&gt;
    end&lt;br /&gt;
    local cmbclass = &amp;#039;&amp;#039;&lt;br /&gt;
    local cmbsort = combat&lt;br /&gt;
    if combat == &amp;#039;N/A&amp;#039; then&lt;br /&gt;
        cmbclass = &amp;#039;table-na&amp;#039;&lt;br /&gt;
        cmbsort = 0&lt;br /&gt;
    else&lt;br /&gt;
        combat, cmbsort = cmb(combat)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- Check if name is already formated&lt;br /&gt;
    if name:match(&amp;#039;^%[%[&amp;#039;) then&lt;br /&gt;
        name = name&lt;br /&gt;
    else&lt;br /&gt;
        name = &amp;#039;[[&amp;#039;..name..&amp;#039;]]&amp;#039;&lt;br /&gt;
    end&lt;br /&gt;
    if #namenotes &amp;gt; 5 then&lt;br /&gt;
        name = name..&amp;#039; &amp;#039;..namenotes&lt;br /&gt;
    end&lt;br /&gt;
    if #cbnotes &amp;gt; 5 then&lt;br /&gt;
        combat = combat..&amp;#039; &amp;#039;..cbnotes&lt;br /&gt;
    end&lt;br /&gt;
    if #quantitynotes &amp;gt; 5 then&lt;br /&gt;
        quantity = quantity..&amp;#039; &amp;#039;..quantitynotes&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    -- Table row creation&lt;br /&gt;
    local ret = mw.html.create(&amp;#039;tr&amp;#039;)&lt;br /&gt;
    ret     :tag(&amp;#039;td&amp;#039;)&lt;br /&gt;
                :wikitext(name)&lt;br /&gt;
            :done()&lt;br /&gt;
            :tag(&amp;#039;td&amp;#039;)&lt;br /&gt;
                :wikitext(combat)&lt;br /&gt;
                :addClass(cmbclass)&lt;br /&gt;
                :attr(&amp;#039;data-sort-value&amp;#039;, cmbsort)&lt;br /&gt;
            :done()&lt;br /&gt;
            :tag(&amp;#039;td&amp;#039;)&lt;br /&gt;
                :attr(&amp;#039;data-sort-value&amp;#039;, qtysort)&lt;br /&gt;
                :wikitext(quantity)&lt;br /&gt;
            :done()&lt;br /&gt;
    local rarity_cell = ret:tag(&amp;#039;td&amp;#039;)&lt;br /&gt;
    local rarity_span = rarity_cell:tag(&amp;#039;span&amp;#039;)&lt;br /&gt;
    rarity_span:wikitext(rollstext .. rarity)&lt;br /&gt;
    rarity_cell:attr(&amp;#039;data-sort-value&amp;#039;, rare_sort)&lt;br /&gt;
        :addClass(rare_class)&lt;br /&gt;
    :done()&lt;br /&gt;
    &lt;br /&gt;
    if type(rarity_value) == &amp;#039;number&amp;#039; then&lt;br /&gt;
        rarity_span:attr({&lt;br /&gt;
            [&amp;#039;title&amp;#039;] = rollstext .. string.format(&amp;#039;%.3g%%&amp;#039;, 100 * rarity_value),&lt;br /&gt;
            [&amp;#039;data-drop-fraction&amp;#039;] = rollstext .. rarity,&lt;br /&gt;
            [&amp;#039;data-drop-oneover&amp;#039;] = rollstext .. &amp;#039;1/&amp;#039; .. commas(sigfig(1/rarity_value, 4)),&lt;br /&gt;
            [&amp;#039;data-drop-percent&amp;#039;] = rollstext .. sigfig(100 * rarity_value, 3),&lt;br /&gt;
            [&amp;#039;data-drop-permil&amp;#039;] = rollstext .. sigfig(1000 * rarity_value, 3),&lt;br /&gt;
            [&amp;#039;data-drop-permyriad&amp;#039;] = rollstext .. sigfig(10000 * rarity_value, 3),&lt;br /&gt;
        })&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    if altrarity ~= &amp;#039;&amp;#039; and altrarity ~= nil then&lt;br /&gt;
        local alt_rarity_value&lt;br /&gt;
        if rarities[string.lower(tostring(altrarity))] then&lt;br /&gt;
            altrarity = params.ucflc(altrarity)&lt;br /&gt;
        else&lt;br /&gt;
            alt_rarity_value = altrarity:gsub(&amp;#039;,&amp;#039;,&amp;#039;&amp;#039;) --temp place to put this without overriding rarity&lt;br /&gt;
            local rv1, rv2 = string.match(alt_rarity_value, &amp;#039;([%d%.]+)/([%d%.]+)&amp;#039;)&lt;br /&gt;
            if rv1 and rv2 then&lt;br /&gt;
                altrarity = commas(rv1) .. &amp;#039;/&amp;#039; .. commas(rv2)&lt;br /&gt;
                alt_rarity_value = rv1/rv2&lt;br /&gt;
            else&lt;br /&gt;
                alt_rarity_value = expr(altrarity)&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
        &lt;br /&gt;
        if altraritydash  ~= &amp;#039;&amp;#039; and altraritydash ~= nil then&lt;br /&gt;
            rarity_cell:tag(&amp;#039;span&amp;#039;):wikitext(&amp;#039;–&amp;#039;)&lt;br /&gt;
        else&lt;br /&gt;
            rarity_cell:tag(&amp;#039;span&amp;#039;):wikitext(&amp;#039;; &amp;#039;)&lt;br /&gt;
        end&lt;br /&gt;
        &lt;br /&gt;
        local altrarityspan = rarity_cell:tag(&amp;#039;span&amp;#039;)&lt;br /&gt;
        altrarityspan:wikitext(altrarity)&lt;br /&gt;
        if type(alt_rarity_value) == &amp;#039;number&amp;#039; then&lt;br /&gt;
            altrarityspan:attr({&lt;br /&gt;
                [&amp;#039;data-drop-fraction&amp;#039;] = altrarity,&lt;br /&gt;
                [&amp;#039;data-drop-oneover&amp;#039;] = &amp;#039;1/&amp;#039; .. commas(sigfig(1/alt_rarity_value, 3)),&lt;br /&gt;
                [&amp;#039;data-drop-percent&amp;#039;] = sigfig(100 * alt_rarity_value, 3),&lt;br /&gt;
                [&amp;#039;data-drop-permil&amp;#039;] = sigfig(1000 * alt_rarity_value, 3),&lt;br /&gt;
                [&amp;#039;data-drop-permyriad&amp;#039;] = sigfig(10000 * alt_rarity_value, 3),&lt;br /&gt;
            })&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return ret:done()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function qty(quantity)&lt;br /&gt;
    -- if no quantity is given, return unknown&lt;br /&gt;
    if not quantity or quantity == &amp;#039;unknown&amp;#039; then&lt;br /&gt;
        return &amp;#039;Unknown&amp;#039;&lt;br /&gt;
    end&lt;br /&gt;
    -- en dashes are the proper dash for number ranges&lt;br /&gt;
    -- replace all hyphens and em dashes with en&lt;br /&gt;
    -- strip *all* whitespace&lt;br /&gt;
    -- change &amp;#039;(noted)&amp;#039; to &amp;#039;$n&amp;#039; for parsing&lt;br /&gt;
    quantity = mw.ustring.gsub(quantity,&amp;#039;[-—]&amp;#039;,&amp;#039;–&amp;#039;)&lt;br /&gt;
        :gsub(&amp;#039;%s&amp;#039;,&amp;#039;&amp;#039;)&lt;br /&gt;
        :gsub(&amp;#039;%(noted%)&amp;#039;,&amp;#039;$n&amp;#039;)&lt;br /&gt;
    -- split list into table&lt;br /&gt;
    local vals = mw.text.split(quantity,&amp;#039;[,;]&amp;#039;)&lt;br /&gt;
    -- recreate the quantity string to ensure consistent formatting&lt;br /&gt;
    local numstr = {}&lt;br /&gt;
    for i, v in ipairs(vals) do&lt;br /&gt;
        local clean = v:gsub(&amp;#039;$n&amp;#039;,&amp;#039;&amp;#039;)&lt;br /&gt;
        -- if list element contains an en dash (indicating range)&lt;br /&gt;
        -- Find the smaller/larger number (just in case)&lt;br /&gt;
        -- Compare them to the current min/max&lt;br /&gt;
        -- put them in order with desired format&lt;br /&gt;
        if mw.ustring.find(v,&amp;#039;–&amp;#039;) then&lt;br /&gt;
            local splitvals = mw.text.split(clean,&amp;#039;–&amp;#039;)&lt;br /&gt;
            -- assume a is smaller, b is larger&lt;br /&gt;
            local a = tonumber(splitvals[1])&lt;br /&gt;
            local b = tonumber(splitvals[2])&lt;br /&gt;
            -- Just in case&lt;br /&gt;
            if a and b then&lt;br /&gt;
                if a &amp;gt; b then&lt;br /&gt;
                    a,b = b,a&lt;br /&gt;
                end&lt;br /&gt;
                addx = commas(a)..&amp;#039;–&amp;#039;..commas(b)&lt;br /&gt;
            else&lt;br /&gt;
                addx = splitvals[1]..&amp;#039;–&amp;#039;..splitvals[2]&lt;br /&gt;
            end&lt;br /&gt;
            if v:find(&amp;#039;$n&amp;#039;) then&lt;br /&gt;
                addx = addx.._noted&lt;br /&gt;
            end&lt;br /&gt;
            table.insert(numstr,addx)&lt;br /&gt;
        else&lt;br /&gt;
            local addx = tonumber(clean) ~= nil and commas(tonumber(clean)) or clean&lt;br /&gt;
            if v:find(&amp;#039;$n&amp;#039;) then&lt;br /&gt;
                addx = addx.._noted&lt;br /&gt;
            end&lt;br /&gt;
            table.insert(numstr,addx)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    -- To prevent any possible confusion with formatted numbers&lt;br /&gt;
    -- elements should be separated with semicolons followed by a space&lt;br /&gt;
    numstr = table.concat(numstr,&amp;#039;; &amp;#039;)&lt;br /&gt;
    if numstr:find(&amp;#039;%d&amp;#039;) then&lt;br /&gt;
        return numstr&lt;br /&gt;
    else&lt;br /&gt;
        return &amp;#039;Unknown&amp;#039;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function cmb(levels)&lt;br /&gt;
    -- if no level is given, return unknown&lt;br /&gt;
    if not levels then&lt;br /&gt;
        return &amp;#039;Unknown&amp;#039;, 0&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- split list into table&lt;br /&gt;
    -- recreate the list string to ensure consistent formatting&lt;br /&gt;
    local numstr = {}&lt;br /&gt;
    for v in mw.text.gsplit(levels, &amp;#039;[,;]&amp;#039;) do&lt;br /&gt;
        v = mw.text.trim(v)&lt;br /&gt;
        table.insert(numstr,tonumber(v))&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    table.sort(numstr)&lt;br /&gt;
    &lt;br /&gt;
    -- give a range if 5+ combat levels&lt;br /&gt;
    if #numstr &amp;gt; 4 then&lt;br /&gt;
        return numstr[1] .. &amp;#039;–&amp;#039; .. numstr[#numstr], numstr[1]&lt;br /&gt;
    end&lt;br /&gt;
    -- To prevent any possible confusion with formatted numbers&lt;br /&gt;
    -- elements should be separated with semicolons followed by a space&lt;br /&gt;
    return table.concat(numstr,&amp;#039;; &amp;#039;), numstr[1] or 0&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[ DEBUG COPYPASTA&lt;br /&gt;
= p._main({item = &amp;#039;Iron bar&amp;#039;})&lt;br /&gt;
--]]&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Wilderness&gt;Riblet15</name></author>
	</entry>
</feed>