Modul:Benutzer:Thornard/Vorlage:Schachbrett

Die Dokumentation für dieses Modul kann unter Modul:Benutzer:Thornard/Vorlage:Schachbrett/Doku erstellt werden

local function trim(text)
    while mw.ustring.sub(text,1,1) == " " do
        text=  mw.ustring.sub(text,2,-1);
    end
    while mw.ustring.sub(text,-1,-1) == " " do
        text=  mw.ustring.sub(text,1,-2);
    end
    return text;
end

local p = {}
    -- Erzeugt aus einem String aus algebraischer Notation für die Parameter Z1 bis Z8
    -- Die Funktion ist nicht sehr effektiv, da für jede Zeile die komplette Stellung ermittelt werden muss.
    function p.GetAlgebraicRow(frame)
        local board = {}
        local result = '';
        local acn = frame.args['Algebraic'] or ''
        local idx =  tonumber(frame.args['Z']) or 1 ;

        local replace_color     = { ['W']='l', ['S']='d' }
        local replace_piece     = { ['K']='k', ['D']='q', ['T']='r', ['S']='n', ['L']='b', ['B']='p', ['G']='g', ['N']='s' }
        local replace_piece_ENG = { ['K']='k', ['Q']='q', ['R']='r', ['N']='n', ['B']='b', ['P']='p', ['G']='g', ['S']='s' }
        local replace_file =      { ['a']=1,   ['b']=2,   ['c']=3,   ['d']=4,
                                    ['e']=5,   ['f']=6,   ['g']=7,   ['h']=8 }

        -- Brett wird "leer" vorbelegt.
        for i = 1, 8 do
            board[i] = {}
            for j = 1, 8 do
                board[i][j] = '--'
            end
        end

        -- Dies sind die Vorgaben
        local default_color = 'l' -- Weiß
        local default_piece = 'p' -- Bauer

        acn = trim(acn)
        while string.len(acn) > 0 do
            _, _, piece, file, line = string.find(acn, "^(%a)(%w)(%d)");
            if (piece ~= nil) and (file ~= nil) and (line ~= nil) then
                default_piece = replace_piece[piece]
                board[replace_file[file]][tonumber(line)] = default_piece .. default_color
                -- Es werden die ersten 4 Zeichen abgetrennt, so dass ein Trennzeichen auch
                -- entfernt wird.
                acn = string.sub(acn,5,-1)
            else

                -- einfache algebraische Koordinaten sind ein Spielstein des aktuellen Typs
                -- Achtung: Dies sind nicht Bauchern
                _, _, file, line = string.find(acn, "^(%a)(%d)");
                if (file ~= nil) and (line ~= nil) then
                    board[replace_file[file]][tonumber(line)] = default_piece .. default_color
                    acn = string.sub(acn,4,-1)
                else

                    -- mit W und S kann die Farbe gesetzt werden
                    _, _, color = string.find(acn, "^(%a)");
                    if (color ~= nil) then
                        if color == 'W' then default_color = replace_color[color] end
                        if color == 'S' then default_color = replace_color[color] end
                        acn = string.sub(acn,3,-1)
                    else

                        -- ein Bindestrich setzt die Farbe auf Schwarz
                        color = string.find(acn, "^%-");
                        if (color ~= nil) then
                            default_color = 'd'
                            default_piece = 'p'
                            acn = string.sub(acn,2,-1)
                        else
                            -- Wenn irgendetwas nicht funktioniert wird einfach eine
                            -- leere Zeile zurückgegeben.
                            return '--/--/--/--/--/--/--/--/'
                        end
                    end
                end
            end

            acn = trim(acn);
        end

        -- String für die entsprechende Zeile zusammenbauen
        for i = 1,8 do
            result = result .. board[i][idx] .. '/';
        end

        return result;
    end

return p;