MediaWiki:Common.js: Difference between revisions
IssuePress (talk | contribs) No edit summary |
IssuePress (talk | contribs) No edit summary |
||
Line 2: | Line 2: | ||
mw.loader.using(['mediawiki.util']).then(function () { | mw.loader.using(['mediawiki.util']).then(function () { | ||
document. | // 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; | var firstSentenceEnd = text.indexOf(".") + 1; | ||
if (firstSentenceEnd > 0) { | 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); | |||
}); | }); |
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);
});