CINXE.COM

Project Constitution - The Battle for Wesnoth

<!DOCTYPE html><html class="no-js" lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Montaga%7COpen+Sans:400,400i,700,700i" type="text/css"> <link rel="apple-touch-icon" type="image/png" href="https://www.wesnoth.org/wesmere/img/apple-touch-icon.png" sizes="180x180"> <link rel="icon" type="image/png" href="https://www.wesnoth.org/wesmere/img/favicon-32.png" sizes="32x32"> <link rel="icon" type="image/png" href="https://www.wesnoth.org/wesmere/img/favicon-16.png" sizes="16x16"> <meta name="theme-color" content="#0f1421"> <link rel="stylesheet" type="text/css" href="https://www.wesnoth.org/wesmere/css/wesmere-1.1.10.css"> <title>Project Constitution - The Battle for Wesnoth</title> <style>/* * Copyright (C) 2020 - 2021 by Iris Morelle <shadowm@wesnoth.org> * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all * copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ /* * FIXME: Some visual properties are taken from Wesmere and rely on Sass * variables that should be exported by Wesmere. Alternatively, parts of this * stylesheet might work better integrated into Wesmere proper instead. */ #lisar-nav-menu + ul { -webkit-columns: 3; -moz-columns: 3; columns: 3; -webkit-column-gap: 0; -moz-column-gap: 0; column-gap: 0; -webkit-column-rule: solid 1px #cbac76; -moz-column-rule: solid 1px #cbac76; column-rule: solid 1px #cbac76; } blockquote { margin-left: 2em; margin-right: 0; padding: 0; min-height: 0; } blockquote, blockquote b, blockquote strong { color: #888; } /* Hide Wesmere decorative elements */ blockquote::before { display: none; } .lisar-legend { transition: opacity ease 300ms, transform ease 400ms; display: none; } .lisar-legend.lisar-legend-visible { display: block; } .lisar-legend.lisar-legend-slidein { animation: 300ms ease-out 0s slidein; } .lisar-legend.lisar-legend-slideout { animation: 300ms ease-out 0s slideout; } @keyframes slidein { from { transform: translateY(-75%); } to { transform: translateY(0%); } } @keyframes slideout { from { transform: translateY(0%); } to { transform: translateY(-75%); } } </style> <script src="https://www.wesnoth.org/wesmere/js/jquery-3.2.1.min.js"></script><script src="https://www.wesnoth.org/wesmere/js/modernizr.js"></script> </head> <body> <div id="main"> <div id="nav" role="banner"><div class="centerbox"> <div id="logo"><a href="https://www.wesnoth.org/" aria-label="Wesnoth logo"></a></div> <ul id="navlinks"> <li><a href="https://www.wesnoth.org/">Home</a></li> <li><a href="https://forums.wesnoth.org/viewforum.php?f=62">News</a></li> <li><a href="https://wiki.wesnoth.org/Play">Play</a></li> <li><a href="https://wiki.wesnoth.org/Create">Create</a></li> <li><a href="https://forums.wesnoth.org/">Forums</a></li> <li><a href="https://wiki.wesnoth.org/Project">About</a></li> </ul> <div id="sitesearch" role="search"><form method="get" action="https://wiki.wesnoth.org/"> <input id="searchbox" type="search" name="search" placeholder="Search" title="Search this wiki [Alt+Shift+f]" accesskey="f"><span id="searchbox-controls"><button id="search-go" class="search-button" type="submit" title="Search"><i class="search-icon" aria-hidden="true"></i><span class="sr-label">Search this wiki</span></button></span> </form></div> <div class="reset"></div> </div></div> <div id="content" role="main"> <a id="constitution"></a> <h1>Project Constitution</h1> <p><em>Version 1.0.20230207.0</em></p> <p><em>This version of the Battle for Wesnoth Project Constitution was written by Iris Morelle (shadowm) and reviewed by Charles Dang (Vultraz), Soliton, and Pentarctagon.</em></p> <p><em>Non-normative text is indented in quote blocks.</em></p> <h2>I. On the Project's Mission</h2> <p><strong>Article 1.</strong> The Battle for Wesnoth Project is a game development organization that exists for the continued development, improvement, and maintenance of the The Battle for Wesnoth.</p> <blockquote> <p><strong>Rationale:</strong> The Battle for Wesnoth Project exists and this is its purpose.</p> </blockquote> <p><strong>Article 2.</strong> The Project's funds, intellectual property, and other assets will by held by Software in the Public Interest, Inc. (SPI). Interaction with SPI on the project's behalf will be done by the Board of Directors.</p> <blockquote> <p><strong>Rationale:</strong> The costs of having taxes done by the current (as of this writing) legal entity holding the Project's funds and other assets (Wesnoth, Inc) is the single largest cost for the Project by a large margin, and will be significantly reduced by joining SPI. Additionally, SPI is a 501(c)(3) organization, which provides guarantees to those donating that their money will be used for a proper purpose.</p> </blockquote> <p><strong>Article 3.</strong> The Battle for Wesnoth Project's product and all associated code it publishes is compliant with the Open Source Definition as published by the Open Source Initiative.</p> <blockquote> <p><strong>Rationale:</strong> It is imperative to guarantee that no decisions emanating from the Project Council can ever contradict Wesnoth's license or purpose as an Open Source Software development team.</p> </blockquote> <h2>II. On the Project's Structure</h2> <p><strong>Article 4.</strong> The Battle for Wesnoth Project has a Development Team comprised of volunteers dedicated to the betterment of the game.</p> <blockquote> <p><strong>Rationale:</strong> Re-stating the volunteer-driven nature of the Project is paramount to settling any potential disputes surrounding people's responsibilities within the Project, but it is equally important to remind people that their ultimate purpose is the betterment of Wesnoth and not the aimless production of code for their own goals.</p> </blockquote> <p><strong>Article 5.</strong> Members of the Development Team have write access to the version control system repositories managed by the Project, as well as privileged access to their associated issue trackers. Persons eligible to become members of the Development Team are either: a) contributors who have either made at least three non-trivial contributions of code, graphics, sounds, music, or other resources used by the Project's product; b) contributors who perform housekeeping contributions or tasks at any level in a consistent and regular fashion; c) persons who on behalf of the Project run and manage computer systems used to support the Project's operations and its product; d) individuals appointed by the Wesnoth, Inc. Board to perform one or more specific roles that necessitate write access to the Version Control System repository or repositories.</p> <p>Active developers are understood to be members of the Development Team who have produced tangible output under the terms of points (a) or (b) above at least once every three months within the last 12 calendar months, and have no stated reasons to be considered inactive or intent to become inactive within the next 12 months.</p> <blockquote> <p><strong>Rationale:</strong> In order to guarantee order in future decision-making, it must be made clear to all who qualifies as a member of the Development Team. It is equally important to grant Wesnoth's financial backer the ability to appoint new members of the Development Team for any purposes deemed crucial to the company and the Project's operations, such as iOS port development.</p> </blockquote> <p><strong>Article 6.</strong> The Battle for Wesnoth Project has a Wesnoth.org Staff Team which is a subset of the Development Team. It shall be exclusively comprised of persons considered under point (c) in the preceding article, or persons appointed by the Wesnoth, Inc. Board as per point (d) to perform the same functions.</p> <blockquote> <p><strong>Rationale:</strong> Wesnoth.org staff tend to take a background role most of the time but there are situations where their action or vote may be required, optional, unnecessary, or undesirable, therefore their existence must be defined in order to legitimize any such provisions.</p> </blockquote> <p><strong>Article 7.</strong> There shall be a Project Council, led by the Project Manager, presiding over the Development Team. The Project Council is also comprised of the Community Manager, the Release Team, and the Maintainers.</p> <blockquote> <p><strong>Rationale:</strong> Enumerates the leadership roles for the Project in advance of their definition. The primary goal of this Constitution is to decentralize the powers currently attributed to the Release Manager so that the chances of a single person overextending are significantly reduced.</p> </blockquote> <p><strong>Article 8.</strong> The Project Manager shall have the ability at all times to appoint or remove a Community Manager to handle public relations on behalf of the Project, including coordinating with the Moderators of the communications channels of the Project, managing social media accounts, and communications on the Steam store and Steam forums. If there is no designated Community Manager, or the Community Manager becomes temporarily or permanently absent, the Project Manager shall have the ability to perform their functions for the Project.</p> <blockquote> <p><strong>Rationale:</strong> Describes the Community Manager role, essential for the efficacy of the Project's communications and representation in the connected world of today.</p> </blockquote> <p><strong>Article 9.</strong> The Project Manager shall have the ability at all times to appoint members of the Development Team into a Release Team, as well as remove them from it. The purpose of the Release Team is to assist the Project Manager with technical or non-technical tasks associated to the process of releasing new Wesnoth versions, such as packaging the source distribution or binary distributions for tier 1 platforms (Windows, macOS, Steam-Windows, Steam-macOS and Steam-Linux) as well as distribution of the game on virtual or physical software stores.</p> <p>Members of the Release Team may be directly appointed by the Board for the purpose of distributing or preparing the game for distribution through platforms that generate revenue for Wesnoth, Inc. In this case, only the Board shall have the ability to demote such members of the Release Team.</p> <blockquote> <p><strong>Rationale:</strong> Formally defines the roles of the packagers in the production of new releases, and grants the Board the ability to appoint packagers for platforms and distribution channels that provide it a revenue stream to support the Project's operations.</p> </blockquote> <p><strong>Article 10.</strong> The Project Manager shall have the ability at all times to appoint Maintainers of specific areas of Wesnoth's development, as well as remove them. The persons thus chosen by the Project Manager will be in charge of reviewing all issues and pull requests affecting or involving their respective areas. The Project has a minimum of three core development areas with distinct Maintainers, being the Project Manager's responsibility to narrow those areas further down and define additional ones according to the current needs of the Project. The core development areas for the Project are as follows: General Code, Mainline Content, Art Direction.</p> <p>It is possible for there to be technical overlaps between different areas of development, in particular between areas defined by the Project Manager and the core areas defined by the preceding paragraph. Any areas that are not defined, have no appointed Maintainer or have an absent Maintainer, are understood to be the direct responsibility of the Project Manager. Notwithstanding this, it must be guaranteed at all times that there are at least three appointed Maintainers other than the Project Manager.</p> <blockquote> <p><strong>Rationale:</strong> A well-defined group of people who have the last say on their specific areas of expertise is essential when coordinating with new and old contributors alike, especially during the roadmap drafting phase described later on.</p> </blockquote> <h2>III. On Elections and Development Cycles</h2> <p><strong>Article 11.</strong> The organization of elections held by the Project are the Board's responsibility. Before the start of an election, the Board shall choose a platform and publish clear instructions to vote, including a starting date and deadline for vote submissions, and any applicable requirements to be considered a voting party. Votes shall be cast by sending a message through the chosen platform and/or intermediaries, containing only clean and plain English and without leaving any room for ambiguity.</p> <p>All votes cast are strictly private and shall not be disclosed to persons other than members of the Board and Wesnoth.org Staff Team members with direct access to any relevant technical facilities.</p> <p>Any messages failing to clearly state a choice shall not be considered for the final vote count. Only the first vote from a particular individual shall be considered for the final tally.</p> <blockquote> <p><strong>Rationale:</strong> It must be the duty of Wesnoth, Inc. to establish a formal mechanism for elections any time they are needed. This is intended to guarantee that the Project Council and the Development Team at large cannot e.g. manipulate the elections to attain a specific outcome of a personal nature.</p> </blockquote> <p><strong>Article 12.</strong> The Project Manager shall be elected at the beginning of each development cycle by a voluntary majority vote by the Development Team, confirmed by the Board by a two thirds supermajority vote. Once confirmed, the elected Project Manager replaces the previous Project Manager immediately.</p> <p>a) Only active developers are eligible for becoming candidates to the Project Manager position. For this particular point, their activity requirement is increased to 18 calendar months. It is possible for Project Managers to be re-elected at the end of their tenure.</p> <p>b) Only votes from active developers or Wesnoth.org Staff Team members shall be counted. Members of the Board can participate directly in the elections if they also qualify within those groups, independently of their confirmation vote.</p> <p>c) In the event of a tie, the Board shall choose one from the pool of candidates with the highest vote count.</p> <p>d) Should the Board not confirm the new Project Manager, they are understood to be ineligible for the position for that development cycle and there must be a new and immediate call to elections.</p> <blockquote> <p><strong>Rationale:</strong> The voting system is intended to allow the Development Team to decide the Project's future based on the person they choose to lead their activities. For this purpose, only team members who have proven their dedication to the Project through their activity should be able to vote. This requirement becomes even more important for Project Manager eligibility for obvious reasons.</p> <p>It is worth noting here that Wesnoth.org Staff Members are not eligible for the Project Manager position if they do not otherwise qualify as active developers. However, since they will be subject to the Project Manager's decisions as much as everyone else, it is essential that they have voting rights nevertheless. Additionally, the confirmation vote from the Board is intended primarily to state the Board's trust in the new Project Manager; a situation where the Board votes against the elected Project Manager should be extremely rare in a healthy Project, or not happen at all. The same goes for demotion requests.</p> </blockquote> <p><strong>Article 13.</strong> At the beginning of each development cycle and following Project Manager elections, the Project Manager shall consult with their appointed Maintainers, and in cooperation with the rest of the Development Team draft a Development Roadmap for that development cycle. Each task defined as part of the Roadmap shall have an issue associated to them on the Project's issue tracker with Blocker urgency for the next major stable version. After the first development version of the cycle is released, no more tasks may be added to the Roadmap without the express approval of the Project Manager.</p> <blockquote> <p><strong>Rationale:</strong> The Project needs a roadmap to define its course over a development cycle. The roadmap's existence and purpose must be defined by the Constitution to ensure that people participate in its drafting as well as follow up on the designated tasks. Devising a specific procedure to draft the roadmap is the Project Manager's responsibility.</p> </blockquote> <p><strong>Article 14.</strong> The Project Manager shall schedule Wesnoth releases following consultation with the Development Team, and tag them on Wesnoth's Version Control System repository or repositories. No other person may tag Wesnoth releases unless the Project Manager explicitly delegates this task given appropriate justification (absence, accident, illness, etc.).</p> <blockquote> <p><strong>Rationale:</strong> The Project Manager role supersedes the existing vaguely-defined Release Manager position. Forcing tags to be authored by the Project Manager is important to build trust, especially if at any point we opt for using cryptographically-signed tags.</p> </blockquote> <p><strong>Article 15.</strong> The Project Manager shall have the ability to block Wesnoth releases indefinitely pending the resolution of items labeled in the Project's issue tracker as Blocker, High Priority, or Security, or considered to be of high concern to them or to the Battle for Wesnoth Community at large.</p> <p>Notwithstanding this, if at least two active developers or one Maintainer expressly request this action of them, the Project Manager shall have the last say on any decision related to Wesnoth's development. For the purpose of the preceding statement, the Project Manager is not counted as an active developer, but Wesnoth.org Staff Members are.</p> <blockquote> <p><strong>Rationale:</strong> Ultimately, the Project Manager must have the last word in any situations where the Development Team does not reach a natural consensus. Without this provision it would be possible for the game's development to completely stall forever.</p> </blockquote> <p><strong>Article 16.</strong> The Project Manager may call for new Project Manager elections as per Article 12 at any time should they deem it necessary, without forfeiting their right to being re-elected.</p> <p>Alternatively, the Project Manager may be demoted under any of these circumstances, becoming ineligible for immediate re-election, and enabling the Board to immediately call for new Project Manager elections:</p> <p>a) Voluntary resignation from their role.</p> <p>b) Prolonged absence for longer than two calendar months.</p> <p>c) Two or more members of the Project Council or active developers who previously held a Project Council position make an express request to the Board, confirmed by the latter by a two thirds supermajority vote.</p> <blockquote> <p><strong>Rationale:</strong> A formal procedure for replacing the Project Manager (willingly or otherwise) is essential to guaranteeing the Project's ability to keep moving forward at all times.</p> </blockquote> <p><strong>Article 17.</strong> In the absence of a definite Project Manager, the Board shall have the ability to appoint an Acting Project Manager from the Project Council or the Board itself. The Acting Project Manager shall not have any attributions pertaining to the Project Manager role beyond those granted by Article 14 and Article 15 paragraph 1.</p> <blockquote> <p><strong>Rationale:</strong> Some situations may require a person to represent the Project as the Open Source Software organization it is even if there is no elected Project Manager. Ultimately, the Board reserves the right to pick any particular candidate depending on the circumstances that led to this situation.</p> </blockquote> <h2>IV. On Changes to the Constitution</h2> <p><strong>Article 18.</strong> Changes to this Project Constitution must be submitted by members of the Development Team to the Project Manager or the Board of Directors as formal proposals describing the rationale for said changes in as much detail as possible. It is the responsibility of the Project Manager and the Board of Directors to make each other aware of the proposal being considered.</p> <blockquote> <p><strong>Rationale:</strong> This Constitution should be open to future changes according to the evolving needs of the Project.</p> </blockquote> <p><strong>Article 19.</strong> A proposal that is considered valid by the Project Manager and the Board of Directors through unanimous agreement must then be voted in by the Development Team. This shall be done through the same process established by Articles 11 and 12 of this Constitution, with the exception of requiring a voluntary two thirds supermajority vote from active members of the Development Team and members of the Wesnoth.org Staff Team, as opposed to a simple majority vote.</p> <blockquote> <p><strong>Rationale:</strong> Due to the nature of the Project Constitution and its impact over everything else (including the Constitution itself), the requirements to pass changes to it should be much higher than those for replacing or re-electing a Project Manager.</p> </blockquote> <p><strong>Article 20.</strong> Once a change to the Constitution is approved by the Development Team, it shall come into effect immediately only if it does not affect the structure of the Project Council as per Articles 7, 8, 9, or 10; or the process for Project elections as per Articles 11 and 12. Otherwise, the change shall come into effect upon the end of the current development cycle and before Project Manager elections take place.</p> <blockquote> <p><strong>Rationale:</strong> This is the "no pulling the rug from under people's feet mid-development cycle" clause.</p> </blockquote> <h2>V. On the Board of Directors' structure</h2> <p><strong>Article 21.</strong> The Board of Directors will consist of three members.</p> <blockquote> <p><strong>Rationale:</strong> An odd number of people makes it much more likely that a majority can make a decision when needed rather than becoming deadlocked indefinitely.</p> </blockquote> <p><strong>Article 22.</strong> There will be elections for the entire Board of Directors every other development cycle. This election will take place immediately after the election for Project Manager for development cycles where both elections take place. If a member of the Board resigns, then an election for the open position on the Board will be held within two weeks of their resignation. The people who are able to vote in the Board elections are the same as the people who are able to vote in the Project Manager elections. Anyone can be nominated to be a member of the Board by someone who is eligible to vote in the Board elections.</p> <blockquote> <p><strong>Rationale:</strong> There needs to be a structured way to change who is on the Board of Directors. Development experience is also not necessary to handle the responsibilities of being a member of the Board.</p> </blockquote> <p><strong>Article 23.</strong> Interacting with SPI on behalf of the Project will be done by the Board of Directors, which will designate one member of the Board to be the primary liason to SPI. The remaining members of the Board will be secondary liasons to SPI in case the primary liason is unable to fulfill their role. If that occurs, the Board will decide which of the secondary liasons will become the new primary liason. Whoever becomes the new primary liason will remain so until the Board decides otherwise.</p> <blockquote> <p><strong>Rationale:</strong> SPI requires we provide someone they can contact if needed, and the Project requires someone whose reponsibility it is to initiate contact if needed for any reason.</p> </blockquote> <h2>Transitory Provisions</h2> <p>I. This Constitution must be first accepted by the entirety of the active members of the Development Team as well as Wesnoth.org Staff Members as defined in Article 5. For this particular one-time purpose, Chapter IV does not apply. Once accepted, it shall come into effect immediately.</p> <blockquote> <p><strong>Rationale:</strong> Because of the impact this Constitution is expected to have on the Battle for Wesnoth Project in the long term, it is paramount to require unanimous approval of its first version.</p> </blockquote> <p>II. For the first development cycle upon which this Constitution comes into effect and unless the current development version is already considered to be in the beta stage of development, there shall be an immediate call to elections for the Project Manager position per Articles 11 and 12, as well as the subsequent drafting of a Development Roadmap per Article 13.</p> <blockquote> <p><strong>Rationale:</strong> The state of affairs in the Project at the time this Constitution was first approved absolutely requires us to re-plan Wesnoth 1.16 with the newly elected Project Manager.</p> </blockquote> <p>III. Until Wesnoth 2.0 is released, only Chapter I of this Constitution shall apply to Project Haldric, which may opt to have its own document defining its structure. The designation and release of Wesnoth 2.0 must be done through unanimous agreement between the Project Council, the Wesnoth, Inc. Board, and the Project Haldric development team.</p> <blockquote> <p><strong>Rationale:</strong> Project Haldric is its own special thing for the time being, with its development team considered separate from the rest of the Battle for Wesnoth Project minus overlaps.</p> </blockquote> <div id="lastmod">Generated on 17 June 2023 05:17 from ‹<a href="https://github.com/wesnoth/constitution">https://github.com/wesnoth/constitution</a>›.</div> <script>/* * Copyright (C) 2020 - 2021 by Iris Morelle <shadowm@wesnoth.org> * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all * copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ (function() { /* * Toolbar */ document.querySelector("h1").insertAdjacentHTML( "beforebegin", `<div id='wm-wiki-toolbar' role='toolbar'> <ul class='wm-toolbar' role='toolbar'/> </div>` ); const main_toolbar = document.querySelector("#wm-wiki-toolbar > ul"); function toolbarAppend(html, is_dropdown) { main_toolbar.insertAdjacentHTML("beforeend", (is_dropdown ? "<li class='wm-dropdown'>" : "<li>") + html + "</li>"); } /* * Navigation menu */ toolbarAppend(` <a id='lisar-nav-menu' class='wm-dropdown-trigger' href='#' role='button'> <i class='wm-toolbar-icon fa-map-signs' aria-hidden='true'></i> <span>Jump To</span> <i class='wm-toolbar-dropdown-marker' aria-hidden='true'></i> </a> <ul class='wm-dropdown-menu' role='menu'/> `, true); const nav_menu = document.querySelector("#lisar-nav-menu + ul"); // Article labels are always the first <strong> child of <p> directly under #content. This // specific distinction is needed to avoid selecting the labels of NN text. const article_labels = document.querySelectorAll("#content > p > strong:first-child"); article_labels.forEach(label => { let match = label.textContent.match(/^Article ([0-9]+)\.$/i); if (match != null) { let article_num = match[1]; label.id = "article" + article_num; nav_menu.insertAdjacentHTML("beforeend", ` <li> <a href='#article${article_num}' role='menuitem'>Article ${article_num}</a> </li> `); } }); /* * Non-normative text toggle */ const nn_display_on = { icon: "wm-toolbar-icon fa-eye", label: "Show Non-Normative Text", }; const nn_display_off = { icon: "wm-toolbar-icon fa-eye-slash", label: "Hide Non-Normative Text", }; const legend_blocks = document.querySelectorAll("blockquote"); let legend_on = false; legend_blocks.forEach(legend => { legend.classList.add("lisar-legend"); legend.addEventListener("transitionend", () => { legend.classList.remove("lisar-legend-slidein", "lisar-legend-slideout"); if (!legend_on) { legend.classList.remove("lisar-legend-visible"); legend.style.opacity = ""; } }) }); toolbarAppend(` <a id='lisar-legend-toggle' href='#' role='button'> <i class='${nn_display_on.icon}' aria-hidden='true'></i> <span>${nn_display_on.label}</span> </a>` ); const toggle_button = document.querySelector("#lisar-legend-toggle"); toggle_button.addEventListener("click", () => { legend_on = !legend_on; const { label, icon } = legend_on ? nn_display_off : nn_display_on; toggle_button.querySelector("span").textContent = label; toggle_button.querySelector("i").className = icon; legend_blocks.forEach(legend => { // Hiding if (!legend_on) { legend.style.opacity = 0; legend.classList.add("lisar-legend-slideout"); } // Unhiding else { legend.classList.add("lisar-legend-visible", "lisar-legend-slidein"); legend.style.opacity = 0; window.setTimeout(function() { legend.style.opacity = 1; }, 1); } }); event.preventDefault(); }); })(); </script> <script src="/wesmere/js/wiki.js"></script> </div> </div> <div id="footer-sep"></div> <div id="footer"><div id="footer-content"><div> <a href="https://wiki.wesnoth.org/StartingPoints">Site Map</a> • <a href="https://status.wesnoth.org/">Site Status</a><br> Copyright © 2003–2022 by <a rel="author" href="https://wiki.wesnoth.org/Project">The Battle for Wesnoth Project</a>.<br> Site design Copyright © 2017–2022 by Iris Morelle. </div></div></div> </body> </html>

Pages: 1 2 3 4 5 6 7 8 9 10