User:IPOfAFlower/scripts/lists/sort.js

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.
mw.loader.using(["mediawiki.util"], async () => {

    /**
     * @param {mw.Api} api
     * @param {string} oldID
     * @returns {Promise<string>}
     */
    const getPageContents = async (oldID) => {
        const api = new mw.Api();

        const pageRequest = await api.get({
            action: "query",
            format: "json",
            prop: "revisions",
            revids: oldID,
            formatversion: "2",
            rvprop: "content",
            rvslots: "main",
        });

        
        const rev = pageRequest.query.pages[0].revisions[0];
        return rev.slots.main.content;
    }

    try {

    const contents = await getPageContents(mw.config.get("wgCurRevisionId"));

    const headers = contents.split(`== *. *==\n`);
    let ret = headers[0]; // Lead

    headers.slice(1).map((elm, idx) => {
        /**
         * @argument {string} a;
         * @argument {string} b;
         */
        const sorted = elm.split("\n").sort((a, b) => {
            let extracted_a;
            let extracted_b;
            const annotated = "* {{Annotated Link|";
            const raw = "* [["


            if (a.trim().startsWith(annotated)) {
                extracted_a = a.trim().slice(annotated.length).split("}}")[0].split("|").pop();
            } else {
                extracted_a = a.trim().slice(raw.length).split("]]")[0].split("|").pop();
            }


            if (b.trim().startsWith(annotated)) {
                extracted_b = b.trim().slice(annotated.length).split("}}")[0].split("|").pop();
            } else {
                extracted_b = b.trim().slice(raw.length).split("]]")[0].split("|").pop();
            }

            if (extracted_a === extracted_b) {
                return 0;
            }


            
            for (let i = 0; i < Math.min(extracted_a.length, extracted_b.length); i++) {

                if (extracted_a.charCodeAt(i) > extracted_b.charCodeAt(i)) {
                    return 1
                } 
            }

            return -1
        })

        const index = contents.indexOf(elm)
        const size = index - contents.indexOf(headers[idx]) ;
        const header = contents.slice(index - size, index)

        ret += header + sorted.join('\n')
    })


    //window.location.href = mw.util.getUrl(mw.config.get("wgPageName"), {
    //    action: 'edit',
    //    wpTextbox1: ret
    //})

    navigator.clipboard.writeText(ret);
    }catch(e){alert(e);}   
})