MediaWiki:Gadget-pikan-inkipedia.js: Difference between revisions

From Inkipedia, the Splatoon wiki
(Made it recognize Splatoon 2. I hope this works...)
m (Correction.)
Line 6: Line 6:
pikan.help_link = "http://splatoonwiki.org/wiki/User:Espyo/Pikan";
pikan.help_link = "http://splatoonwiki.org/wiki/User:Espyo/Pikan";
pikan.module_name = "Inkipedia";
pikan.module_name = "Inkipedia";
pikan.module_version = "1.2.0";
pikan.module_version = "1.3.0";


pikan.types["Problem"] = {
pikan.types["Problem"] = {
Line 81: Line 81:
   reg = /(splatoon 2|splatoon)/gm;
   reg = /(splatoon 2|splatoon)/gm;
   pikan.regex_check(
   pikan.regex_check(
     reg, "Policy", Game name with lowercase 's' found. The official spelling is always with an uppercase 'S'.", null,
     reg, "Policy", "Game name with lowercase 's' found. The official spelling is always with an uppercase 'S'.", null,
     function(r){
     function(r){
       return !pikan.is_common_exception(r);
       return !pikan.is_common_exception(r);

Revision as of 20:31, 3 November 2017

//<nowiki>

function init_pikan() {

pikan.wiki_url = "http://splatoonwiki.org/";
pikan.help_link = "http://splatoonwiki.org/wiki/User:Espyo/Pikan";
pikan.module_name = "Inkipedia";
pikan.module_version = "1.3.0";

pikan.types["Problem"] = {
  color:       "#600",
  background:  "rgba(255, 128, 128, 0.8)",
  description: "General MediaWiki source or general article problems."
};
pikan.types["Policy"] = {
  color:       "#400",
  background:  "rgba(192, 128, 128, 0.8)",
  description: "Issues that break a policy, specific or implied."
};
pikan.types["Style"] = {
  color:       "#206",
  background:  "rgba(160, 128, 255, 0.8)",
  description: "Problems that do not affect the page, but when fixed, make the source easier to use."
};
pikan.types["Question"] = {
  color:       "#420",
  background:  "rgba(255, 192, 128, 0.8)",
  description: "Results that the analyzer cannot decide whether they're real problems or false-positives."
};

pikan.find_problems = function(){
  
  var reg;
  
  //Find "Wikia" -- we aren't involved with Wikia, so get rid of leftovers.
  reg = /wikia/igm;
  pikan.regex_check(reg, "Problem", "\"Wikia\" found. We moved from Wikia, so make sure this isn't a leftover.");
  
  //Find "gamepad"
  reg = /[Gg]amepad/gm;
  pikan.regex_check(reg, "Problem", "\"Gamepad\" found. The correct spelling for the Wii U's controller is \"GamePad\".");
  
  
  //Find "Nunchuck"
  reg = /Nunchuck/igm;
  pikan.regex_check(reg, "Problem", "\"Nunchuck\" found. The correct spelling of the Wii peripheral is \"Nunchuk\".");
  
  
  //Find game names without italicization.
  reg = /Splatoon/igm;
  pikan.regex_check(
    reg, "Policy", "Game and series names should be in italics.", null,
    function(r){
      if(pikan.is_common_exception(r)) return false;
      if(
        pikan.before(r, 2) == "''" &&
        pikan.after(r, 2)  == "''"
      ){
        return false;
      }
       
      //Check if the name is a link caption.
      //Let's cheat a bit and assume that
      //a) the link's text only contains the game name
      //(otherwise the editor would need the bold inside the link)
      //b) the italics are placed correctly before the link.
      if(pikan.after(r, 4)  == "]]''") return false;
      
      //Special cases: if it's part of "Squidbeak Splatoon", "Splatoon Global Testfire",
      //"Splatoon Testfire", then ignore.
      if(pikan.before(r, 10) == "Squidbeak ") return false;
      if(pikan.after(r, 16) == " Global Testfire") return false;
      if(pikan.after(r, 9) == " Testfire") return false;
       
      return true;
    }
  );
  
  
  //Find lowercase "Splatoon" or "Splatoon 2".
  reg = /(splatoon 2|splatoon)/gm;
  pikan.regex_check(
    reg, "Policy", "Game name with lowercase 's' found. The official spelling is always with an uppercase 'S'.", null,
    function(r){
      return !pikan.is_common_exception(r);
    }
  );
  
  
  //Find lowercase "Inkling", "Octoling", "Octarian", etc.
  reg = /(inkling|octoling|octarian|octotrooper)/gm;
  pikan.regex_check(
    reg, "Policy", "Species name starting with a lowercase letter found. It should start with an uppercase letter.", null,
    function(r){
      return !pikan.is_common_exception(r);
    }
  );
  
  
  //Find button names that aren't using the button template.
  reg = /\b([Pp]ress(ing)? (the)? (A|B|X|Y|L|R|ZL|ZR)|(A|B|X|Y|L|R|ZL|ZR) [Bb]uttons?)\b/gm;
  pikan.regex_check(
    reg, "Policy", "Button being referred to by name. It should be displayed using {{button}} instead.", null,
    function(r){
      return !pikan.is_common_exception(r);
    }
  );
  
  
  //Suggest {{NA}} and {{EUOC}} instead of manually-written tags.
  reg = /\((NA|US|EU\/OC|EU\\OC|EUOC|EUAU|EU\/AU|EU\\AU|Europe|North America)\)/igm;
  pikan.regex_check(
    reg, "Question", "Region in parenthesis found. If possible, use {{NA}}, {{EUOC}} or {{NAEUOC}} instead."
  );
  
  
  //"You" outside of guide sections.
  reg = /\b(you|your|you're)\b/igm;
  pikan.regex_check(
    reg, "Question", "The player/reader is referred to as \"you\". This is only okay on guide sections, and this doesn't look like one. If it is, ignore this, otherwise use the third person.", "Inkipedia:Policy#Perspective",
    function(r){
      if(pikan.is_common_exception(r)) return false;
      if(pikan.in_area(r, "<ref", "/ref", false)) return false;
      var walkthrough_sec_reg = /^=+ *Walkthrough/igm;
      var walkthrough_sec_match = null;
      var you_section_nr = pikan.get_section_nr(r);
      while(walkthrough_sec_match = walkthrough_sec_reg.exec(pikan.text)){
        if(pikan.section_in_section(
          you_section_nr,
          pikan.get_section_nr(walkthrough_sec_match)
        )){
          return false;
        }
      }
      return true;
    }
  );
  
  
  //Find "font-family", as it is likely a Wikia visual editor leftover.
  reg = /font\-family/igm;
  pikan.regex_check(reg, "Question", "Font family tampering found. Possibly a Wikia visual editor leftover. Remove it if so.");
  
  
  //Find <p> tags, which are possible Wikia leftovers.
  reg = /<p[ >]/igm;
  pikan.regex_check(reg, "Question", "&lt;p&gt; tag found. There is normally no reason to use them, meaning this could be a Wikia visual editor leftover. Remove it if so.");
  
  
  //Find black text colors, which are possible Wikia leftovers.
  reg = /[ ;"]color: ?(black|#000[000]?)/igm;
  pikan.regex_check(reg, "Question", "Black text color style found. Because it is normally useless to force the text to be black, this is likely a Wikia visual editor leftover. Remove it if so.");
  
  
  //Find gendered nouns; players should be "they".
  reg = /\b(his|him|her|he|she)\b/igm;
  pikan.regex_check(
    reg, "Question", "Gendered noun found. If this is the player, treat them as \"they\". Otherwise, ignore this.", "Inkipedia:Policy#Pronouns",
    function(r){
      return !pikan.is_common_exception(r);
    }
  );
  
  
  //Find "image:" (it should be "file:").
  reg = /\[\[Image\:/igm;
  pikan.regex_check(reg, "Style", "Image being called with \"Image:\" found. \"File:\" is better.");
  reg = /Image:/igm;
  pikan.regex_check(reg, "Style", "Image being called with \"Image:\" found. \"File:\" is better.", null,
    function(r){
      return pikan.in_area(r, "<gallery", "/gallery>");
    }
  );
  
  
  //Find two empty lines in a row.
  reg = /(\n\n\n|\r\r\r|\r\n\r\n\r\n)/igm;
  pikan.regex_check(reg, "Style", "Double empty lines found. Just one is enough. If you want to add vertical spacing, try the {{clr}} template. (If you can't see the selection, just press a letter key.)");
  
  
  //Find redundant "Template:".
  reg = /\{\{Template\:/igm;
  pikan.regex_check(reg, "Style", "\"{{Template:abc}}\" and \"{{abc}}\" are the same, so use the latter form, which is simpler.");
  
  
  //Find trailing spaces.
  reg = /(^ .+$|^.+ $)/igm;
  pikan.regex_check(reg, "Style", "Trailing space found.");
  
  
  //Find double spaces.
  reg = /  /igm;
  pikan.regex_check(
    reg, "Style", "Double spaces found. Just one is enough.", null,
    function(r){
      return !pikan.in_area(r, "|", "="); //Template parameter -- not illegible.
    }
  );
  
  
  //Empty line at the start.
  if(pikan.text.length > 2){
    if(pikan.text[0] == "\n" || pikan.text[0] == "\r"){
      pikan.save_problem(0, 1, "Style", "Empty line at the start found. There's no reason for it to exist, so remove it.");
    }
  }
  
  
  //Missing empty line before section.
  reg = /([^\n=]\n|[^\r=]\r|[^(\r\n)=]\r\n)=.+=/gm;
  pikan.regex_check(reg, "Style", "Add an empty line before section headers, to make it easier to read.");


  //Files share their line with other text.
  reg = /((\[\[File.+\]\][^\n\r\[\]]+$)|(^[^\n\r\[\]]+\[\[File.+\]\]))/igm;
  pikan.regex_check(reg, "Style", "Image has more than just its code on its line; add a line break between it and the text, to make it easier to read.");
  

  //Underscores in file names.
  reg = /\File:.+_.+/igm;
  pikan.regex_check(reg, "Style", "File name with underscores found; spaces are more human-readable.");
  
  
  //Underscores in gallery file names.
  reg = /.+_.+\|/gm;
  pikan.regex_check(
    reg, "Style", "File name with underscores found; spaces are more human-readable.", "",
    function(r){
      return pikan.in_area(r, "<gallery", "/gallery");
    }
  );
  
  
  //Underscores in links.
  reg = /\[\[[^|\]]*_[^|\]]*(\||\]\])/gm;
  pikan.regex_check(reg, "Style", "Link with underscores found; spaces are more human-readable.");
  
  
  //Underscores in template names.
  reg = /\{\{[^\|\}]+_.+(\r|\n|\|\}\})/gm;
  pikan.regex_check(reg, "Style", "Template name with underscores found; spaces are more human-readable.");
  
  
  //Links like [[A|A]].
  reg = /\[\[([^\|\]]+)\|\1\]\]/gm;
  pikan.regex_check(reg, "Style", "Link with the same page and name found. Just simplify it like this: [[Apple|Apple]] &rarr; [[Apple]].");
  
  
  //Links like [[A|AB]].
  reg = /\[\[([^\|\]]+)\|\1[^ ]+\]\]/gm;
  pikan.regex_check(reg, "Style", "Link with a name that contains the page name found. Simplify it like this: [[Apple|Apples]] &rarr; [[Apple]]s.");
  
}

/* * * * * * * * * * * * * * * * * * * * * * * * *
 * Is common exception
 * * * * * * * * * * * * * * * * * * * * * * * * *
 * Returns whether a regex match belongs to a
 * "common exception". Use this to ignore capitalization,
 * spelling, etc. problems on things like template
 * parameter names.
 * reg:  regex match.
 */
pikan.is_common_exception = function(reg){
  //Is it in a template?
  if(pikan.in_area(reg, "{{", "}}")) return true;
  
  //Is it in a comment?
  if(pikan.in_area(reg, "<!--", "-->")) return true;
  
  //Is it a page link or image?
  var in_internal_link = (pikan.in_area(reg, "[[", "]]"));
  if(in_internal_link){
    var in_left_half = pikan.in_area(reg, "[[", "|", "]]");
    //[[A|B]] format.
    if(in_left_half) return true;
  }
  
  //Is it a categorization?
  if(pikan.in_area(reg, "[[Category:", "]]")) return true;
  if(pikan.in_area(reg, "[[category:", "]]")) return true;
  
  //Is it a file name in a gallery?
  if(pikan.in_area(reg, "<gallery", "/gallery")){
    if(pikan.in_area(reg, "\n", "|")) return true;
  }
  
  //Is it in an external link?
  if(!in_internal_link){
    if(
      (pikan.in_area(reg, "[http", "]") ||
      pikan.in_area(reg, "[www", "]")) &&
      pikan.in_area(reg, "[", " ")
    ){
      return true;
    }
  }
  
  return false;
  
}

}

if(typeof(pikan) != "undefined") {
  init_pikan();
  pikan.setup();
}

//</nowiki>