MediaWiki:Common.js: Difference between revisions

From stencil.wiki
No edit summary
No edit summary
Line 2: Line 2:


mw.loader.using(['mediawiki.util']).then(function () {
mw.loader.using(['mediawiki.util']).then(function () {
     document.addEventListener("DOMContentLoaded", function () {
     // Load Vue.js from CDN
        // Ensure this runs only on specific pages
    var script = document.createElement('script');
        if (mw.config.get('wgPageName') === 'YourTargetPage') {
    script.src = 'https://cdn.jsdelivr.net/npm/vue@2/dist/vue.min.js'; // Use Vue 2
            var stepsHeader = document.querySelector("h2 > span#Steps");
    script.defer = true;
            if (stepsHeader) {
    script.onload = function () {
                var orderedList = stepsHeader.parentElement.nextElementSibling;
        // Ensure DOM is ready
                if (orderedList && orderedList.tagName === "OL") {
        document.addEventListener("DOMContentLoaded", function () {
                    var listItems = orderedList.querySelectorAll("li");
            if (typeof Vue === 'undefined') return; // Ensure Vue is loaded
                    for (var i = 0; i < listItems.length; i++) {
 
                        var listItem = listItems[i];
            // Define the reusable Vue component
                        var text = listItem.textContent.trim();
            Vue.component('tutorial-list', {
                props: ['items'],
                methods: {
                    splitContent: function (text) {
                         var firstSentenceEnd = text.indexOf(".") + 1;
                         var firstSentenceEnd = text.indexOf(".") + 1;
                         if (firstSentenceEnd > 0) {
                         if (firstSentenceEnd > 0) {
                             var firstSentence = text.slice(0, firstSentenceEnd);
                             return {
                            var restOfText = text.slice(firstSentenceEnd).trim();
                                first: text.slice(0, firstSentenceEnd),
                             listItem.innerHTML = "<strong>" + firstSentence + "</strong> " + restOfText;
                                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);
});
});

Revision as of 02:13, 14 January 2025

/* 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

            // 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);
});