<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.ce.skimnerphi.net/index.php?action=history&amp;feed=atom&amp;title=Module%3AShapeViewer%2FCore</id>
	<title>Module:ShapeViewer/Core - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.ce.skimnerphi.net/index.php?action=history&amp;feed=atom&amp;title=Module%3AShapeViewer%2FCore"/>
	<link rel="alternate" type="text/html" href="https://wiki.ce.skimnerphi.net/index.php?title=Module:ShapeViewer/Core&amp;action=history"/>
	<updated>2026-05-24T09:58:57Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.45.1</generator>
	<entry>
		<id>https://wiki.ce.skimnerphi.net/index.php?title=Module:ShapeViewer/Core&amp;diff=157&amp;oldid=prev</id>
		<title>Dengr1065: Initial version of SVG shape viewer</title>
		<link rel="alternate" type="text/html" href="https://wiki.ce.skimnerphi.net/index.php?title=Module:ShapeViewer/Core&amp;diff=157&amp;oldid=prev"/>
		<updated>2026-02-04T01:13:15Z</updated>

		<summary type="html">&lt;p&gt;Initial version of SVG shape viewer&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 colors = {&lt;br /&gt;
    r = &amp;quot;#ff666a&amp;quot;,&lt;br /&gt;
    g = &amp;quot;#78ff66&amp;quot;,&lt;br /&gt;
    b = &amp;quot;#66a7ff&amp;quot;,&lt;br /&gt;
    y = &amp;quot;#fcf52a&amp;quot;,&lt;br /&gt;
    m = &amp;quot;#f066f0&amp;quot;,&lt;br /&gt;
    p = &amp;quot;#dd66ff&amp;quot;,&lt;br /&gt;
    c = &amp;quot;#87fff5&amp;quot;,&lt;br /&gt;
    w = &amp;quot;#ffffff&amp;quot;,&lt;br /&gt;
    u = &amp;quot;#aaaaaa&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local function rotate(x, y, rot)&lt;br /&gt;
    if rot == 0 then&lt;br /&gt;
        return x, y&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if rot == 1 then&lt;br /&gt;
        return -y, x&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if rot == 2 then&lt;br /&gt;
        return -x, -y&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if rot == 3 then&lt;br /&gt;
        return y, -x&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function point(x, y, rotation, scale)&lt;br /&gt;
    local tx, ty = rotate(x * scale, y * scale, rotation)&lt;br /&gt;
    return tostring(tx) .. &amp;quot; &amp;quot; .. tostring(ty) .. &amp;quot; &amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local paths = {}&lt;br /&gt;
&lt;br /&gt;
function paths.C(rotation, scale)&lt;br /&gt;
    return &amp;quot;M 14 14 l&amp;quot;&lt;br /&gt;
        .. point(0, -10, rotation, scale)&lt;br /&gt;
        .. &amp;quot;a&amp;quot; .. point(10, 10, 0, scale)&lt;br /&gt;
        .. &amp;quot;0 0 1 &amp;quot;&lt;br /&gt;
        .. point(10, 10, rotation, scale)&lt;br /&gt;
        .. &amp;quot;z&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function paths.R(rotation, scale)&lt;br /&gt;
    return &amp;quot;M 14 14 l&amp;quot;&lt;br /&gt;
        .. point(0, -10, rotation, scale)&lt;br /&gt;
        .. point(10, 0, rotation, scale)&lt;br /&gt;
        .. point(0, 10, rotation, scale)&lt;br /&gt;
        .. &amp;quot;z&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function paths.S(rotation, scale)&lt;br /&gt;
    return &amp;quot;M 14 14 l&amp;quot;&lt;br /&gt;
        .. point(0, -6, rotation, scale)&lt;br /&gt;
        .. point(10, -4, rotation, scale)&lt;br /&gt;
        .. point(-4, 10, rotation, scale)&lt;br /&gt;
        .. &amp;quot;z&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function paths.W(rotation, scale)&lt;br /&gt;
    return &amp;quot;M 14 14 l&amp;quot;&lt;br /&gt;
        .. point(0, -6, rotation, scale)&lt;br /&gt;
        .. point(10, -4, rotation, scale)&lt;br /&gt;
        .. point(0, 10, rotation, scale)&lt;br /&gt;
        .. &amp;quot;z&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function isempty(subshape, color)&lt;br /&gt;
    local part = subshape .. color&lt;br /&gt;
&lt;br /&gt;
    if subshape ~= &amp;quot;-&amp;quot; and color == &amp;quot;-&amp;quot; then&lt;br /&gt;
        error(&amp;quot;missing color in part &amp;quot; .. part)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if subshape == &amp;quot;-&amp;quot; and color ~= &amp;quot;-&amp;quot; then&lt;br /&gt;
        error(&amp;quot;missing subshape in part &amp;quot; .. part)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return part == &amp;quot;--&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function generatelayer(code, scale, index)&lt;br /&gt;
    if #code ~= 8 then&lt;br /&gt;
        error(&amp;quot;invalid layer length &amp;quot; .. index)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if code == &amp;quot;--------&amp;quot; then&lt;br /&gt;
        error(&amp;quot;empty layer &amp;quot; .. index)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local parts = {}&lt;br /&gt;
&lt;br /&gt;
    for i = 1, #code, 2 do&lt;br /&gt;
        local subshape = string.sub(code, i, i)&lt;br /&gt;
        local color = string.sub(code, i + 1, i + 1)&lt;br /&gt;
&lt;br /&gt;
        if not isempty(subshape, color) then&lt;br /&gt;
            local generatepath = paths[subshape]&lt;br /&gt;
            local fill = colors[color]&lt;br /&gt;
    &lt;br /&gt;
            if not generatepath then&lt;br /&gt;
                error(&amp;quot;unknown subshape &amp;quot; .. subshape)&lt;br /&gt;
            end&lt;br /&gt;
    &lt;br /&gt;
            if not fill then&lt;br /&gt;
                error(&amp;quot;unknown color &amp;quot; .. color)&lt;br /&gt;
            end&lt;br /&gt;
    &lt;br /&gt;
            local d = generatepath((i - 1) / 2, scale)&lt;br /&gt;
            local path = ([[&amp;lt;path d=&amp;quot;%s&amp;quot; fill=&amp;quot;%s&amp;quot; /&amp;gt;]]):format(d, fill)&lt;br /&gt;
            table.insert(parts, path)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return table.concat(parts)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.generate(code, size, shadow)	&lt;br /&gt;
    -- Vanilla leaves some blank space, cut it off&lt;br /&gt;
    local margin = shadow and 2.5 or 4&lt;br /&gt;
    local viewbox = 28 - margin * 2&lt;br /&gt;
&lt;br /&gt;
    local svg = string.format(&lt;br /&gt;
        [[&lt;br /&gt;
        &amp;lt;svg&lt;br /&gt;
            class=&amp;quot;shapez-shape&amp;quot;&lt;br /&gt;
            width=&amp;quot;%d&amp;quot;&lt;br /&gt;
            height=&amp;quot;%d&amp;quot;&lt;br /&gt;
            viewBox=&amp;quot;%f %f %f %f&amp;quot;&lt;br /&gt;
            stroke=&amp;quot;#555&amp;quot;&amp;gt;&lt;br /&gt;
        ]],&lt;br /&gt;
        size,&lt;br /&gt;
        size,&lt;br /&gt;
        margin,&lt;br /&gt;
        margin,&lt;br /&gt;
        viewbox,&lt;br /&gt;
        viewbox)&lt;br /&gt;
&lt;br /&gt;
    if shadow then&lt;br /&gt;
        svg = svg .. [[&lt;br /&gt;
        &amp;lt;circle cx=&amp;quot;14&amp;quot; cy=&amp;quot;14&amp;quot; r=&amp;quot;11.5&amp;quot;&lt;br /&gt;
            fill=&amp;quot;rgba(40, 50, 65, 0.1)&amp;quot;&lt;br /&gt;
            stroke=&amp;quot;none&amp;quot; /&amp;gt;&lt;br /&gt;
        ]]&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local currentlayer = 0&lt;br /&gt;
    for layer in string.gmatch(code, &amp;quot;[^:]+&amp;quot;) do&lt;br /&gt;
        currentlayer = currentlayer + 1&lt;br /&gt;
&lt;br /&gt;
        if currentlayer == 5 then&lt;br /&gt;
            error(&amp;quot;too many layers&amp;quot;)&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        -- Adjusted for index starting from 1&lt;br /&gt;
        local scale = 1.12 - 0.22 * currentlayer&lt;br /&gt;
        svg = svg .. generatelayer(layer, scale, currentlayer)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return svg .. &amp;quot;&amp;lt;/svg&amp;gt;&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Dengr1065</name></author>
	</entry>
</feed>