User:Taavi/Aligner.js

//

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 ['{{' + results[0]].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 = string[i];

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(lines[lineNumber].trim());

console.log({

line: lines[lineNumber].trim(),

paramsInLine,

});

for (let paramNumber in paramsInLine) {

let line = paramsInLine[paramNumber].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 = newLines[lineNumber];

const parts = splitParam(line);

if (parts.length < 2) {

output += line += "\n";

continue;

}

let firstPart = parts[0].trim();

console.log({ firstPart, maxLength });

while (firstPart.length < maxLength) {

firstPart += ' ';

}

output += firstPart + ' = ' + parts[1].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 = searches[searchIndex];

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 += text[i];

foo = true;

}

}

}

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

template += text[i];

if (text[i] == '{') {

open += 1;

} else if (text[i] == '}') {

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');

});

});

//