User:Icie/natural soul count.js

From Karteria DWRP Wiki
Jump to navigationJump to search

Note: After publishing, you may have to bypass your browser's cache to see the changes.

  • Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
  • Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
  • Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5.
const  souls = {"🦚": {reg : /🦚/g, name : "Aves", symbol:"🦚"},
        "πŸ…": {reg : /πŸ…/g, name : "Carnivora", symbol:"πŸ…"},
        "πŸ¦‹": {reg : /πŸ¦‹/g, name : "Arthropoda",  symbol:"πŸ¦‹"},
        "πŸ™": {reg : /πŸ™/g, name : "Cephalopoda",  symbol:"πŸ™"},
        "🦌": {reg : /🦌/g, name : "Ruminanita", symbol:"🦌"},
        "πŸ‡": {reg : /πŸ‡/g, name : "Glire",  symbol:"πŸ‡"},
        "🌲": {reg : /🌲/g, name : "Terra", symbol:"🌲"},
        "🐍": {reg : /🐍/g, name : "Reptilia", symbol:"🐍"},
        "πŸ‘»": {reg : /πŸ‘»/g, name : "Spectral", symbol:"πŸ‘»"},
        "πŸ’Ž": {reg : /πŸ’Ž/g, name : "Golem",  symbol:"πŸ’Ž"},
        "πŸ„": {reg : /πŸ„/g, name : "Fungi",  symbol:"πŸ„"},
        "🦏": {reg : /🦏/g, name : "Perissodactyla", symbol:"🦏"},
        "πŸͺΌ": {reg : /πŸͺΌ/g, name : "Cnidaria",  symbol:"πŸͺΌ"}
       }
 let characters = $(".entry-content .lj-user").parent();
 
 characters = $(".entry-content .ljuser").parent().html().replaceAll('\n','').split("<br>");
 let justChars = characters.filter((text) => {
  const t = $(text).filter(".ljuser");
  return t && t.length > 0;
 });
 //console.log(justChars + " - chars");
 const newArr = {all: [],
   primary: [],
 	secondary: []};
 //let carnivoras = [];
 justChars.forEach(function (text){
  const x = text.match(/(^.+?)\|/g);
 // console.log(x);
  if (x && x.length > 0){
    const grouped = x[0].match(/<[^>]+>(?<charname>.+)<[^>]+>\s?(?<all>(?<primary>(?:.{2}))(?<secondary>.+)?)\s?<span.+?<\/span>\s?<small>(?<playername>.+)\|/);
    if(!grouped || grouped.length === 0){
      console.log("x");
      console.log(x);
    }
  	newArr.all.push(grouped.groups.all);
  	newArr.primary.push(grouped.groups.primary);
  	newArr.secondary.push(grouped.groups.secondary);
    
  }
  
 });
 
 
 const flatPrimary = newArr.primary.join();
 const flatSecondary = newArr.secondary.join();
 for (const [key,value] of Object.entries(souls)){
  souls[key].totalCount = $(".entry-content").text().match(value.reg).length;
  souls[key].secondaryCount = value.reg.test(flatSecondary) ? flatSecondary.match(value.reg).length:0 ;
  souls[key].primaryCount = value.reg.test(flatPrimary) ? flatPrimary.match(value.reg).length:0 ;
  souls[key].isMatch = [];
   souls[key].multi = [];
 		for(const [i,v] of newArr.all.entries()){
      
      if(value.reg.test(v)){
  //      console.log(v);
        souls[key].isMatch.push(v);
        if(v.match(value.reg).length > 1){
          souls[key].multi.push(v);
        }
      }
      
    }
  souls[key].augCount = souls[key].isMatch.length;
      
    }
 let outputTable = `{| class="wikitable"
|+
! colspan="2" |Type
!style="width:5em"|Count
!style="width:5em"|Primary
!style="width:5em"|Additional
|-
| rowspan="10" |Natural souls`;
 let multiNote = "";
 let asterisk = "";
 for (const [i,v] of Object.entries(souls)){
   v.asterisk = "";
   if(v.totalCount !== v.augCount){
     asterisk += "*";
     v.asterisk = asterisk;
     if(v.multi.length === 1){
       multiNote += `<nowiki>${v.asterisk}&lt;/nowiki> ${v.totalCount} souls, ${v.augCount} augmented as ${v.multi.length} character has multiple ${v.name} souls.
     `;
     }else{
     multiNote += `<nowiki>${v.asterisk}&lt;/nowiki> ${v.totalCount} souls, ${v.augCount} augmented as ${v.multi.length} characters have multiple ${v.name} souls.
     `;}
   }
   v.totalCount = v.totalCount === 0 ? "" : v.totalCount;
   v.primaryCount = v.primaryCount === 0 ? "" : v.primaryCount;
   v.secondaryCount = v.secondaryCount === 0 ? "" : v.secondaryCount;
   if(v.name === 'Fungi'){
     outputTable += `
| rowspan="4" |Wild souls`
   }
   outputTable += `
|${v.symbol} ${v.name}
|style="text-align: right"|${v.totalCount}${v.asterisk}
|style="text-align: right"|${v.primaryCount}
|style="text-align: right"|${v.secondaryCount}
|-`;
 }
 
 const d = new Date();
 const day = d.getDate();
 const month = d.getMonth() + 1;
 const year = d.getFullYear();
 outputTable += `
|Marsupialia
|style="text-align: right"|
|style="text-align: right"|
|style="text-align: right"|
|}
 ${multiNote}
 Last updated ${year}-${month}-${day}. <ref>https://alogos.dreamwidth.org/790.html</ref>
 
 [[Natural souls/count_js| Quick tally]]`;
   
 console.log(outputTable);