Skip to content

Instantly share code, notes, and snippets.

@iamravenous
Created March 17, 2026 03:51
Show Gist options
  • Select an option

  • Save iamravenous/b1534365fa506c6ca0dd67c6d29a3a77 to your computer and use it in GitHub Desktop.

Select an option

Save iamravenous/b1534365fa506c6ca0dd67c6d29a3a77 to your computer and use it in GitHub Desktop.
Bookmarklet to import players from HattrickPortal into Hattline with some minor improvements.
javascript:void(function(){if(!location.href.includes('hattrickportal.online'))return;var table=document.getElementById('cphMainWrapper_cphMainWrapper_cphMainWrapper_frvNationalTeam_frvTrackerList_grvPlayers')||document.getElementById('cphMainWrapper_cphMainWrapper_cphMainWrapper_frvNationalTeam_frvFilter_grvPlayers')||document.querySelector('table[id*="grvPlayers"]');if(!table)return;var headers=table.getElementsByTagName('th'),columnMap={p:-1,age:-1,tw:-1,vt:-1,sa:-1,fl:-1,ps:-1,ts:-1,ss:-1,fo:-1,ko:-1,xp:-1,bel:-1,fq:-1,geh:-1,tsi:-1,spec:-1},agreeabilityMap={SY:'Sympathetic',NF:'Nasty Fellow',PL:'Pleasant',CO:'Controversial',PO:'Popular'};function getHeaderText(th){var link=th.querySelector('a');return String(link?link.textContent:th.textContent||%27%27).replace(/\s+/g,%27 %27).trim()}function normalizeHeaderText(text){return String(text||%27%27).replace(/[^a-zA-Z]/g,%27%27).toUpperCase()}for(var i=0;i<headers.length;i++){var rawText=getHeaderText(headers[i]),normalized=normalizeHeaderText(rawText),exactUpper=rawText.toUpperCase();if(normalized===%27SPIELER%27||normalized===%27PLAYER%27)columnMap.p=i;if(normalized===%27ALTER%27||normalized===%27AGE%27)columnMap.age=i;if(normalized===%27TW%27||normalized===%27GK%27)columnMap.tw=i;if(normalized===%27VT%27||normalized===%27DE%27||normalized===%27DEA%27)columnMap.vt=i;if(normalized===%27SA%27||normalized===%27PM%27)columnMap.sa=i;if(normalized===%27FL%27||normalized===%27WI%27||normalized===%27WG%27)columnMap.fl=i;if(normalized===%27PS%27)columnMap.ps=i;if(normalized===%27TS%27||normalized===%27SC%27)columnMap.ts=i;if(normalized===%27SS%27||normalized===%27SP%27)columnMap.ss=i;if(normalized===%27FO%27)columnMap.fo=i;if(exactUpper===%27KO%27||exactUpper===%27ST%27)columnMap.ko=i;if(normalized===%27XP%27)columnMap.xp=i;if(normalized===%27BEL%27||normalized===%27AGR%27)columnMap.bel=i;if(normalized===%27FQ%27||normalized===%27LE%27)columnMap.fq=i;if(normalized===%27GEHALT%27||normalized===%27SALARY%27)columnMap.geh=i;if(normalized===%27TSI%27)columnMap.tsi=i;if(exactUpper===%27S%27)columnMap.spec=i}if(columnMap.tw<0&&columnMap.vt<0&&columnMap.sa<0)return;function getCell(cells,key){var index=columnMap[key];if(index<0||!cells[index])return null;return cells[index]}function getCellText(cells,key){var cell=getCell(cells,key);return cell?(cell.textContent||%27%27).trim():%27%27}function parseIntCell(cells,key){var raw=getCellText(cells,key);if(!raw)return null;var v=parseInt(raw.replace(/[^0-9-]/g,%27%27),10);return isNaN(v)?null:v}function parseFloatCell(cells,key){var raw=getCellText(cells,key);if(!raw)return null;var v=parseFloat(raw.replace(%27,%27,%27.%27));return isNaN(v)?null:v}function parseAge(text){var r={years:17,days:0};if(!text)return r;var m=text.match(/(\d+)\s*\((\d+)\)/);if(m){r.years=parseInt(m[1],10);r.days=parseInt(m[2],10)}return r}function parseAgree(cells){var raw=getCellText(cells,%27bel%27);if(!raw)return null;var up=raw.toUpperCase();return agreeabilityMap[up]||raw}function parseSpec(cells){var cell=getCell(cells,%27spec%27);if(!cell)return%27None%27;var el=cell.querySelector(%27[title]%27);var text=el?(el.getAttribute(%27title%27)||%27%27).trim():(cell.textContent||%27%27).trim();return text||%27None%27}function parseId(link){if(!link)return null;var href=link.getAttribute(%27href%27)||%27%27;var m=href.match(/[?&]playerID=(\d+)/i);return m?parseInt(m[1],10):null}function parseHealth(playerCell){if(!playerCell)return-1;var nodes=playerCell.querySelectorAll(%27[title]%27);for(var k=0;k<nodes.length;k++){var title=(nodes[k].getAttribute(%27title%27)||%27%27).trim();if(!title)continue;if(title===%27Bruised, but playing%27)return 0;if(/Estimated injury time:\s*\[(\d+)\]\s*weeks/i.test(title)){var m=title.match(/Estimated injury time:\s*\[(\d+)\]\s*weeks/i);var weeks=parseInt(m[1],10);if(isNaN(weeks))return-1;return Math.min(Math.max(weeks,1),5)}}return-1}var rows=table.getElementsByTagName(%27tr%27),players=[];for(var j=1;j<rows.length;j++){var cells=rows[j].getElementsByTagName(%27td%27);if(!cells.length)continue;var playerCell=columnMap.p>=0?cells[columnMap.p]:cells[1];if(!playerCell)continue;var link=playerCell.querySelector(%27a[href*="Player.aspx"],a[href*="playerID="],a%27);if(!link)continue;var id=parseId(link),spec=parseSpec(cells),age=parseAge(getCellText(cells,%27age%27)),stamina=parseIntCell(cells,%27ko%27),tsiValue=parseIntCell(cells,%27tsi%27),healthValue=parseHealth(playerCell);players.push({id:id,playerId:id,name:link.textContent.trim(),age:{years:age.years,days:age.days},tsi:tsiValue,salary:parseIntCell(cells,%27geh%27),specialty:spec,form:parseFloatCell(cells,%27fo%27),stamina:stamina,experience:parseFloatCell(cells,%27xp%27),agreeability:parseAgree(cells),leadership:parseFloatCell(cells,%27fq%27),injuryLevel:healthValue,loyalty:0,motherClub:false,homegrown:false,skills:{keeper:{level:%27weak%27,value:parseFloatCell(cells,%27tw%27)},defending:{level:%27weak%27,value:parseFloatCell(cells,%27vt%27)},playmaking:{level:%27weak%27,value:parseFloatCell(cells,%27sa%27)},passing:{level:%27weak%27,value:parseFloatCell(cells,%27ps%27)},winger:{level:%27weak%27,value:parseFloatCell(cells,%27fl%27)},scoring:{level:%27weak%27,value:parseFloatCell(cells,%27ts%27)},setPieces:{level:%27weak%27,value:parseFloatCell(cells,%27ss%27)}},source:%27HTP%27})}if(!players.length)return;var w=window.open(%27https://hattline.org/%27,%27hatrix_window%27);if(!w)return;var sent=0;function send(){if(sent++>30)return;try{w.postMessage({type:%27HTP_IMPORT%27,players:players},%27*%27)}catch(e){}setTimeout(send,500)}setTimeout(send,500)}());
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment