From Wikipedia, the free encyclopedia
Note: After saving, you have to bypass your browser's cache to see the changes. Google Chrome, Firefox, Microsoft Edge and Safari: Hold down the ⇧ Shift key and click the Reload toolbar button. For details and instructions about other browsers, see Wikipedia:Bypass your cache.

// <nowiki>

window.alignerDebug = false;



window.alignerDefaultSearches = 

    "{{infobox",

    "{{speciesbox",

    "{{taxobox",

    '{{automatic taxobox',

];



window.alignerExtraSearches = [];



mw.loader.using(['mediawiki.util'], function () {

    if (mw.config.get('wgAction') !== 'edit' && mw.config.get('wgAction') !== 'submit') {

        return;

    }



    mw.util.addPortletLink('p-cactions', 'javascript:void(0);', 'Align template params', 'us-majavah-align');

    $('#us-majavah-align').click(function () {

        const splitParam = string => {

            const split = string.split('=');

            if (split.length <= 2) {

                return split;

            }



            let first = split.shift();

            return first, split.join('=')];

        };



        const splitIntoParams = string => {

            if (string.startsWith('{{') && string.endsWith('}}')) {

                if (!string.includes('|')) {

                    return string];

                }



                const results = splitIntoParams(string.slice(2, -2));

                return '{{' + results0]].concat(splitIntoParams(string.slice(2, -2)).slice(1), '}}']);

            }



            const params = [];

            let temp = '';

            let open = 0;



            for (let i = 0; i < string.length; i++) {

                const char = stringi];

                temp += char;



                if (char === '{' || char === '[') {

                    open += 1;

                } else if (char === '}' || char === ']') {

                    open -= 1;

                } else if (char === '|' && open === 0 && temp.trim() !== '|') {

                    params.push(temp.slice(0, -1).trim());

                    temp = '|';

                }

            }



            params.push(temp);



            return params;

        };



        const debug = string => {

            if (window.alignerDebug) {

                mw.notify(string);

            }

        };



        const useWikEd = window.wikEd && window.wikEd.useWikEd;



        if (useWikEd) {

            window.wikEd.UpdateTextarea();

        }



        const editBox = $('#wpTextbox1');



        if (!editBox) {

            mw.notify('Edit box not found');

            return;

        }



        const text = editBox.val();



        if (!text || text.length === 0) {

            mw.notify('Edit box value not found');

            return;

        }



        const searches = window.alignerDefaultSearches.concat(window.alignerExtraSearches || []);



        let count = 0;



        const processInfobox = template => {

            if (template === '') {

                mw.notify('Infobox not found');

                return;

            }



            if (open !== 0) {

                console.error({ open });

                mw.notify('Template was not properly closed');

                return;

            }



            let maxLength = 0;



            const origTemplate = String(template);

            const lines = template.split("\n");

            const newLines = [];



            for (let lineNumber in lines) {

                const paramsInLine = splitIntoParams(lineslineNumber].trim());

                console.log({

                    line: lineslineNumber].trim(),

                    paramsInLine,

                });



                for (let paramNumber in paramsInLine) {

                    let line = paramsInLineparamNumber].trim();

                    if (!line.startsWith('|') || line.split('=').length !== 2) {

                        newLines.push(line);

                        continue;

                    }



                    let firstPart, lastPart = splitParam(line);

                    firstPart = firstPart.slice(1).trim();



                    if (firstPart.length > maxLength) {

                        maxLength = firstPart.length;

                    }



                    newLines.push('| ' + firstPart + '=' + lastPart);

                }

            }



            let output = '';



            maxLength += 2; // to include '| '



            for (let lineNumber in newLines) {

                let line = newLineslineNumber];

                const parts = splitParam(line);



                if (parts.length < 2) {

                    output += line += "\n";

                    continue;

                }



                let firstPart = parts0].trim();

                console.log({ firstPart, maxLength });



                while (firstPart.length < maxLength) {

                    firstPart += ' ';

                }



                output += firstPart + ' = ' + parts1].trim() + "\n";

            }



            if (output.endsWith("\n")) {

                output = output.slice(0, -1);

            }



            editBox.val(editBox.val().replace(origTemplate, output));



            if (useWikEd) {

                wikEd.UpdateFrame();

            }

        };



        let template = '';

        let open = 0;



        for (let i = 0; i < text.length; i++) {

            let foo = false;



            for (let searchIndex in searches) {

                const search = searchessearchIndex];

                const searchLength = search.length;



                if (text.length - i > searchLength) {

                    if ((text.slice(i, i + searchLength).toLowerCase() === search) || (text.slice(i, i + searchLength).toLowerCase() === search.replace(" ", "_"))) {

                        open += 1;

                        template += texti];

                        foo = true;

                    }

                }

            }



            if (open >= 1 && !foo) {

                template += texti];



                if (texti == '{') {

                    open += 1;

                } else if (texti == '}') {

                    open -= 1;



                    if (open === 0) {

                        count += 1;

                        processInfobox(template);

                        template = '';

                    }

                }

            }

        }



        mw.notify('Successfully aligned ' + String(count) + ' templates. Remember to preview before saving and report any issues at [[User talk:Majavah]]');

    });

});

// </nowiki>