MediaWiki:Common.js: Difference between revisions

From stencil.wiki
No edit summary
No edit summary
 
(5 intermediate revisions by the same user not shown)
Line 1: Line 1:
/* Any JavaScript here will be loaded for all users on every page load. */
mw.loader.using(['mediawiki.util']).then(function () {
    // Load Vue.js from CDN
    var script = document.createElement('script');
    script.src = 'https://cdn.jsdelivr.net/npm/vue@2/dist/vue.min.js'; // Use Vue 2
    script.defer = true;
    script.onload = function () {
        // Ensure DOM is ready
        document.addEventListener("DOMContentLoaded", function () {
            if (typeof Vue === 'undefined') return; // Ensure Vue is loaded


document.addEventListener("DOMContentLoaded", function () {
            // Define the reusable Vue component
    // Select the h2 > #Steps element
            Vue.component('tutorial-list', {
    const stepsHeader = document.querySelector("h2 > #Steps");
                props: ['items'],
    console.log("Steps header:", stepsHeader); // Log the stepsHeader to check if it's found
                methods: {
   
                    splitContent: function (text) {
    if (stepsHeader) {
                        var firstSentenceEnd = text.indexOf(".") + 1;
        // Find the adjacent ordered list
                        if (firstSentenceEnd > 0) {
        const orderedList = stepsHeader.parentElement.nextElementSibling;
                            return {
        console.log("Adjacent ordered list:", orderedList); // Log the ordered list to ensure it's the right element
                                first: text.slice(0, firstSentenceEnd),
                                rest: text.slice(firstSentenceEnd).trim()
                            };
                        }
                        return { first: text, rest: "" };
                    }
                },
                template: '<ol>' +
                            '<li v-for="item in items">' +
                                '<strong>{{ splitContent(item).first }}</strong> ' +
                                '{{ splitContent(item).rest }}' +
                            '</li>' +
                          '</ol>'
            });
 
            // Find all tutorial sections dynamically
            var tutorialHeaders = document.querySelectorAll("h2 > span#Steps");
 
            tutorialHeaders.forEach(function (header) {
                var orderedList = header.parentElement.nextElementSibling;


        // Ensure the next sibling is an <ol>
                if (orderedList && orderedList.tagName === "OL") {
        if (orderedList && orderedList.tagName === "OL") {
                    var listItems = Array.from(orderedList.querySelectorAll("li")).map(function (li) {
            // Loop through each <li> in the <ol>
                        return li.textContent.trim();
            orderedList.querySelectorAll("li").forEach((listItem, index) => {
                    });
                console.log(`Processing <li> ${index + 1}:`, listItem.textContent.trim()); // Log each <li> before modification
               
                // Split the text content into the first sentence and the rest
                const text = listItem.textContent.trim();
                const firstSentenceEnd = text.indexOf(".") + 1; // Find the end of the first sentence


                if (firstSentenceEnd > 0) {
                     var vueAppContainer = document.createElement('div');
                    // Extract the first sentence and the remaining content
                     orderedList.parentElement.replaceChild(vueAppContainer, orderedList);
                     const firstSentence = text.slice(0, firstSentenceEnd);
                     const restOfText = text.slice(firstSentenceEnd).trim();


                     // Replace the <li> content with the formatted version
                     new Vue({
                    listItem.innerHTML = `<strong>${firstSentence}</strong> ${restOfText}`;
                        el: vueAppContainer,
                    console.log(`Updated <li> ${index + 1}:`, listItem.innerHTML); // Log the updated <li>
                        data: {
                } else {
                            listItems: listItems
                     console.log(`No sentence found in <li> ${index + 1}`); // Log if no period is found
                        },
                        template: '<tutorial-list :items="listItems"></tutorial-list>'
                     });
                 }
                 }
             });
             });
         } else {
         });
            console.log("No <ol> found as the adjacent sibling of #Steps"); // Log if no <ol> is found
    };
        }
     document.head.appendChild(script);
     } else {
        console.log("No h2 > #Steps element found"); // Log if the stepsHeader is not found
    }
});
});

Latest revision as of 02:15, 14 January 2025

mw.loader.using(['mediawiki.util']).then(function () {
    // Load Vue.js from CDN
    var script = document.createElement('script');
    script.src = 'https://cdn.jsdelivr.net/npm/vue@2/dist/vue.min.js'; // Use Vue 2
    script.defer = true;
    script.onload = function () {
        // Ensure DOM is ready
        document.addEventListener("DOMContentLoaded", function () {
            if (typeof Vue === 'undefined') return; // Ensure Vue is loaded

            // Define the reusable Vue component
            Vue.component('tutorial-list', {
                props: ['items'],
                methods: {
                    splitContent: function (text) {
                        var firstSentenceEnd = text.indexOf(".") + 1;
                        if (firstSentenceEnd > 0) {
                            return {
                                first: text.slice(0, firstSentenceEnd),
                                rest: text.slice(firstSentenceEnd).trim()
                            };
                        }
                        return { first: text, rest: "" };
                    }
                },
                template: '<ol>' +
                            '<li v-for="item in items">' +
                                '<strong>{{ splitContent(item).first }}</strong> ' +
                                '{{ splitContent(item).rest }}' +
                            '</li>' +
                          '</ol>'
            });

            // Find all tutorial sections dynamically
            var tutorialHeaders = document.querySelectorAll("h2 > span#Steps");

            tutorialHeaders.forEach(function (header) {
                var orderedList = header.parentElement.nextElementSibling;

                if (orderedList && orderedList.tagName === "OL") {
                    var listItems = Array.from(orderedList.querySelectorAll("li")).map(function (li) {
                        return li.textContent.trim();
                    });

                    var vueAppContainer = document.createElement('div');
                    orderedList.parentElement.replaceChild(vueAppContainer, orderedList);

                    new Vue({
                        el: vueAppContainer,
                        data: {
                            listItems: listItems
                        },
                        template: '<tutorial-list :items="listItems"></tutorial-list>'
                    });
                }
            });
        });
    };
    document.head.appendChild(script);
});