The Development Guide aims to help community developers get up to speed on contributing to this wiki's codebase. Mostly this pertains to back-end scripts in module pages as they are the most accessible, but contributions to front-end scripts may be allowed if you ask an administrator for permission.
- Last updated: Thu, 18 Apr 2024 15:27:48 +0000 (UTC) by User:Flaicher
Resources[]
If you are new to programming on a MediaWiki-based wiki or come from different programming backgrounds (web developers and backend engineers are welcome!), here are some resources to help you get started with understanding the Lua programming language, what libraries are available to use, wikitext basics, and the architecture in which code gets deployed to be used within wiki articles:
- Lua
As a scripting language, Lua has similar features and paradigms as JavaScript, Ruby, and Python. If you are familiar with the latter, Lua is relatively quick to learn and can be used in functional (e.g. Module:Math), procedural (e.g. Module:Weapons/infobox), or object-oriented programming (e.g. Module:InfoboxBuilder).
- https://www.lua.org/pil/contents.html - Programming in Lua (first edition)
- https://www.mediawiki.org/wiki/Lua/Tutorial - Tutorial on using Lua on MediaWiki
- https://www.tutorialspoint.com/lua/index.htm - tutorialpoint's Lua tutorial
- https://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual - standard libraries that are available to be used on the wiki's codebase as well as intro to using Lua on the wiki
- Wikitext markup
Wiki markup is another type of a high-level markup language the renders content to HTML to display on webpages.
- http://workingwithmediawiki.com/book/chapter4.html - Working with MediaWiki (second edition), Chapter 4: MediaWiki syntax
- https://en.wikipedia.org/wiki/Help:Wikitext - Wikitext help page
- https://en.wikipedia.org/wiki/Help:Transclusion, https://meta.wikimedia.org/wiki/Help:Transclusion - Concept of including content from other pages by reference
- https://dev.fandom.com/wiki/Lua_templating/Getting_started - Basics on creating a Lua template
- https://en.wikipedia.org/wiki/Help:Cheatsheet - Reference table for basic wikitext syntax
Glossary[]
- Main article: WARFRAME Wiki:Glossary
Wiki Terminology[]
These terms are applicable to almost any MediaWiki-based wiki, especially on the Fandom site, and are not exclusively used in context of the WARFRAME Wiki.
Terms | Explanation |
---|---|
API | Refers to MediaWiki's Action API (https://warframe.fandom.com/api.php) or third-party ones such as those maintained by Warframe Community Developers (https://github.com/WFCD) |
Arg | Shorthand for argument, as in the value that gets passed to template parameters or module function variables. |
AWB | AutoWikiBrowser, a tool for making semi/fully automatic edits on the wiki |
Backend | In the context of wiki editors, refers to pages/Lua scripts in the Module namespace. |
Cargo | Refers to Extension:Cargo which adds support for structured data on wikis, allowing database queries on wiki pages through parser functions. This is not available to be requested on Fandom wikis as of 18:28, 21 October 2021 (UTC) and is only enabled on some Gamepedia wikis like w:c:Terraria. |
Codex | Refers to the Codex toolkit for building UI based on Wikimedia Design System. Built on Vue.js. |
CSS | Refers to the wiki's styling spreadsheet on MediaWiki:Common.css or any other stylesheets |
Expand (a template) | Refers to the recursive practice of turning a template call into its raw wikitext or HTML equilvalent through Special:ExpandTemplates |
Database | An informal term that refers to any /data subpage of module pages, containing Lua tables that act as NoSQL databases of WARFRAME's contents. Any data in /data subpages will be rebuilt every time a page is loaded as these are not "true" databases and are executable Lua programs instead. As such, there is no support for features like transactions or data caching.
|
Docbunto | Module:Docbunto, the auto-documentation generator for Lua modules; this wiki's fork of the module can be found here |
DPL | Extension:DynamicPageList, a parser function used for querying pages in certain categories or namespaces |
Frame | Frame object |
Frontend | In the context of wiki editors, refers to pages/JavaScript scripts/CSS stylesheets in the MediaWiki namespace. |
Infobox | A fixed-format table that is at the top-right corner of an article containing a basic summary and/or stats of the article topic. Usually contains the article name, an accompanied image for SEO, an item description, and basic general information. See Help:Infobox for more details. |
Invoke (a module) | Calling a module's function through this syntax: {{#invoke:<module_name>|<function_name>|<param_1>|<param_2>|...}}
|
Lede or Lead | The introductory paragraph(s) of an article. These are not under a section header and are typically to the left of the article's infobox. |
Luafication/Luafying | Informal term to describe the porting of a template page to a module to build wikitext. Instead of transcluding a template, there will be an invoke call to a module's function. |
M:<module_name> | Shorthand for Module:<module_name>
|
Mbox | Shorthand for message boxes that are typically located on the top of articles or right after a section header to alert readers on something about the article. |
Memory | The memory allocated server-side for running back-end Lua scripts on Module pages (default 50MB) |
Module | Refers to a module page or the Lua package on the wiki that is in the module page; module, package, and library may be used interchangably |
mw | MediaWiki, the wiki engine that this wiki is built on, written in PHP. May also refer to the MediaWiki namespace if stylized as "MW". |
Namespace | The name of a collection of articles to differentiate their purpose on the wiki. Most articles reside in the "Main" namespace which is not explicitly shown in article names. Other namespaces include "Module" for Lua scripts and "MediaWiki" for JS scripts. See Help:Namespaces. |
NewPP | Preprocessor report on wikitext preprocessing/rendering performance |
Null edit | Publishing an edit that makes no changes to the page to forcefully refresh the page so it can show all properly linked articles: Wikipedia:Purge#Null_edit. Commonly used to force pages to show up on the appropriate category page. |
OOUI | MediaWiki library that is used to create responsive UI elements in JavaScript. See mw:OOUI for more details. |
Parser function | A function that can be called on pages typically used in the syntax of {{#functionname:arg1|arg2|...}} . They are backed by a PHP callback function that works closely with the wikitext parser for generating robust content on the wiki, extending the wikitext markup language. See Manual:Parser_functions for more details.
|
Parsoid | A (soon-to-be) core MediaWiki library that provides runtime bidirectional parsing of wikitext into HTML and vice versa. See Parsoid for more details. |
PortableInfobox | Fandom's implementation of an infobox that can display on both desktop and mobile platforms. See Portable_Infoboxes for more details. |
Redlink | A hyperlink that links to a non-existent page on the wiki. For example, this is a broken link. |
RegEx | Regular expressions; in the context of Lua, they can also refer to patterns which are similar to RegEx, but have syntactic differences. See Extension:Scribunto/Lua_reference_manual#Patterns for more details. |
Sandbox | A test page for experimenting with wikitext and modules; e.g. User:Cephalon Scientia/Sandbox |
Scribunto | The MediaWiki extension that allows Lua scripting on the wiki; Extension:Scribunto |
Skin | The customizable user interface of the wiki. As of 2021-06-25, Fandom offers Oasis (soon to be sunsetted/unsupported) and FandomDesktop skins by default. See Manual:Skins for more details. |
Submodule | A module page that is a subpage of another module, sometimes called the "main" module. An example is Module:Weapons/infobox being a submodule of Module:Weapons. |
Substitution | The act of converting transcluded content on pages to their wikitext equilvalent when the page is saved. Can be thought of as "template substitution" to make page content independent from the template(s) used. See Help:Substitution for more details. |
T:<template_name> | Shorthand for Template:<template_name>
|
Tabber | <tabber> tags that allows for tabbed content. See Extension:Tabber for more details.
|
Table | Can refer to Module:Table, Lua tables (see https://www.tutorialspoint.com/lua/lua_tables.htm), HTML tables (see https://developer.mozilla.org/en-US/docs/Learn/HTML/Tables/Basics), or wikitables (see wikipedia:Help:Table) |
Tag | On articles, it may refer to HTML tags or unique wiki-markup tags that add additional functions. See Manual:Tag_extensions. Regarding edits, it may refer to labels that are tagged onto edits for maintenance reasons. See Manual:Tags. |
TOC | Table of contents |
Transclusion | The action of including content from other pages by reference. See Transclusion for more details. |
Purge |
|
PWB | Pywikibot, Python library for automating edits |
Unpacking | Refers to the extraction of arguments in a table/array/dictionary to be passed into a function using unpack()
|
VE | Shorthand for VisualEditor, a rich-text editor for MediaWiki |
WVUI | Abbreviation of Wikimedia Vue UI, Wikimedia Foundation's Vue.js UI components. Superseded by Codex since September 2021. |
Wikilink | A hyperlink that links to other pages on the wiki. They can be added by using the square brackets when editing pages: [[Page name]] . See Help:Links for more details.
|
Fandom Terminology[]
Terms | Explanation |
---|---|
Discussions API | Fandom's API for accessing warframe.fandom.com/f
|
Fandom (stylized as FANDOM sometimes) | The company that hosts this wiki, develops the platform the wiki is built on, provides community support, and hosts development tools through https://dev.fandom.com/wiki/Fandom_Developers_Wiki |
Fandom Design System | Framework of Fandom's visual language for consistent user experience and interface throughout the Fandom branding. See https://fandomdesignsystem.com/?path=/story/introduction--page for more details. |
FandomDesktop | The desktop wiki skin that is being used on UCP since June 2021 (previously used Oasis skin, and before that, Hydra), featuring light/dark themes, expanded articles, table of contents button, and other features. See community:Help:FandomDesktop. |
FandomMobile | The mobile wiki skin that is being used on UCP since Feburary 2021, featuring light/dark themes, better galleries, table of contents button, and other features. See community:Help:FandomMobile. |
Gamepedia | Wiki hosting service for video games owned by Curse LCC before being acquired by Fandom in December 2018. |
Global Navigation | On desktop view, the leftmost vertical bar that contain links to wiki verticals and and the user profile. See community:Help:Customization policy. |
Modal | Refers to the Modal JS library which helps in creating overlay elements on Fandom wikis to display to the user (modal boxes/windows) |
Nirvana | Fandom's application framework. Endpoints include /wikia.php or /api/v1 on every Fandom wiki. See https://dev.fandom.com/wiki/Nirvana for more details.
|
Phalanx | Fandom's global blocking and spam control system. See community:Help:Spam. |
Site Navigation | On desktop view, the topmost horizontal bar that contain intrawiki links. See community:Help:Navigation. |
SOAP | Stands for Spam Obliteration and Prevention, a group of volunteers that have privileges for cleaning vandalism on wikis. See community:SOAP. |
Theme Designer | Admin tool that allows easy customization of the wiki's color theme, header color, background image, and logo. See community:Help:Theme Designer. |
UCP | Unified Community Platform, the official name of the platform that Fandom and Gamepedia wikis are running on. See Help:Unified Community Platform for more details. |
Wikia | The name of Fandom wikis and the company before their rebranding in October 2016. |
Wiki vertical | Name of one of the major categories that a Fandom wiki belongs to: "Games", "Anime", "Movies", "TV", and "Video". Other categories include "books", "music", and "lifestyle". |
Warframe Terminology[]
- Main article: Glossary
Community acronyms, slang, and (technical) terms surrounding the WARFRAME game and supporting software.
Terms | Explanation |
---|---|
DE | Digital Extremes, the creators of WARFRAME |
Drop Tables | Loot tables in which a reward is randomly pulled from based on the rarity weighting assigned to items and biases applied to make some items more/less likely to be picked (canonically in the form of JSON files) |
Evolution Engine | The proprietary game engine that WARFRAME is built on. |
Game Object | Represents a discrete playable item within the game. These have properties and functionality attached to them to determine its behavior and interactions with players. |
Mobile Export | WARFRAME's mobile API used by Warframe Companion and other services; sample endpoint: http://content.warframe.com/MobileExport/Manifest/ExportWeapons.json |
PBR | Physically based rendering. A graphics rendering technique that takes into account surface material when modelling reflections and lighting. |
Public Export | Another name for Mobile Export |
TennoGen | WARFRAME's program for community artists and modellers to create custom skins and models for WARFRAME's assets for a chance of them being sold in-game. It is hosted on the Steam Workshop. |
WFCD | Warframe Community Developers GitHub group at https://github.com/WFCD for tools accessing WARFRAME's APIs |
World State | WARFRAME's API for accessing the state of the Star Chart |
Metagame Terminology[]
Player-defined terms that are used to describe metagame concepts about WARFRAME. These are often shared with common game lingo within the gaming community. This only covers terms relevant to the wiki and wiki editing.
Terms | Explanation |
---|---|
Ammo efficiency |
|
BiS | Best in slot. Describes an item that is the best performant item in a particular mod slot or loadout slot. Very rarely used in context of WARFRAME with how flexible and varied the modding/loadout system is. See opportunity cost for a related term. |
Burst DPS | Burst damage per second. Theoretical damage output that is dealt over a short period of time (called a "burst" or an "explosion of damage"). If there is a graph that plots total damage vs. time elapsed, burst DPS will be the equivalent to the slope of the tangent to the curve. |
CC | Crowd control effects that
|
Content island | Describes a gameplay environment or design where player progression and gameplay replayability is centered around certain regions in the game instead of encompassing more regions and/or mechanics that is more universally relevant in the context of the game. This term is more relevant to Landscape environments and Empyrean/Railjack gamemode. |
Derived stat | A player-made stat that is calculated from fundamental stats. These are typically used to standardize how stats are compared between two different objects when direct comparisons of fundamental stats omit context and situational variables. |
Diminishing returns | Similar to real-world usage of the term, refers to effects that produce marginal benefit the longer it is in effect or the more instances it is in effect. For example, most Bosses in WARFRAME have a crowd control (CC) resistance mechanic where the more times a specific CC ability is used on them, the weaker the CC effect (strength-wise like from knockdowns to stuns or duration-wise). |
DPS | Damage per second.
|
DR | Commonly refers to sources of Damage Reduction, but may be rarely used to refer to crowd control diminishing return effects from Bosses or mini-bosses. |
Drop rate | Refers to a player's experience of a particular item drop occurring. This is dependent on factors such as the item's individual drop chance, the chance that the drop table in which the item is in is chosen to pull rewards from, enemy spawn rate, enemy kill rate, mission objective completion time, etc. As such, not every player will experience the same drop rate. In general, the game is balanced in giving a mission reward every 5 minutes of mission playtime. For item drops from enemies, reward balance may vary depending on the toughness of enemies and their spawn rate. |
EHP | Effective health points. A standard way of measuring theoretical health hit points which is the number of health points that an avatar can absorb before going into a death state. This usually takes into account Armor and other sources of Damage Reduction which will increase EHP even though the actual health value doesn't change. Other EHP calculations may also include damage types absorbed which have different Damage Type Modifiers. |
Forced Procs | Status effects that are guaranteed to occur when a particular attack hits an enemy regardless of the attack's damage distribution or status chance. This characteristic of a weapon's attack isn't shown to players in-game but is internally implemented as an array of status effects. |
Fundamental stat | Describes the most basic, raw, low-level stat that a gameplay element can be represented as. For example, if DPS is a derived stat, then we say the fundamental stats that make up DPS are damage and fire rate. Can also be thought as a SI base unit in video game terminology. |
Gameplay loop | A series of cyclical gameplay events that a player will encounter throughout playing a game. Usually this consists of a push-and-pull system of rewards and gameplay to incentivize players to invest their time into the game.
For example, say a player wants some new weapon, so they need play missions to obtain the blueprints and resources necessary to create that weapon. Then they need to level up their weapon so it can be more powerful. Once the player faces content that is difficult to the point said new weapon is not sufficient, they will need to find a new weapon to invest in. |
HCET | The precedence of primary elemental damage types which are applied to create secondary elemental damage types when dealing with Kuva/Tenet weapons: Heat, Cold, Electricity, Toxin. |
KPM | Kills per minute. A standard metric of measuring how efficient a player's loadout is at killing enemies. Arguably a better metric than theoretical DPS in measuring how well a loadout performs in real-game scenarios. |
Malus | A stat penalty, the opposite of a bonus. This term is rarely used amongst English-native players who instead say "negative" or "negative bonus" as a substitute. See wikipedia:malus for its etymology. |
Opportunity cost | The relative cost (or loss) from installing a mod/Arcane over another mod/Arcane that improves the same stat. Since there is a limited number of mods/Arcanes that can installed on a particular item, players have to choose which mods/Arcanes to use when building their loadout in a balance of stat gains and sacrifices. The opportunity cost can be calculated by the difference of the provided stat bonus/malus.
Opportunity cost can be extended to equipping weapons in certain slots. For example, there is an opportunity cost in equipping a weaker primary weapon like the Braton over a powerful one like the Kuva Bramma. |
Power creep | Describes a gradual process where newer content/items supersede older content/items in terms of gameplay performance because of the philosophy of "newer is better". Used in negative light because older content is "forgotten" and "forces" players to get newer items to complete newer content or make older content more time efficient. |
Proc | Programmed random occurrence. Refers to events that happen based on RNG such as Status Effects and Critical Hits. Most of the time players use the term to refer to status effects since they are significant in changing gameplay decisions and playstyle mid-game. |
Raw DPS | Raw damage per second. A DPS calculation that does not rely on random events such as critical hits that will periodically increase damage dealt. |
RNG | Random number generator. Refers to any randomized event that occurs due to machine generated random numbers (pseudorandom number generator or PRNG). All random events in WARFRAME are deterministic because of this, but this is only relevant to events that occur repeatedly over a long-period of time or repeated an enormous number of times. We can assume numbers generated by the game's RNG will be uniformly distributed, thus we can model the occurrence of an event using a geometric distribution. |
Support | A player role that is primarily the healer, crowd controller, and/or buffer/debuffer. Examples include Trinity and Wisp. |
Sustained DPS | Sustained damage per second. Theoretical damage output that is consistent over a long period of time. Usually takes into account reload time after emptying a magazine and thus will be typically lower than burst DPS values. |
Tank(ing) | WARFRAME doesn't have the traditional MMO tank role so it is used to refer to characters or enemies that have relatively high amounts of effective health (e.g. Inaros) or is able to absorb lots of damage without dying (e.g. Rhino's Iron Skin). |
TTK | Time-to-kill. The amount of time required to defeat a particular enemy. High TTK means that it will take a relatively longer time to kill a particular enemy and vice versa. Low TTK against high-level enemies is usually a good metric in measuring a weapon's performance as it means that:
|
User-Defined Terminology[]
Other terms on this wiki that do not fit in the above sections:
Terms | Explanation |
---|---|
Faux Frame | Refers to a Lua table that mimics a Frame object by storing an args table containing arguments. For example, local faux = { args = { "Argument 1", "Argument 2", namedArg = "Named Argument 1" } } . Ideally these should not be used and you should pass arguments directly to the function instead.
|
(Infobox) Override | Refers to template arguments that are set by editors to override default arguments. Usually used in reference to infoboxes. |
Sister Wiki | WARFRAME Wikis that are in localized in other languages. For example, the French WARFRAME Wiki on https://warframe.fandom.com/fr/wiki/ |
Subject Matter Expert | In context of WARFRAME, refers to individuals who are extremely knowledgeable about the game, its mechanics, and the community it has. Usually these are veteran members of the WARFRAME community. |
On this wiki | MongoDB Equivalent | SQL Equivalent |
---|---|---|
(Database/Table) Entry | (BSON) Document | (Database) Record or row |
(Lua) Table | Collection | Table |
"Database" or /data subpage or data store |
Database | Database |
Index | ||
Column/Key | Field | Column |
Indexed key | Primary key | |
N/A | Embedded documents | Table joins |
N/A | Aggregation pipeline | Aggregation |
Development Checklist[]
- Does your code follow WARFRAME Wiki:Programming Standards?
- Did you purge an article's cache before reviewing changes?
- Sometimes changes to the codebase will not be applied immediately due to page caching. Add the
?action=purge
query string to the URL to access purge cache button.
- Sometimes changes to the codebase will not be applied immediately due to page caching. Add the
- Did you have another person review your code before pushing big changes?
- Does your code pass all unit tests whenever applicable?
- Did you create new unit tests whenever applicable? If your functions output wikitext, make sure to test them out on a page to find visual errors.
- Did you consider accessibility on mobile platforms and FANDOM app if applicable? As of 23:10, 23 November 2021 (UTC), about 45% of traffic to this wiki are from mobile users.
- Add
?mobileaction=toggle_view_mobile
and?mobileaction=toggle_view_desktop
query strings to toggle between desktop and mobile browser views on desktop - There is no easy way to view page experience in the FANDOM app without logging in and going directly to the pages where a module is invoked.
- Add
- If making a new module:
- Can it be implemented with parser functions instead? If so, how convoluted would it look from the point of view of an editor? For simple things, parser functions are okay.
- Is its functionality distinctly different from other modules? In other words, can functions in a new module fit in existing modules?
- Is it a duplicate of an existing module in https://dev.fandom.com/wiki/Fandom_Developers_Wiki or on the wiki? See https://warframe.fandom.com/wiki/Special:PrefixIndex?prefix=&namespace=828 for a full list of module pages; there might be a test module that was abandoned that you can build your work off on.
- If deleting or refactoring a function:
- Did you null edit all the possible pages it may be used to double check if there are script errors anywhere?
- If dealing anything related to the presentation of content, did you look at the site as an anonymous (logged out) user? This is to ensure that the site is readable without custom user CSS.
- For front-end scripts, did you test to see what happens if a user has JavaScript disabled in their browser? Ensure basic functionality still works (like a static text rather than an animated one) or leave a notice mentioning to enable JavaScript to get the feature.
- Did you check generated content in other browsers? Sometimes Chromium-based browsers render HTML/CSS differently from other browsers. As of 23:06, 23 November 2021 (UTC), the top 4 web browsers that visit this wiki are:
- Google Chrome (~72%)
- Safari (~16%)
- Firefox (~8%)
- Microsoft Edge (~5%)
Modules List[]
Best Practices[]
Style Guide[]
- Main article: WARFRAME Wiki:Programming Standards
See WARFRAME Wiki:Programming Standards for more details on code styling and best practices on developing on this wiki.
User Experience Guidelines[]
- Do not communicate to the reader with only color, make sure there is additional text as fallback and use different shape designs for color/visual accessibility reasons.
- Examples include denoting different classes of items such as "tiers" or "rarities".
- Do not use hover overs or collapsible content for important information to the reader. These features should be used to enhance the user experience, not to detract from it.
- Collapsibles are appropriate for long tables (to lessen the amount of scrolling) or detailed content that explains concepts in-depth to the reader outside of general practicality (e.g. explanations of math formulas; most people do not want to know the calculus behind results)
- Frontend scripts should be responsive and enhance the user experience, not slowing down performance. Any content that is derived from these scripts should be available on the appropriate pages for users to manually deduce. For example, the formula used in the enemy health scaling slider on Template:Enemy is available for readers on Enemy Level Scaling.
- Any content that is auto-generated from modules should be available on the appropriate pages for users to manually deduce. For example, the formula used in the DPS calculations on Weapon Comparison is available for readers on Damage#Final Calculations.
- Mobile users will lose some features from desktop such as frontend scripts. Ensure the site is still usable when JavaScript is turned off.
- All content must be readable on both the wiki's light and dark themes. However, we do not expect nor guarantee the same for custom user themes so use them at your discretion.
- Follow Web Content Accessibility Guidelines (WCAG) for color contrast when dealing with (colored) text on colored backgrounds. See https://developer.mozilla.org/en-US/docs/Web/Accessibility/Understanding_WCAG/Perceivable/Color_contrast for more details.
- For images that are flat black in color, for visibility on dark theme, wrap them around an element with
class="icon"
or if using wikitext[[File:]]
syntax, addclass=icon
argument. This is so a CSS rule can target these elements for the invert filter. - Hover over content/text is denoted by a 2px thick dotted underline below content/text like so: I am a hover over
- Avoid using colored text in articles outside of hyperlinks. Colored text is usually unreadable on either light or dark theme. If color must be presented:
- For inline text, use a colored square with the name of the color beside it (e.g. ◼ purple)
- For tables, designate a table column for presenting colors, using
background-color
CSS property to set the color of a particular table cell, and designate another table column for describing the color like so:
Mobile[]
- Use the following CSS classes to hide mobile-unfriendly content from mobile view or restrict content to mobile view:
mobileonly
- only show HTML element in mobile viewnomobile
- completely removes HTML element, can be used to reduce webpage sizemobile-hidden
- usesstyle="display:none;"
to hide HTML element
Examples[]
Best | Better | Bad |
---|---|---|
Viral | Viral or Viral or | N/A |
Banshee⭐ |
N/A | Banshee |
Using colored text with high enough contrast on the respective theme for readability:
Redirection 0.7587% 🥉
Redirection 0.7587% 🥉 |
Using different colored emojis with items grouped by rarity: Redirection 0.7587% 🥉 |
Colored text and unsorted, unreadable on light theme: Redirection 0.7587% |
|
N/A |
|
Stylesheets[]
- As of 20:28, 26 August 2021 (UTC), here are the default light theme variables and values on this wiki (https://warframe.fandom.com/wikia.php?controller=ThemeApi&method=themeVariables&cityId=544934&variant=light&version=1630095664):
:root { --theme-body-dynamic-color-1: #1e0c1b; --theme-body-dynamic-color-1--rgb: 30,12,27; --theme-body-dynamic-color-2: #3a3a3a; --theme-body-dynamic-color-2--rgb: 58,58,58; --theme-page-dynamic-color-1: #1e0c1b; --theme-page-dynamic-color-1--rgb: 30,12,27; --theme-page-dynamic-color-1--inverted: #fff; --theme-page-dynamic-color-1--inverted--rgb: 255,255,255; --theme-page-dynamic-color-2: #3a3a3a; --theme-page-dynamic-color-2--rgb: 58,58,58; --theme-sticky-nav-dynamic-color-1: #fff; --theme-sticky-nav-dynamic-color-1--rgb: 255,255,255; --theme-sticky-nav-dynamic-color-2: #e6e6e6; --theme-sticky-nav-dynamic-color-2--rgb: 230,230,230; --theme-link-dynamic-color-1: #fff; --theme-link-dynamic-color-1--rgb: 255,255,255; --theme-link-dynamic-color-2: #e6e6e6; --theme-link-dynamic-color-2--rgb: 230,230,230; --theme-accent-dynamic-color-1: #fff; --theme-accent-dynamic-color-1--rgb: 255,255,255; --theme-accent-dynamic-color-2: #e6e6e6; --theme-accent-dynamic-color-2--rgb: 230,230,230; --theme-body-background-color: #ffffff; --theme-body-background-color--rgb: 255,255,255; --theme-body-background-image: url(https://static.wikia.nocookie.net/warframe/images/b/b5/Site-background-light/revision/latest?cb=20210617231242); --theme-body-text-color: #1e0c1b; --theme-body-text-color--hover: #66295c; --theme-sticky-nav-background-color: #061212; --theme-sticky-nav-text-color: #fff; --theme-sticky-nav-text-color--hover: #cccccc; --theme-page-background-color: #eeeeee; --theme-page-background-color--rgb: 238,238,238; --theme-page-background-color--secondary: #e4e3e3; --theme-page-text-color: #3a3a3a; --theme-page-text-color--rgb: 58,58,58; --theme-page-text-color--hover: #6d6d6d; --theme-page-text-mix-color: #949494; --theme-page-text-mix-color-95: #e5e5e5; --theme-page-accent-mix-color: #989898; --theme-page-headings-font: 'Rubik'; --theme-link-color: #0148c2; --theme-link-color--rgb: 1,72,194; --theme-link-color--hover: #00225c; --theme-link-label-color: #fff; --theme-accent-color: #424242; --theme-accent-color--rgb: 66,66,66; --theme-accent-color--hover: #757575; --theme-accent-label-color: #fff; --theme-border-color: #c1c1c1; --theme-border-color--rgb: 193,193,193; --theme-alert-color: #bf0017; --theme-alert-color--rgb: 191,0,23; --theme-alert-color--hover: #59000a; --theme-alert-label: #fff; --theme-warning-color: #ca6f1b; --theme-warning-label: #1e0c1b; --theme-success-color: #0c742f; --theme-success-color--rgb: 12,116,47; --theme-success-label: #fff; --theme-message-color: #753369; --theme-message-label: #fff; --theme-community-header-color: #0e191a; --theme-community-header-color--hover: #31585c; --theme-background-image-opacity: 100%; } .skin-fandomdesktop .CodeMirror { --codemirror-yellow: #9e8500; --codemirror-light-blue: #008ae7; --codemirror-blue: #0085f9; --codemirror-green: #290; --codemirror-red: #ef4f00; --codemirror-dark-red: #a11; --codemirror-purple: #80c; --codemirror-pink: #ed00ed; --codemirror-light-gray: #858585; --codemirror-gray: #6b8a8a; } .mw-highlight { --pygments-background: #e4e3e3; --pygments-err: #ef0000; --pygments-c: #408080; --pygments-k: #008000; --pygments-o: #666; --pygments-ch: #408080; --pygments-cm: #408080; --pygments-cp: #a26900; --pygments-cpf: #408080; --pygments-c1: #408080; --pygments-cs: #408080; --pygments-gd: #a00000; --pygments-gr: #ef0000; --pygments-gh: #000080; --pygments-gi: #008600; --pygments-go: #767676; --pygments-gp: #000080; --pygments-gu: #800080; --pygments-gt: #04d; --pygments-kc: #008000; --pygments-kd: #008000; --pygments-kn: #008000; --pygments-kp: #008000; --pygments-kr: #008000; --pygments-kt: #b00040; --pygments-m: #666; --pygments-s: #ba2121; --pygments-na: #6b7c23; --pygments-nb: #008000; --pygments-nc: #00f; --pygments-no: #800; --pygments-nd: #a2f; --pygments-ni: #757575; --pygments-ne: #d2413a; --pygments-nf: #00f; --pygments-nl: #777700; --pygments-nn: #00f; --pygments-nt: #008000; --pygments-nv: #19177c; --pygments-ow: #a2f; --pygments-w: #767676; --pygments-mb: #666; --pygments-mf: #666; --pygments-mh: #666; --pygments-mi: #666; --pygments-mo: #666; --pygments-sa: #ba2121; --pygments-sb: #ba2121; --pygments-sc: #ba2121; --pygments-dl: #ba2121; --pygments-sd: #ba2121; --pygments-s2: #ba2121; --pygments-se: #b26120; --pygments-sh: #ba2121; --pygments-si: #b4577d; --pygments-sx: #008000; --pygments-sr: #b4577d; --pygments-s1: #ba2121; --pygments-ss: #19177c; --pygments-bp: #008000; --pygments-fm: #00f; --pygments-vc: #19177c; --pygments-vg: #19177c; --pygments-vi: #19177c; --pygments-vm: #19177c; --pygments-il: #666; }
- Dark theme (https://warframe.fandom.com/wikia.php?controller=ThemeApi&method=themeVariables&cityId=544934&variant=dark&version=1630095664):
:root { --theme-body-dynamic-color-1: #fff; --theme-body-dynamic-color-1--rgb: 255,255,255; --theme-body-dynamic-color-2: #e6e6e6; --theme-body-dynamic-color-2--rgb: 230,230,230; --theme-page-dynamic-color-1: #fff; --theme-page-dynamic-color-1--rgb: 255,255,255; --theme-page-dynamic-color-1--inverted: #1e0c1b; --theme-page-dynamic-color-1--inverted--rgb: 30,12,27; --theme-page-dynamic-color-2: #e6e6e6; --theme-page-dynamic-color-2--rgb: 230,230,230; --theme-sticky-nav-dynamic-color-1: #fff; --theme-sticky-nav-dynamic-color-1--rgb: 255,255,255; --theme-sticky-nav-dynamic-color-2: #e6e6e6; --theme-sticky-nav-dynamic-color-2--rgb: 230,230,230; --theme-link-dynamic-color-1: #1e0c1b; --theme-link-dynamic-color-1--rgb: 30,12,27; --theme-link-dynamic-color-2: #3a3a3a; --theme-link-dynamic-color-2--rgb: 58,58,58; --theme-accent-dynamic-color-1: #fff; --theme-accent-dynamic-color-1--rgb: 255,255,255; --theme-accent-dynamic-color-2: #e6e6e6; --theme-accent-dynamic-color-2--rgb: 230,230,230; --theme-body-background-color: #000000; --theme-body-background-color--rgb: 0,0,0; --theme-body-background-image: url(); --theme-body-text-color: #fff; --theme-body-text-color--hover: #cccccc; --theme-sticky-nav-background-color: #666666; --theme-sticky-nav-text-color: #fff; --theme-sticky-nav-text-color--hover: #cccccc; --theme-page-background-color: #222222; --theme-page-background-color--rgb: 34,34,34; --theme-page-background-color--secondary: #434343; --theme-page-text-color: #e6e6e6; --theme-page-text-color--rgb: 230,230,230; --theme-page-text-color--hover: #b3b3b3; --theme-page-text-mix-color: #848484; --theme-page-text-mix-color-95: #2c2c2c; --theme-page-accent-mix-color: #444444; --theme-page-headings-font: 'Rubik'; --theme-link-color: #88aaee; --theme-link-color--rgb: 136,170,238; --theme-link-color--hover: #e1e9fa; --theme-link-label-color: #1e0c1b; --theme-accent-color: #666666; --theme-accent-color--rgb: 102,102,102; --theme-accent-color--hover: #999999; --theme-accent-label-color: #fff; --theme-border-color: #535353; --theme-border-color--rgb: 83,83,83; --theme-alert-color: #e2001b; --theme-alert-color--rgb: 226,0,27; --theme-alert-color--hover: #fe485e; --theme-alert-label: #fff; --theme-warning-color: #cf721c; --theme-warning-label: #1e0c1b; --theme-success-color: #0d8134; --theme-success-color--rgb: 13,129,52; --theme-success-label: #fff; --theme-message-color: #aa4a98; --theme-message-label: #fff; --theme-community-header-color: #FFFFFF; --theme-community-header-color--hover: #cccccc; --theme-background-image-opacity: 100%; } .skin-fandomdesktop .CodeMirror { --codemirror-yellow: #ffd700; --codemirror-light-blue: #adf; --codemirror-blue: #08f; --codemirror-green: #290; --codemirror-red: #f50; --codemirror-dark-red: #dd1616; --codemirror-purple: #a900fe; --codemirror-pink: #e0e; --codemirror-light-gray: #eee; --codemirror-gray: #84a0a0; } .mw-highlight { --pygments-background: #434343; --pygments-err: #fe6b6b; --pygments-c: #54a8a8; --pygments-k: #00b800; --pygments-o: #9b9b9b; --pygments-ch: #54a8a8; --pygments-cm: #54a8a8; --pygments-cp: #d58a00; --pygments-cpf: #54a8a8; --pygments-c1: #54a8a8; --pygments-cs: #54a8a8; --pygments-gd: #ff6d6d; --pygments-gr: #fe6b6b; --pygments-gh: #8f8fff; --pygments-gi: #00b400; --pygments-go: #9c9c9c; --pygments-gp: #8f8fff; --pygments-gu: #ff42ff; --pygments-gt: #6c99fe; --pygments-kc: #00b800; --pygments-kd: #00b800; --pygments-kn: #00b800; --pygments-kp: #00b800; --pygments-kr: #00b800; --pygments-kt: #fe639c; --pygments-m: #9b9b9b; --pygments-s: #e77c7c; --pygments-na: #91a72f; --pygments-nb: #00b800; --pygments-nc: #8e8efe; --pygments-no: #ff6969; --pygments-nd: #cb78ff; --pygments-ni: #9b9b9b; --pygments-ne: #e1817c; --pygments-nf: #8e8efe; --pygments-nl: #a0a000; --pygments-nn: #8e8efe; --pygments-nt: #00b800; --pygments-nv: #9492ea; --pygments-ow: #cb78ff; --pygments-w: #bbb; --pygments-mb: #9b9b9b; --pygments-mf: #9b9b9b; --pygments-mh: #9b9b9b; --pygments-mi: #9b9b9b; --pygments-mo: #9b9b9b; --pygments-sa: #e77c7c; --pygments-sb: #e77c7c; --pygments-sc: #e77c7c; --pygments-dl: #e77c7c; --pygments-sd: #e77c7c; --pygments-s2: #e77c7c; --pygments-se: #dc8742; --pygments-sh: #e77c7c; --pygments-si: #ca89a3; --pygments-sx: #00b800; --pygments-sr: #ca89a3; --pygments-s1: #e77c7c; --pygments-ss: #9492ea; --pygments-bp: #00b800; --pygments-fm: #8e8efe; --pygments-vc: #9492ea; --pygments-vg: #9492ea; --pygments-vi: #9492ea; --pygments-vm: #9492ea; --pygments-il: #9b9b9b; }
- Default on Fandom wikis (for reference):
:root { --theme-body-dynamic-color-1: #1e0c1b; --theme-body-dynamic-color-1--rgb: 30, 12, 27; --theme-body-dynamic-color-2: #3a3a3a; --theme-body-dynamic-color-2--rgb: 58, 58, 58; --theme-page-dynamic-color-1: #1e0c1b; --theme-page-dynamic-color-1--rgb: 30, 12, 27; --theme-page-dynamic-color-1--inverted: #fff; --theme-page-dynamic-color-1--inverted--rgb: 255, 255, 255; --theme-page-dynamic-color-2: #3a3a3a; --theme-page-dynamic-color-2--rgb: 58, 58, 58; --theme-sticky-nav-dynamic-color-1: #fff; --theme-sticky-nav-dynamic-color-1--rgb: 255, 255, 255; --theme-sticky-nav-dynamic-color-2: #e6e6e6; --theme-sticky-nav-dynamic-color-2--rgb: 230, 230, 230; --theme-link-dynamic-color-1: #fff; --theme-link-dynamic-color-1--rgb: 255, 255, 255; --theme-link-dynamic-color-2: #e6e6e6; --theme-link-dynamic-color-2--rgb: 230, 230, 230; --theme-accent-dynamic-color-1: #fff; --theme-accent-dynamic-color-1--rgb: 255, 255, 255; --theme-accent-dynamic-color-2: #e6e6e6; --theme-accent-dynamic-color-2--rgb: 230, 230, 230; --theme-body-background-color: #ffc500; --theme-body-background-color--rgb: 255, 197, 0; --theme-body-background-image: url(https://static.wikia.nocookie.net/dev/images/b/b5/Site-background-light/revision/latest?cb=20210803135441); --theme-body-text-color: #1e0c1b; --theme-body-text-color--hover: #66295c; --theme-sticky-nav-background-color: #520044; --theme-sticky-nav-text-color: #fff; --theme-sticky-nav-text-color--hover: #cccccc; --theme-page-background-color: #ffffff; --theme-page-background-color--rgb: 255, 255, 255; --theme-page-background-color--secondary: #f4f3f4; --theme-page-text-color: #3a3a3a; --theme-page-text-color--rgb: 58, 58, 58; --theme-page-text-color--hover: #6d6d6d; --theme-page-text-mix-color: #9d9d9d; --theme-page-text-mix-color-95: #f5f5f5; --theme-page-accent-mix-color: #afbdbd; --theme-page-headings-font: 'Rubik'; --theme-link-color: #520044; --theme-link-color--rgb: 82, 0, 68; --theme-link-color--hover: #000000; --theme-link-label-color: #fff; --theme-accent-color: #5f7a7b; --theme-accent-color--rgb: 95, 122, 123; --theme-accent-color--hover: #93abac; --theme-accent-label-color: #fff; --theme-border-color: #cecece; --theme-border-color--rgb: 206, 206, 206; --theme-alert-color: #bf0017; --theme-alert-color--rgb: 191, 0, 23; --theme-alert-color--hover: #59000a; --theme-alert-label: #fff; --theme-warning-color: #cf721c; --theme-warning-label: #1e0c1b; --theme-success-color: #0c742f; --theme-success-color--rgb: 12, 116, 47; --theme-success-label: #fff; --theme-message-color: #753369; --theme-message-label: #fff; --theme-community-header-color: #0e191a; --theme-community-header-color--hover: #31585c; --theme-background-image-opacity: 100%; }
- Wiki specific styling is defined in MediaWiki:Common.css and MediaWiki:Fandomdesktop.css
- Users can install this script to access a quick reference guide on Fandom's CSS variables: https://dev.fandom.com/wiki/FD-CSS-VList
Database Design Guidelines[]
Database design guidelines can be found on WARFRAME Wiki:Updating Databases#For Developers.
Porting Templates To Lua[]
Sometimes, templates have lots of repeated wikitext or is too large to maintain with nested parser functions and complex logic. This is when a template should be rewritten as a Lua function inside a module (process called "Luafication"). This function would be invoked on the appropriate template page that is to be transcluded onto pages. See https://dev.fandom.com/wiki/Lua_templating/Converting_Wikitext_templates and Wikipedia:Guide to Scribbling for an examples of this.
Bug Reports[]
Bugs on wiki scripts can be reported on WARFRAME Wiki:Bug Reports.
Tracking Latest Wiki Activity[]
Latest edits can be viewed on Special:RecentChanges and Special:RecentChangesLinked. If you want an RSS or Atom feed of recent changes, you can use the following urls:
- RSS: https://warframe.fandom.com/api.php?hidebots=1&urlversion=2&days=30&limit=50&action=feedrecentchanges&feedformat=rss
- Atom: https://warframe.fandom.com/api.php?hidebots=1&urlversion=2&days=30&limit=50&action=feedrecentchanges&feedformat=atom
See mw:API:Feedrecentchanges and mw:API:Watchlist feed for documentation on what query strings can be passed into the URL to modify the feed output.
Advanced[]
Debugging[]
Error Tracing and Null Edits[]
- Locating pages with broken scripts: Category:Pages with script errors
error()
andassert()
functions will transclude an error message with a simple stack trace for runtime errors:Lua error in Module:Icon at line 112: p._Pol(iconname, color, imagesize): Invalid icon name "" [[Category:Icon Module error]]. Backtrace: [C]: in function "assert" Module:Icon:112: in function "_Pol" Module:Weapons:2809: in function "buildMeleeComparisonString" Module:Weapons:2857: in function "chunk" mw.lua:518: ? [C]: ?
- Use NewPP parser report (F12 and CTRL+F "NewPP") to view statistics on the resources used to render page and what scripts are using the most allocated time or memory. FANDOM wikis have a maximum limit of 7 second script runtime and 50 MB usage.
- Transclusion expansion time report shows how long it took for page transclusion to happen
- If you cannot find an error on the page, go to inspect element and search for these HTML tags:
<strong class="error"><span class="scribunto-error" id="mw-scribunto-error-0">
- Sometimes script errors are hidden behind tooltips whose HTML tags are located within
<div id="tooltip-storage">
near the bottom of the page's article content container.
- Sometimes script errors are hidden behind tooltips whose HTML tags are located within
- For stack traces that throw an error on numbered arguments, argument numbers are on a one-based positional index.
- For example, refers to an error on argument #13 (thirteenth position) of the format() function.
Lua error in Module:Void/page on line 184: bad argument #13 to 'format' (number expected, got nil).
- For example,
- Use https://dev.fandom.com/wiki/MassNullEdit to null edit multiple pages in Category:Pages with script errors. Null edits force the server to rebuild the page using new data instead of relying on caching.
- Uses MediaWiki's API to submit page edits that do not modify page contents: https://warframe.fandom.com/api.php?action=help&modules=edit
- This is one way to check where module functions are used. If performing a major refactoring of code, deleting/refactoring a function and null editing all the possible pages it may be used in can be used to double check if there are script errors anywhere.
- It may be helpful to disable custom stylesheets and custom scripts when debugging:
?useuserjs=0 to end of URL to temporarily disable personal JS ?useusercss=0 to temporarily disable personal CSS ?useusercss=0&useuserjs=0 for both ?usesitecss=0 to disable wiki's locally defined CSS in MediaWiki namespace ?usesitejs=0 to disable wiki's locally defined JS in MediaWiki namespace ?safemode=1 to load page without on-site CSS and JS
- In your browser's development console, you can type in
mw.config.get('ScribuntoErrors')
to get an array of Scribunto error messages on the article. It will be null if there are no script errors on the page.
Viewing Module Output and Purging Cache[]
- If you want to print things out to the console, use
mw.log()
for general use ormw.logObject()
for tables.- Outputs can be viewed in the SourceEditor on articles in the "Parser profiling data" section or in the debug console when editing modules.
- Make sure to remove these calls or comment them out from live code as they do take up allocated Lua memory and time.
mw.dumpObject()
may be helpful in outputing table contents to a human-readable format inerror()
orassert()
.- For performance reasons, avoid using
assert()
. See https://devforum.roblox.com/t/be-careful-when-using-assert-and-why/1289175 for a great write up on the topic.
- For performance reasons, avoid using
- If a function outputs wikitext to be rendered by the frame, then it may be helpful to add a unique category link to the output to see what pages that function is used around the wiki.
- Visual errors are harder to detect and usually require manually going to pages and reviewing generated content by modules.
- Special:ExpandTemplates can be helpful in rendering the raw wikitext and HTML returned by a function.
- Add the
?action=purge
query string to the URL to purge the page's cache server-side to ensure latest edits are persisted and are used for rendering the page.
NewPP Report and Performance[]
NewPP parser report provides additional performance details on rendering wikitext on articles.
- FANDOM wikis have a maximum limit of 7-second Lua script runtime and 50 MB of memory usage per page. This limit is not per
{{#invoke:}}
on a page. Multiple{{#invoke:}}
calls on a single page will contribute towards the same time and resource limit. - Fastest way to find NewPP report is by opening up the browser's developer tool (F12) and CTRL+F for NewPP in DOM and Style Inspector. Alternative ways include:
- Scrolling to the bottom of the element containing the article's content as NewPP will always be appended when wikitext is parsed (
<div class="mw-parser-output">
) - In SourceEditor, click "Show Preview" and scroll down to "Parser profiling data:"
- Scrolling to the bottom of the element containing the article's content as NewPP will always be appended when wikitext is parsed (
- Sometimes Lua profiles are not clear about the function(s) that take up the most time. Any function names that start with
mw
are from base Lua libraries that are included in the Scribunto extension. See the GitHub repo of Extension:Scribunto. - Module performance can be measured using
os.time()
andos.difftime()
functions.[1] - Special:ExpandTemplates can be used to see how the parser takes in wikitext input and generate the resultant HTML.
Example report for Weapon Comparison page when Lua time usage exceeds 7 seconds (see Wikipedia:Template_limits for more details one what each line means):
NewPP limit report Cached time: 20210806221243 Cache expiry: 1209600 Dynamic content: false CPU time usage: 10.012 seconds Real time usage: 10.020 seconds Preprocessor visited node count: 1980/1000000 Preprocessor generated node count: 0/1000000 Post‐expand include size: 734758/2097152 bytes Template argument size: 64/2097152 bytes Highest expansion depth: 8/40 Expensive parser function count: 0/100 Unstrip recursion depth: 1/20 Unstrip post‐expand size: 1561684/5000000 bytes Lua time usage: 7.006/7.000 seconds Lua memory usage: 36.13 MB/50 MB Lua Profile: <mw.lua:683> 1680 ms 24.0% upper 680 ms 9.7% Scribunto_LuaSandboxCallback::formatNum 640 ms 9.1% type 520 ms 7.4% contains <Module:Table:144> 440 ms 6.3% (for generator) <mw.lua:665> 360 ms 5.1% <mw.lua:695> 340 ms 4.9% _getVersion <Module:Version:49> 340 ms 4.9% assert 340 ms 4.9% <mw.language.lua:62> 280 ms 4.0% [others] 1380 ms 19.7% ExtLoops count: 0
Row | Description | Example |
---|---|---|
Cached time | Time that report is made or Lua script is ran in YYYYMMDDHHMMSS format | 20210806221243 |
Cache expiry | Expiry time of cached content in seconds | 1209600 |
Dynamic content | false | |
CPU time usage | Time spent running code on CPU | 10.012 seconds |
Real time usage | Elapsed time spent, including time spent waiting for code to be ran on CPU | 10.020 seconds |
Preprocessor visited node count | How many XML tree nodes that have been visited, corresponding to the page's HTML structure | 1980/1000000 |
Preprocessor generated node count | How many XML tree nodes that have been created, corresponding to the page's HTML structure. See Category:Pages where node count is exceeded | 0/1000000 |
Post‐expand include size | Sum of the lengths of the expanded wikitexts generated by templates, parser functions and template variables | 734758/2097152 bytes |
Template argument size | Total length of template arguments in bytes that have been substituted | 64/2097152 bytes |
Highest expansion depth | How many nested templates, parser functions, template variables, and template parameters are being expanded. See Category:Pages where expansion depth is exceeded and Help:Expansion depth | 8/40 |
Expensive parser function count | How many expensive parser functions are called. See Category:Pages with too many expensive parser function calls and mw:Help:Magic words#Statistics | 0/100 |
Unstrip recursion depth | How many recursive strip markers that are unstripped | 1/20 |
Unstrip post‐expand size | Page size after unstripping strip markers | 1561684/5000000 bytes |
Lua time usage | Total CPU time usage by Lua script | 7.006/7.000 seconds |
Lua memory usage | Total memory usage by Lua script | 36.13 MB/50 MB |
Lua Profile | How long specific Lua functions are being executed as logged by Lua profiler | |
ExtLoops count | How many loops are executed by Extension:Loops parser function | 0 |
Transclusion Expansion Time[]
Similar to NewPP, a report on how long transclusions of other articles' content took can be found in a comment in the source HTML.
Example report for Weapon Comparison:
Transclusion expansion time report (%,ms,calls,template) 100.00% 7103.518 1 -total 31.58% 2243.389 1 Weapon_Comparison/Melee 30.39% 2158.848 1 Weapon_Comparison/Primary 19.33% 1373.271 1 Weapon_Comparison/Secondary 8.06% 572.752 1 Weapon_Comparison/Railjack 3.09% 219.421 1 Weapon_Comparison/Arch-Melee 3.06% 217.634 1 Weapon_Comparison/Arch-Gun 2.20% 156.619 1 Weapon_Comparison/Amp 1.41% 100.116 1 Weapon_Comparison/Robotic 0.22% 15.854 1 Weapon_Comparison/Melee/Skin
Query Strings and Action API[]
- See Manual:Parameters to index.php for a list of parameters that can be added to the query string of
warframe.fandom.com/wiki
- See Special:ApiSandbox for an interactive interface on building the request URL using the MediaWiki's Action API on this wiki. Full documentation can be found on https://warframe.fandom.com/api.php
- For API rate limits on your current account, see https://warframe.fandom.com/api.php?action=query&meta=userinfo&uiprop=ratelimits (see API:Ratelimit)
Internationalization and Localization[]
Since the wiki's modules are being forked and used in our sister wikis in other languages, our modules should be internationalized (i18n) as much as possible so that content can be easily localized (l10n) in other wikis' locale.
- i18n is primarily done through Module:I18n. Import this module to the module you want to i18n and load messages through
loadMessages(pageName)
wherepageName
is the full page name where messages are stored. Then usei18n:msg(messageKey)
to get a localized message based on its key. See w:c:dev:Global_Lua_Modules/I18n for more details and full documentation on the module.- See Module:Math and Module:Math/i18n for a live example of a module that has implemented i18n on the wiki.
- Translation menu can be found on Special:BlankPage/I18nEdit.
Using an External Text Editor[]
External editors will have to use MediaWiki's API to fetch page content and update pages. Use at your own risk. The wiki is not responsible for any problems these third-party software may cause. You must have Lua binaries and executable installed to run Lua scripts on your local machine.
- Visual Studio Code
- https://github.com/Frederisk/Wikitext-VSCode-Extension with https://github.com/Frederisk/Wikitext-Extension-Gadget
- In the settings for the extension, set
Api Path
to/api.php
andHost
towarframe.fandom.com
so you can render the wikitext using this wiki's MediaWiki API
- In the settings for the extension, set
- https://github.com/Frederisk/Wikitext-VSCode-Extension with https://github.com/Frederisk/Wikitext-Extension-Gadget
- Sublime Text[2]
Technology Stack[]
- Main article: WARFRAME Wiki:Solution Stack
The technology stack of the wiki from the perspective of script editors (disregarding hosting services, actual databases, and things in the scope of Fandom developers):
- MediaWiki - wiki engine
- Extension:PortableInfobox by Fandom
- See Special:Version for full list of extensions and software that this wiki is ran on
- MediaWiki Action API
- WARFRAME repositories and endpoints (indirectly through https://warframestat.us/):
- Lua - scripting
- Extension:Scribunto - allows embedding of Lua scripts in MediaWiki
- Standard and custom Lua libraries that come with Extension:Scribunto
- PHP - backend
- LuaSandbox - extension that allows Lua scripts to run in PHP
- JavaScript - frontend
- jQuery library
- See MediaWiki:ImportJS for list of imported user-created scripts
- FandomDesktop - styling
- FandomMobile - styling
- https://static.wikia.nocookie.net/warframe/images/ or https://vignette.wikia.nocookie.net/warframe/images/ - Image CDN endpoints
- Ace editor - Online embedded code editor integrated through Extension:CodeEditor
Module Dependency Graph[]
As of 06:15, 7 August 2021 (UTC), our codebase's module dependencies look like this:
See Module:DependencyGraph for the DOT file that produces this graph.
External Links[]
- https://dev.fandom.com/wiki/Lua_templating
- https://www.mediawiki.org/wiki/Lua/Overview
- https://help.fandom.com/wiki/Extension:Scribunto
- https://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual
- https://en.wikipedia.org/wiki/Wikipedia:Lua
- https://en.wikipedia.org/wiki/Help:Lua_debugging
- https://community.fandom.com/wiki/Help:Advanced_CSS_and_JS
Further Reading[]
- https://en.wikipedia.org/wiki/Wikipedia:Guide_to_Scribbling - Luafication of wikitext templates to Lua modules
- https://community.fandom.com/wiki/User_blog:FishTank/Evolving_Wiki_Performance - Google's Core Web Vitals and Fandom wikis
- https://community.fandom.com/wiki/User_blog:FishTank/State_of_Mobile_2021 - 2021 trends on Fandom wikis and mobile platforms
- https://developer.roblox.com/en-us/learn-roblox/coding-scripts - For learning Lua and general programming concepts, albiet in the context of Roblox
- https://www.educative.io/blog/object-oriented-programming - For learning Object Oriented Programming paradigm that most modules follow
- Example of OOP implementation in Lua (in the context of video game scripting): https://github.com/yfrit/yfritlib/blob/master/Class.lua
- https://community.fandom.com/wiki/User_blog:Grunny/Introducing_Lua,_for_faster_and_more_powerful_templates - Fandom's introduction of Lua templates in June 2014
Third-Party Lua Packages[]
- https://luarocks.org/ - LuaRocks is a package manager for Lua modules outside of the MediaWiki environment; this website may be a good resource to look for community-based packages to port to this wiki or any other MediaWiki-based wiki