Greasy Fork is available in English.

Github Lijst met codetalen laat alles zien

Uitbreiden Github Lijst met talen in de repository,Toon elke taal,In plaats van kleine onderdelen erin te verstoppen“ander”Omlaag

  1. // ==UserScript==
  2. // @name Github List of code languages show all
  3. // @description Expand Github List of languages on the repository,Show each language,Instead of hiding small parts in“other”Down
  4. // @name:zh-CN Github 代码语言列表显示全部
  5. // @description:zh-CN 扩展 Github 存储库上的语言列表,显示每种语言,而不是将小部分隐藏在“其他”下
  6. // @name:ar Github قائمة لغات الكود إظهار الكل
  7. // @description:ar يوسع Github قائمة اللغات في المستودع,إظهار كل لغة,بدلاً من إخفاء الأجزاء الصغيرة فيها“آخر”تحت
  8. // @name:bg Github Списък с кодови езици, покажи всички
  9. // @description:bg Разширяване Github Списък на езиците в хранилището,Покажете всеки език,Вместо да криете малки части в“друго”Надолу
  10. // @name:cs Github Seznam kódových jazyků zobrazuje vše
  11. // @description:cs Rozšířit Github Seznam jazyků v úložišti,Zobrazit každý jazyk,Místo schovávání malých částí“ostatní”Dolů
  12. // @name:da Github Liste over kodesprog viser alle
  13. // @description:da Udvide Github Liste over sprog på lageret,Vis hvert sprog,I stedet for at gemme små dele ind“andre”Ned
  14. // @name:de Github Liste der Codesprachen alle anzeigen
  15. // @description:de Expandieren Github Liste der Sprachen im Repository,Jede Sprache anzeigen,Anstatt kleine Teile darin zu verstecken“andere”Runter
  16. // @name:el Github Η λίστα των γλωσσών κώδικα εμφανίζει όλα
  17. // @description:el Διαστέλλω Github Λίστα γλωσσών στο αποθετήριο,Εμφάνιση κάθε γλώσσας,Αντί να κρύβεις μικρά κομμάτια“άλλος”Κάτω
  18. // @name:en Github List of code languages show all
  19. // @description:en Expand Github List of languages on the repository,Show each language,Instead of hiding small parts in“other”Down
  20. // @name:eo Github Listo de kodlingvoj montras ĉion
  21. // @description:eo Vastigi Github Listo de lingvoj sur la deponejo,Montru ĉiun lingvon,Anstataŭ kaŝi malgrandajn partojn en“aliaj”Malsupren
  22. // @name:es Github Lista de lenguajes de código mostrar todo
  23. // @description:es Expandir Github Lista de idiomas en el repositorio,Mostrar cada idioma,En lugar de esconder piezas pequeñas en“otro”Abajo
  24. // @name:fi Github Luettelo koodikielistä näyttää kaikki
  25. // @description:fi Laajentaa Github Luettelo arkiston kielistä,Näytä jokainen kieli,Sen sijaan, että piilottaisit pieniä osia“muu”Alas
  26. // @name:fr Github Liste des langages de code afficher tout
  27. // @description:fr Développer Github Liste des langues sur le référentiel,Afficher chaque langue,Au lieu de cacher de petites pièces“autre”Vers le bas
  28. // @name:he Github רשימת שפות הקוד מציגה הכל
  29. // @description:he לְהַרְחִיב Github רשימת השפות במאגר,הצג כל שפה,במקום להחביא חלקים קטנים“אַחֵר”לְמַטָה
  30. // @name:hr Github Popis kodnih jezika prikaži sve
  31. // @description:hr Proširiti Github Popis jezika u repozitoriju,Prikaži svaki jezik,Umjesto skrivanja malih dijelova“drugo”dolje
  32. // @name:hu Github A kódnyelvek listája az összeset mutatja
  33. // @description:hu Bontsa ki Github Az adattárban található nyelvek listája,Minden nyelv megjelenítése,Ahelyett, hogy apró alkatrészeket rejtene el“más”Le
  34. // @name:id Github Daftar bahasa kode menunjukkan semuanya
  35. // @description:id Memperluas Github Daftar bahasa di repositori,Tunjukkan setiap bahasa,Daripada menyembunyikan bagian-bagian kecil di dalamnya“lainnya”Turun
  36. // @name:it Github L’elenco delle lingue del codice mostra tutto
  37. // @description:it Espandere Github Elenco delle lingue nel repository,Mostra ogni lingua,Invece di nascondere piccole parti“altro”Giù
  38. // @name:ja Github コード言語のリストをすべて表示
  39. // @description:ja 拡大する Github リポジトリ上の言語のリスト,各言語を表示,小さな部品を隠すのではなく、“他の”下
  40. // @name:ka Github კოდის ენების სია აჩვენებს ყველაფერს
  41. // @description:ka გაფართოება Github ენების სია საცავში,აჩვენე თითოეული ენა,მცირე ნაწილების დამალვის ნაცვლად“სხვა”ქვემოთ
  42. // @name:ko Github 코드 언어 목록 모두 표시
  43. // @description:ko 확장하다 Github 저장소의 언어 목록,각 언어 표시,작은 부품을 숨기는 것보다“다른”아래에
  44. // @name:nl Github Lijst met codetalen laat alles zien
  45. // @description:nl Uitbreiden Github Lijst met talen in de repository,Toon elke taal,In plaats van kleine onderdelen erin te verstoppen“ander”Omlaag
  46. // @name:nb Github Liste over kodespråk viser alle
  47. // @description:nb Utvide Github Liste over språk på depotet,Vis hvert språk,I stedet for å gjemme små deler i“annen”Ned
  48. // @name:pl Github Lista języków kodowych pokaż wszystko
  49. // @description:pl Zwiększać Github Lista języków w repozytorium,Pokaż każdy język,Zamiast ukrywać małe części w“Inny”W dół
  50. // @name:pt-BR Github Lista de linguagens de código mostra todas
  51. // @description:pt-BR Expandir Github Lista de idiomas no repositório,Mostrar cada idioma,Em vez de esconder pequenas peças“outro”Abaixo
  52. // @name:ro Github Lista de limbaje de cod arată toate
  53. // @description:ro Extinde Github Lista limbilor din depozit,Arată fiecare limbă,În loc să ascundă piese mici“alte”Jos
  54. // @name:ru Github Список языков программирования показать все
  55. // @description:ru Расширять Github Список языков в репозитории,Показать каждый язык,Вместо того, чтобы прятать мелкие детали в“другой”Вниз
  56. // @name:sk Github Zoznam kódovacích jazykov zobrazuje všetko
  57. // @description:sk Rozbaliť Github Zoznam jazykov v úložisku,Zobraziť každý jazyk,Namiesto skrývania malých častí“iné”Dole
  58. // @name:sr Github Листа кодних језика приказује све
  59. // @description:sr Прошири Github Листа језика у спремишту,Прикажи сваки језик,Уместо да кријете мале делове унутра“друго”Доле
  60. // @name:sv Github Lista över kodspråk visar alla
  61. // @description:sv Expandera Github Lista över språk på förvaret,Visa varje språk,Istället för att gömma smådelar i“andra”Ner
  62. // @name:th Github รายการรหัสภาษาแสดงทั้งหมด
  63. // @description:th ขยาย Github รายชื่อภาษาในพื้นที่เก็บข้อมูล,แสดงแต่ละภาษา,แทนที่จะซ่อนส่วนเล็กๆ ไว้ข้างใน“อื่น”ลง
  64. // @name:tr Github Kod dilleri listesi tümünü göster
  65. // @description:tr Genişletmek Github Depodaki dillerin listesi,Her dili göster,Küçük parçaları saklamak yerine“diğer”Aşağı
  66. // @name:ug Github كود تىللىرىنىڭ تىزىملىكى ھەممىنى كۆرسىتىدۇ
  67. // @description:ug كېڭەيتىش Github ئامباردىكى تىللارنىڭ تىزىملىكى,ھەر بىر تىلنى كۆرسەت,كىچىك قىسىملارنى يوشۇرۇشنىڭ ئورنىغا“other”تۆۋەنگە
  68. // @name:uk Github Список мов коду показати всі
  69. // @description:uk Розгорнути Github Список мов у репозиторії,Показати кожну мову,Замість того, щоб ховати дрібні деталі“інші”вниз
  70. // @name:vi Github Danh sách ngôn ngữ mã hiển thị tất cả
  71. // @description:vi Mở rộng Github Danh sách ngôn ngữ trên kho lưu trữ,Hiển thị từng ngôn ngữ,Thay vì giấu những phần nhỏ trong“khác”Xuống
  72. // @name:zh-TW Github 代碼語言列表顯示全部
  73. // @description:zh-TW 擴充 Github 儲存庫上的語言列表,顯示每種語言,而不是將小部分隱藏在“其他”下
  74. // @name:zh-HK Github 代碼語言列表顯示全部
  75. // @description:zh-HK 擴充 Github 儲存庫上的語言列表,顯示每種語言,而不是將小部分隱藏在“其他”下
  76. // @name:fr-CA Github Liste des langages de code afficher tout
  77. // @description:fr-CA Développer Github Liste des langues sur le référentiel,Afficher chaque langue,Au lieu de cacher de petites pièces“autre”Vers le bas
  78. // @match https://github.com/*
  79. // @author Davoleo,人民的勤务员 <china.qinwuyuan@gmail.com>
  80. // @namespace https://github.com/ChinaGodMan/UserScripts
  81. // @supportURL https://github.com/ChinaGodMan/UserScripts/issues
  82. // @homepageURL https://github.com/ChinaGodMan/UserScripts
  83. // @license MIT
  84. // @icon data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAYAAADimHc4AAAACXBIWXMAAAsTAAALEwEAmpwYAAAc6klEQVR4nO2deXBb13XGaTedTDxNp532j04z0yaTTpvpdGrLsjZLXAGCIPbtYd93ggRAkAC4kyK1y/JuybG1WJQsyZZsSd4X2dp3iqJkWd7kLXWdrWmcNMk0jWOfzrnAA+4FHkCIpCq55pv5hos4JPX9Ptx337nnXlZVzV6z1+w1e81es9fk100md2DU5An+3uQOfMK5fC/q7J40Z/P889fVvPom1T9VS9XtNc3a/TUy1UfVzerf18jUD6NXM/7DDA4fZ/GFweINEZk9QSKTJwicO/CWzukdUdr936v6f34tkun+vk6h66uTaS7VybVQK9dkJFMT1TSrobZZo5jxH8y5Ant58wsBoIzuABjd/i/0Du9xtdVtuiYpuI5XrVxfVyfX7qtX6D5H43kJAaiRqrbN6A+XSqPftHhC/1Xe/Iw4l59I7/B9oLM7W4aGhr5R9RW9amtrv1Ev1wcaFLr3G5Q6qFdkVMp8CsAv586d+6cz9ovoHD4TnX5bIAKRzj5whmMMAN58zunLSW/3fKK1OhPBYHDmfqFrfg3dXK/QWUVKPTFeyPyMNNCst4DBGYIGpSFjfrMaqqUquFMql83Yr2N0+7fR6Q/G0tC3bB1R19LV0NrZC7ZAaxEAQ1Z6hxc0dvcHSpNDV3WDXw1qtQaNF6n0gBICINEawegOgz/WBeFEH5HK6mYALG5SbZixX8rkCX5IA2jvGc4B6B25i6hn5C7yeU8kkYNAA0Dp7B7Q2lzH1FbXbVU32CXRWX4gUupfFqkMIGQ+vlUYHeAIxaGlox/CCV4ZAFZ/W858oibl5Rn5xThH8O9o8/Ft9/AaQQBEw2shObACfG0dmSEoaz4PIAvhD2qz40GV1/vtqut83alSfVusNtwvUun+QJvPA8C3OocPArEuYryQ+ahAtAdqZZocgCVNyi/n1cr+Ztq/oMHpC9EA3JF4afOzAFDdS9dCsn8FeFoTBea7c1JbnB8rTDZR1XW66pVcg1ht+Fis5iBjPpt+rQ2N74aWzoGMSgAItfcSNWrNNABYLFFbp/1Lck7fJnrmE2rvKpt+3nxU19I1RB19y8ARijIANLyszi+UJvt6juO+VenvVMtxfybSaP6KFn6u4v8Tx32rUaV/UKw2fMGanwGgMjnB15aCCG+8oPnFADQWb8581J0SxX1V072M7sAYDSDetbSi9NMAuoZWE0WSffjQVgDARaQyO64oja7FjZz9ezK92djMWZfLjfbtCpPtoJyzva0wWn8s46y/UxhtIOesRDJDRs0GS15682+lOtOnEq3pskRjfF2iNW5t1HLDjXKtoVZt+q5IwS1qVBvea9RwgObTAJq0ZnCGE8R4xvwK0h9s7wWzt5UBsFgiPzJN+4duNnuCv+XNR6GRlaRfCEB6aDWk+leCO5LIQLC6clJbnEQqs4NImZXCZM/IaMupFACp3pyRzpRTkzYjnLmg0Hgh8zlXCMIdfdCaHCwGUEH6EYCnNZk3v0kBixsVv57WA6nOFfwBnX6LNzzl9KdpDa6CWHqQzJbKmS8EoFz6CwEUmi8EAL+Hty1FjKfNLw+ANZ8HgMKZUA5AkwKqG5VTL8/o7F4NnX588JpO+nnzUamBVdA5sAJc4fhVp19htIPS5CDC91HNButVp9/gDBCjefOnk36ieA+I1aac+aiFTXLxlAEYXL40XXbwx5I58yu5+fLmlwKQGlgFyYGV0NLRA1q7l5ivtrjA5A6CIxQDb2snBNu7IdLZD9H0EMS6hyHRuwzae2iNEMW7M2pLD0JLZz8E23vIkGAPxsDoCYPG6gaJ1kQASPUWcLckGONnIv0IQG605wFIFHCnRNoydQBu38M0gHCie8bSTwNIDqyEzr4V5Abf0bccOvtXkLdEvXmh+SwA1nyirmGiWFbR9NKshqAtNUQMQ7Px/VIACs2f7ObLm4/CqSsDoFG2bsoAOLd/H110a0v1z3j6k6j+vNB8IQDF5gsAKGl+BgAPoZz500k/yuAI5cxHLZLIt08dgMt3ggYQ714qaH5FN9+s+eUAdBaa3zdz6afNv1bpR5m9bSwAseyVKQMwuoNv0yXnjt6Rr0z6Y2UAFJpf2c23b1IAgVgP2AKxnPmZIUg+Ph0AP6IBJPuXzaa/vXT6EYA92E6bDwvFsnemAcD/MxbAisnTX8HNN5f+gcrTX3b4uUHSj3KEEgyARRLZj6YOwBP4Bb3gkhxcecOM/e0V3XyHKr75Xm3ZoRQAV7gjZ372FfDjqQNwBX5KA0gNrppNf3tp8/2xbnC3dBYAkH88ZQCcy/8xvdzY2b98SmWHStLfWdHN98ZOPwJwBNtz5i8Sy6Z3D+Cc/nEaQLxn6Q059sev2dg/+dSTN58HYPG2FQBoPjYl84PB4C2cy/8BvdjelhyYTX976fSj9M5Q0SvgH6TSb141AL3DN1rY7RDvGpqRssNk6e+o5MHrBkw/CtcEePOzrwBYIJI9dFXma2wee6H5nkj7dUz/shuy7FBovj+akURrZgAsFDd/ubBRqq3IfKu15S9x/k8DsPpbiKmz6e8tm34egLs1CbVyHW9+5lXQIP1JrVr9F5MCMDi9W+lONxSZ/dzAZYfoDZR+lC/aBdZAHBY18kNQRvMbmh4oa77R7rmVc/m/oNMfau+esZLzjIz93TdG0a0UADQf5W3rAqXZXQBA+vk8UfM/lgSgd/ieoZNvDbRW9NT7tU9/TBiAuzUN1c0q3nyieQ0S4cZdrd37L4Xpj6YHb4iyQ/wrmH5eOC1lANQ3fT63Xvr9IgA6p+dhOv2OUNt1KTknviJFt5z55QC0polqZdocgPn1TTCvXrKmqP3c6A78J5P+1Gz6g1NIvxAAnc2fMx91R53kp0z7utbmMdBFNzPp/ywz9HzNS87+q0i/pzUFrkgSu+RyAObVS2BBQ3Nz/uZr922j0x+IJWdk7EezWzp6SXeD1R8BzuknDVkqs5NpN1FaHKCxYu+oFwxOPxjdITB7I2D3t5JuZHekg3Q4YDs4NsnizCzU3pMzKxjvhkAsTdoJ8euwuw27Icy+VjC6gqC1Yf+Rh3Q3Nxts0KQzg0htYDZZ1Cm0pEFLojGBwuQEvcMPNn8MAtNMPwJANelsOfOzyj8dcy7/pzQAbDOfTvqxZOEIR0Fr90za6yPPNlpV0unG9/lU0ulW2OV8VTtcqDZz/HcE4gx3VH7zzZpPA+BcYQbA3BrxR8R8kzP4fdp8HIquKv0UAGzCdYbioM52u13rTrfGrPnlABSaXw5AoflMn6dUSUB4IqmrTr87kgJXSxIWiPIA7qiTwMIG+Xdw+mmjATjD0SmlP949TL4H3+V2Pfs8RWUAFJlfBgDT55kVDlW47Hg16UcAqDqZNmc+am61SF2lc3jvoYtuwXjqqtOP3Wg43Aj1eToDEVi2cjVs3LgJnt37NBx85WU4/voBOHvsCJw7fgSOHzxAPj7w4gvwwjP74KkndsHjo6PwyA8fhfvvfwBWr7kLBpeOQKqnH9oSSWiJd4C3JQquYAQsngCR3RcCd6gN3KFWCMcSEO1IQ1ffIIwsXwF3rbsH1j+0HrZs2gS7tm+H/bufgJee3Q+HX34JTh16DU4ffp3o8CsvwWvPPwdP7doJG9avh+6+QZAZLCyA7FrvkiYVWPzRSW++tPkoqc7GAqhtHMb+z/00gNZU31WVHTD52Pdf2OUcinXA7l07Yez4ETh34iicO87rSJHGeB3jdbhIZ48W6hCrI3mdOXJQWIcz4k0XFEI59BqBc/L1A7D50UfB6PAwALDcXC1Vgy0Qrzj97kgS1FYfbT7MrZNsx+arsdzmOrwBdy+tOP04tTS6g0Xmr1t3LzGJGM+rBICxCgAUm18aQEnzpwCA1/HXXiGvCHqtF4UPWHhPqCT9CMDgamEB1IiPIIBP6N2Nyf7lFaffGYoV9fg/tH49jJ84SoTGnz95HC6NnYG3Js7BlTcm4MqbF+H9Ny/Ch5cvEb1/6SLRlUsX4L2LE/DuhfPw9sQ4XB4fgzfPnYFLY6fhjbOn4OLpE3Dh1AmYOHUczp88lvn+OIxlhzL+Z+K/TZw8DhOnTsDFMyfh0tlT5Pu8NX6W6J2Jc/DuxfPw3sXz8P4bF7KagCsXz8O7F8bhnfNj8ObYafJzTh8+mAdx8DVYtXoNs9qFwk0dkwNIEpl90UIA72P/52c0gPTg6orKDjju0ztc0Pzlq9fmjLhw+iT5j3741qW8sqY/t38/dHb35baz4vv4uQ8vvwEf8HqzUBcnFQ/z/UsXymrvnj3kXiLHG7/eApF4B+zbsycTkAIhvLNHDhIApw4egHRPX9GKF27umCz9KFugPW9+bSPcXiP6GW7C+296b296aE1F6Td7Qkz6w/FOOHPsMDH/zfGzrPFZYfKHV6wqOfMZXraSGHStAGDqewaGSs58evqHyKugCMTFCZg4eYwAOHbgZTDY3PRqF5nd4HNCufTjNNQR6mABVIt/g0PQFzSAStLfmupn0o96bt/TxHwcOj4SMB+Tv3TZyiLzZQVTz8GR5dcs/V19A4Lm01PPdE9/kfm8cAhECLt3PJ7t+cmudomaQW8PgjPUURYAKp9+McypFv0RAfyBPloAd75Pln57sI0B0Dc0AuMnjpHxVtD8ty7Bk7t2VTbv15vhiZ07ZxzA49u2VTzv3z46KgDgPNH48SMEQksswQBoVHPk+QAhlDIf/40GcHu16PdVeqfvN/TRAmhwufRjf6jWxk47n9u3l9z0MOVCAN57Y4LsM6bLDnqTFbrcFki7zKAzsg9enNML71wYrxhA3nxhAG9PnAOVycGYL1WqIcqpiCRyFoBMb4bL42eZ9PMA3rswTmZUTz6+nVntWiCSgc0fJ8OMM5QQBGD3t+fNJwDEn+Ea8C9oALjLvVz68ZAOOv34UITTS7zhlkr/6Ogok34lZ4VujwWGvGaitMsEcgP75Lv1sdEZS//GjRuZ9DfI1RA3qqDLrIK0SQkxTgm10oz5/IPXo49sLDKf1+Wx03Dy4AFQGm30ciPobAFwBBPgDCbAEWovAmD1xRgAc2rEP8ZXwKf0uQ5YzykHwNPawaR/zV13w8UzmaGn1NgfjnUw6ffb0Pw8gEGPCbxWtuYTaEvMSPpRTn+YSb9VmzGfB4Ayqdmyg80bKgkAb+ZjRw9Dd18/s9ol01uJ+TwAHJJ4813hTrB4W/PpJxJ9WKV3eq/QABI9w2VrPngqCg1gx/btZdM/fuokqf/kABis0EulfygLoNfN1nykOjOcO3l82uk/e+xovvYjU0OdTA0JKv28EkYFHrCRA4Awzhw9XGQ+DwBfBT/csIEBUK80UOa3sxDCnWD0RGjz8e2lKp3Nc5I+1STWNVQWQOHe3ldeeK7k2I+f3/H440z6zWYrSf996TbYvm45PDLUBUNeEwy6TcAZ2ZLz9tFt007/Y1u2MOlXKtXE/DVRH2xe3g8PdMWhy6SAtEkBMpmcqfts3rhJ0HxeTz/5BAMAoeH4z5tvD+K6RIIMSwgA14dpAHOqRa9W6ezuPTQAXEApV3IuLLph6aBU+hHA2rvvZmY+AZsVRgJ2eGrDPfDUhnvJ23UdYQLAb2ErnqvWrpv21HNkxUoGgE2jhl67FnbeuxJ23buKaEXYSQBYVXKm5jM0srwsgGMHXmXWevHZgE4+MR+BBNsJBGxTyadfhLOgLVUam/t++kyfQCxVdsEle8pJTjhbKJV+VKKrlwHQ7rLAsN8Gex66OwvhHrgrHiAAYnYWQCyZnjaAUKydARA0qKDXqoEdd6/IAVgetEHKKAe/lgUQiERLmo86f+IoA2BBg7SE+RkAEq2VBVAjXlalsbhSNABXS7xsnycNAMvNb58/VzL9KFcowsz7u9yZcX9texA2LeuDB7pjxHxUymFk6v1Wb3DaZQfO4WHm/TFjZuwfCdphQ38HrI0HSPoRQFQvZyqeGrOjLACsT9GL7RkACVZZ8xEI3iPy5otgzp0N4SqFxa6hAeDabbnlRly3pQG8OT5W0nwU5/IxAPo8+RvvIMqdV4+TBaC3u6cNQM5ZGACdJvrmq8iZj0oYWABSnbGk+eQVcPIYAwCfC4TM57W4SZ03v1oEty1uaKxSmb1/S59ohTfZcl3O+HX0gsvFs6fKAlBZHEzZYdArDGDAbYQ+V/5QDRQWyqZjPgpXw+in3rS5NIDOLIBcublZXRbAmSOHcuajFjcqSENAHkBe9kAC5tVJGABza2v/mu+K+zl9qhUuypfq8zS6AgyAE4cOlTS/EACWHAZLpH+gAAAuNV4LAKkC88sBqJGqSpqPeu3F55lWk+omFfUK6Mg/lAUTwLkjjPlzljT8G9WW6D7Em4/CMyFK9fqYvS0581HP7dtXFgA+Y9AAcAgSSv+A2wg9Do4BIDQEXY35WOvH5w666NZhFE5/kpNDQp9fbEE1aY1lAezYto0BUC/XCZqPH8s4BwPg9mrRszkAaqvrbvpMN7wRl+pydobjzGL75s2PlQXgDLYwRTcsO5QCkLRzzGK71RuaNgCDnT1OEssOQulHAG26vPk4pdRYHCXNR91z771Mq4lEa8mYj/Wg3BNx5uN6hT6ffhz/lzQM5gCojA4xDQDXiEt1uvljKQYA1vdLmY8LLO3pbgZAzClsfr+LgzYrCyDakZqW+ahgW5wBENALpx/l07AA/JFoWQCxzhQDQGlyC5qPwhkSDeD2xbUL841ZHPcnWpv7V/SBerGupYIAIsl+ptXE6guXBYC1Irrk7LeWBuA1s60mhQ9iUwGAizx0ydmiFk4/yqRklxvxQayU+e9OnINGtZ7p88ETdJ08AMp8nSNUmP5foudMg67a6nyeBoDHTQr1eeK5Phqbi+n1OX7ooID5GQA7tj/OADAazUXmD2QB6A0sgG2jo1dVdig0H/XY5i0MALlcKWg+StrMAti0cWNJAK++kLkB8wDmNzTnxn3afBSeosUCqH+iqD1dbXGG6NMMsUczWaLN3OKPMI1W6+69X9B81MTpkyDjsseJ6c14qiF0u4rTn3awXW749tyJY9NKPy62Y6m84ERbaOeKAUT1MsZ8fB+LcYIALoxD3+BSus8TRCouk/6sePNtgQQZfnjzUbfeKbIVAVAoFLdorO5f08dJtiX7BbucsRGWBoDPDu9cOC8IABVsa2cWXDyW4vR7CoYfXyQ+7fQjAJTdG2QWXEwqRVH6jQXDj8UdKJl+7NLAZwR6+FFbfEXmo7S2AJP+WxfX/2ruXMUtgrtkVBbHdhoAPhULtZgnepeD1upmWg0ffGiDoPmo0a1bGQAyvQnSzgwEND/l4EBa0Oe59bHHpp1+0m7yxgRsfPRRBkCNVAFRgyJnfpteBtWU+ahHH3mkZPqXLV/JpH8hFuGyQ08hAGzgotN/25L60nuGFRbHksJWk7bUgGCPv6slwfR54teeOXZEEACuF+ADHF3v1xhM0OkwEql1rPl6uyu7JDn99COAt8+PkXIIveDSKFNARCeHiF4BoiZ2+GnScqSHSAjAkVdfhsWNcib9MoO9aPhxYvnZES68+cK/1ojmVJW7NBbXGA3Ahq8Cgc3V7d0joDK7mCZbb0sMLp8fKwKAbSZP7txVcZfzE2RRfmbSz2v71lHBPs/CRivUtq1bBc3HlT+d1cmkf0FDM+n3KTQf39ZKNYXpP1Q12SU3WsV0vR/V0tkruMPFF00WdTl3dvdn7wd58/k+n8Hh5ZN2OQ8OL5v21FMIAAobfCcDkO7uKznue0IRZuaTGfu9TPrRfFTh2I/pv21JXe2kAMi9wOw4QVc88fj29t4RwS1GeJpuYatJayIJF8+eLgKAJi0dWVEy/UPLlpMWxZkwXwgANl3xPZ6FfZ5oPvYN4dcUmo+tjyaXjyk7kNIDLkGi4QXm2/ztRQ9ety1ueLki8/l7gdri+IJpMw/FBPd3xXuGQW/3FvX6mNx+eHr3bsEut+f274P2VA/obB7Q2dwQT3XDs/v2TrvsUC79tPbu2Q2haILUelD4tLx395OCycdWebHKUGQ+tqjTQw8uOfIARGpj4cznj7cvqZ9bMQDyKjDaNtBFN5x2BuNdghvsYumlZOYk1GzV0dUHr77wwjXr83y/wvSXarQqteCy/6k94MYhh6r38wAWS5Rg9cdy6afNV1m8bNUzM/avvirzyatAobhFabZ/xG4xckJrZ5/g0QK4qdvg8JXc4YK9o1s2b4E3zp6+5gCuTAEAaTU5dgQeeOBBMLt8zGI7bT72gebMD3cS83kAHGk/FxeO/e8sXLiw4r+NwFxKs7lBaXZ8Tpcd8AzmaGpIeGd79whYfa0g40rv78J2E3z5333PffDM00/D+ZMnrlv6Tx1+HZ7cuYPspDG7vHCnRMY0WrHLjU3QpLOSJlwh8/HAVvw6Nv0N//OvS+oWVE3nkhltEWZ/l8kOaosbWjv7S+7t9UfTBFQlG+zEag40FieE4wnoGxwmYDZv2gRP7NgJz+/fDwdfeQlOHDoIp44chjNHD5HZCOqt82M5ALj/APcCYEv8yUMHiY6+9iocePF52LdnN5lWPvzww7Bi5WroSHWDwx8GkVJfeKZP4cEaOQA1Mi1wrgi4WvJDDd/rQ/p93DhUNRcNPbcuqQ9UzcQlN9oeKtxgh0fHhxM9JY+VQUC4xxdBVHKOv6jE5rqpbi8t2mDHnmZb1OMvZD7OcnSOILhJdxuaXmw+PmzdUdfEdDsQADXiVVUzdw3dLOMse4q2lxptxORSB2tEOvohFO8mG7VNnjA551/IfHEF20sn/fOBAuZX8uBVmH78PjLOToYUNF7Q/CwAGeekej3p9ItH0bOqGb5ukhksDwttrsabb2vngODRAi24mz3eTYQ72n2tSbD520Bv94OcsxEQM725utL08/u8cGzX2PBksGjOdNJYWwCANx9PRqxu1hT2eWYA1Igeuhbm5y4pZ10r56xfFs77seSM68VtqcGisx0QAppPFOui1A3BaBd4Ih1gD0TB7GnJHC1gx/ZHN8iNDpDqLCDRcEQICf9kIAr/jCBtfp1cl1PmD6/pQaTQg0SDkwF8teKDJa76+cnCCR5D4I50ZjuYU8RoTxnz8XPY29Ost5Ehh2kzz5j/JbPMeC0vqdbEyTnbL4Xm/Tgs4V+Va00OMAdrtHRkXgmM+bH8x4EopeyZEIFomsjfhurKvI1mzoRA4ce+rPDvwBDltori+5mzI3KKpDLKflzS/AIAuB212WAnewCYDRZ8m3m1+D/m1DQqq/4vryaT6bvNevOpkkcL6M3kb7R425LkVYGnmpBXAmV+iAJSyvwMADS/i5jPAxA0H99vTYOPB5A9vEPI/AyAzE4WDw+AMh/PgMZmWlxomddAjpgp2GDHm99w6NaFDd+puk7XTY0azt6sN39S7mCNZp2FnD6CN2wEEohOYn6sq6T5/twrohBAsfl5ABnz6VdEkfktKbKNVGP1kiXEhaJmpuhGm58F8O9zqhtC13S8r/TCv2LXpDGubtKZflNJyRk/j0/VOrsPTO4WsPqiBI4nnABfWxK8rUliLELJmN81ufn4MQ+gwPxMohOkaw3HfjxcFdOtsnhAqrOS+8VCsbzoqVcQQE3jr26vEQ+VXNW6ntd8qfTPJVpjVKI1vnsjHKyxuMJ5f6myA2N+jfjK3FpJ9621tZOf/Xn9r6Gbm1ScvFHDbWnUcD+5VsfK1FQw9SwsOZd78Cosut1RJ/n0jnrJD+fWSBq/yn+i/aZGnXGxWKVfKVZzr4pVhl/cqOmfVy/5+by6phfm1TctnVstmf9VNr3sVa/RfF+s1BvrFbpUg1K3vk6he6ZeoRurV2g/qJNpf1Sv0H1WJ9P8bqbSv0gs++1CseyzRWLZR4tEzVcWiJvPzK9v3ju/Xnrf/HppYoFYpltQ2/Td6+3L7DV7zV6z1+xV9bW6/hcSd2EeG4WLWAAAAABJRU5ErkJggg==
  85. // @compatible chrome
  86. // @compatible firefox
  87. // @compatible edge
  88. // @compatible opera
  89. // @compatible safari
  90. // @version 1.1.0.0
  91. // @require https://unpkg.com/js-yaml@4.1.0/dist/js-yaml.min.js
  92. // @resource languageColors https://raw.githubusercontent.com/github/linguist/master/lib/linguist/languages.yml
  93. // @grant GM_getResourceText
  94. // @grant GM_log
  95. // @grant GM_xmlhttpRequest
  96. // @grant GM_getValue
  97. // @grant GM_setValue
  98. // @grant GM_addStyle
  99. // @grant GM_registerMenuCommand
  100. // @run-at document-idle
  101. // @connect api.github.com
  102. // @noframes
  103. // @Created 2024-09-24 04:33:03
  104. // @modified 2024-09-24 04:33:03
  105. // ==/UserScript==
  106. let TOKEN = GM_getValue('githubToken', '')
  107. GM_addStyle(`
  108. .expand-overlay{position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,0.5);display:flex;justify-content:center;align-items:center;z-index:1000;}
  109. .expand-content{background:white;padding:20px;border-radius:8px;width:400px;box-shadow:0 4px 15px rgba(0,0,0,0.2);position:relative;}
  110. .expand-title{margin:0 0 10px 0;font-size:20px;}
  111. .expand-description{margin-bottom:20px;font-size:14px;color:#666;}
  112. .expand-description a{color:#007bff;text-decoration:underline;}
  113. #github-token-input{width:100%;padding:8px;border:1px solid #ccc;border-radius:4px;margin-bottom:20px;font-size:14px;}
  114. #ex-save-token{background-color:#28a745;color:white;border:none;padding:10px 20px;cursor:pointer;border-radius:4px;margin-right:10px;}
  115. #ex-cancel-token{background-color:#dc3545;color:white;border:none;padding:10px 20px;cursor:pointer;border-radius:4px;}
  116. `)
  117. function createexpand() {
  118. const expandHTML = `
  119. <div class="expand-overlay">
  120. <div class="expand-content">
  121. <h2 class="expand-title">Set GitHub Token</h2>
  122. <p class="expand-description">
  123. Enter your GitHub personal access token with "repo" scope.
  124. <a href="https://github.com/settings/tokens/new?description=GitHub-Linguist-Expand-UserScript&scopes=repo" target="_blank" rel="noopener noreferrer">
  125. Click here to create a new token
  126. </a>
  127. </p>
  128. <input type="text" id="github-token-input" placeholder="Enter your GitHub personal access token">
  129. <button id="ex-save-token">Save</button>
  130. <button id="ex-cancel-token" class="cancel">Cancel</button>
  131. </div>
  132. </div>
  133. `
  134. const expandContainer = document.createElement('div')
  135. expandContainer.innerHTML = expandHTML
  136. document.body.appendChild(expandContainer)
  137. const input = document.getElementById('github-token-input')
  138. input.value = GM_getValue('githubToken', '')
  139. document.getElementById('ex-save-token').addEventListener('click', () => {
  140. const token = input.value.trim()
  141.  
  142. GM_setValue('githubToken', token)
  143. expandContainer.remove()
  144. TOKEN = token
  145.  
  146. })
  147. document.getElementById('ex-cancel-token').addEventListener('click', () => expandContainer.remove())
  148. }
  149. GM_registerMenuCommand('Set GitHub Token', function () {
  150. createexpand()
  151. })
  152. //Loads languages.yml (from Github's linguist repo) the most updated, official and complete collection of github languages and their colors
  153. //loaded into a JS object via jsyaml (a library to parse yaml inside of javascript)
  154. const languages = jsyaml.load(GM_getResourceText('languageColors'))
  155. //Contains information about languages and their percentages in the repository
  156. let langPercentagesMap = {}
  157. //Contains information about languages and their colors
  158. let langColorsMap = {}
  159. /**
  160. * Function to standardize and modernize GM_xmlhttpRequest to work with promises
  161. * @param {String} url of the endpoint
  162. * @param {Object} options Contains extra information about the request
  163. * @returns a promise with the requested content
  164. */
  165. function request(url, options = {}) {
  166. return new Promise((resolve, reject) => {
  167. GM_xmlhttpRequest({
  168. url,
  169. method: options.method || 'GET',
  170. headers: options.headers || {
  171. Accept: 'application/json',
  172. 'Content-Type': 'application/json'
  173. },
  174. responseType: options.responseType || 'json',
  175. data: options.body || options.data,
  176. onload: res => resolve(res.response),
  177. onerror: reject
  178. })
  179. })
  180. }
  181. /**
  182. * Retrieve information about the languages of a repository via the Github API
  183. * @param {String} user owner of the repository
  184. * @param {String} repo name
  185. * @returns the languages of the repository as a JS Object | null if the promise is rejected for any reason.
  186. */
  187. async function retrieveLanguages(user, repo) {
  188. try {
  189. return await request(`https://api.github.com/repos/${user}/${repo}/languages`, {
  190. headers: {
  191. Accept: 'application/vnd.github.v3+json',
  192. ...(TOKEN ? { authorization: `token ${TOKEN}` } : {})
  193. }
  194. })
  195. }
  196. catch (e) {
  197. return null
  198. }
  199. }
  200. /**
  201. * Builds language bar segments assigning the correct colors and width depending on the language and it's frequency in the repository
  202. * @param {string} name of the language
  203. * @param {string} color of the language
  204. * @param {number} percentage of the language in the repository code
  205. * @returns a segment span of the language bar with the correct width and color
  206. */
  207. function buildBarSegmentSpan(name, color, percentage) {
  208. const segment = document.createElement('span')
  209. segment.style.setProperty('background-color', color, 'important')
  210. segment.style.width = percentage + '%'
  211. //Removes any margin which would make the language bar otherwise inaccurate
  212. segment.style.setProperty('margin', '0', 'important')
  213. //Make sure there's at least 1px of width in the bar segment (fixes width of 0.0% segments)
  214. //TODO: investigate a better way to do this
  215. segment.style.paddingLeft = '1px'
  216. segment.setAttribute('itemprop', 'keywords')
  217. segment.setAttribute('aria-label', name + ' ' + percentage)
  218. segment.setAttribute('data-view-component', 'true')
  219. segment.setAttribute('class', 'Progress-item color-bg-success-inverse lingustexpand')
  220. return segment
  221. }
  222. /**
  223. * Builds a chip for each language containing
  224. * - The Color of the language in the bar
  225. * - The Name of the language
  226. * - The Percentage of the language in repository files
  227. * @param {String} owner of the repository
  228. * @param {String} repo name
  229. * @param {String} name of the language
  230. * @param {String} color of the language
  231. * @param {number} percentage percentage of the language in the repository code
  232. * @returns A chip components featured as legend for the language bar
  233. */
  234. function buildLanguageChip(owner, repo, name, color, percentage) {
  235. const chip = document.createElement('li')
  236. chip.classList.add('d-inline')
  237. const chipLink = document.createElement('a')
  238. chipLink.classList.add('d-inline-flex', 'flex-items-center', 'flex-nowrap', 'Link--secondary', 'no-underline', 'text-small', 'mr-3')
  239. chipLink.href = `/${owner}/${repo}/search?l=${name}` //Chip link should bring you to the search query with the correct language in place
  240. //Parse SVG BALL directly injecting the correct color as in-line style
  241. const svgText = `
  242. <svg style="color:${color};" aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1"
  243. width="16" data-view-component="true" class="octicon octicon-dot-fill mr-2">
  244. <path fill-rule="evenodd" d="M8 4a4 4 0 100 8 4 4 0 000-8z"></path>
  245. </svg>
  246. `
  247. const svgTMP = document.createElement('template')
  248. svgTMP.innerHTML = svgText
  249. chipLink.append(svgTMP.content)
  250. //^ uses a template HTMLElement to parse HTML into its respective DOM elements
  251. //Adds language name to the chip
  252. const chipName = document.createElement('span')
  253. chipName.classList.add('color-fg-default', 'text-bold', 'mr-1')
  254. chipName.textContent = name
  255. chipLink.append(chipName)
  256. //Adds Language percentage to the chip
  257. const chipValue = document.createElement('span')
  258. chipValue.textContent = percentage + '%'
  259. chipLink.append(chipValue)
  260. chip.append(chipLink)
  261. return chip
  262. }
  263. /**
  264. * Builds the custom language stats section and returns it
  265. * @returns The full section with complete repository language stats
  266. */
  267. function buildLanguagesSection(owner, repo) {
  268. const languageSection = document.createElement('div')
  269. languageSection.classList.add('mb-3', 'mt-1')
  270. const bar = document.createElement('span')
  271. bar.classList.add('Progress', 'mb-2')
  272. bar.setAttribute('data-view-component', 'true')
  273. Object.keys(langColorsMap).forEach((lang, i) => {
  274. const segment = buildBarSegmentSpan(lang, langColorsMap[lang], langPercentagesMap[lang])
  275. //if (i !== 0) {
  276. // segment.style.setProperty('margin-left', '1px');
  277. //}
  278. console.log(`当前语言为第${i}个`)
  279. bar.appendChild(segment)
  280. })
  281. languageSection.append(bar)
  282. const languageUL = document.createElement('ul')
  283. Object.keys(langColorsMap).forEach((lang) => {
  284. const languageChip = buildLanguageChip(owner, repo, lang, langColorsMap[lang], langPercentagesMap[lang])
  285. languageUL.append(languageChip)
  286. })
  287. languageSection.append(languageUL)
  288. return languageSection
  289. }
  290. //MAIN ENTRY POINT
  291. function insertCustomLangStats() {
  292. if (document.querySelector('.Progress.mb-2')) return
  293. langPercentagesMap = {}
  294. langColorsMap = {}
  295. //Selects the box element that contains files and folders on the repo page
  296. const mainContent = document.querySelector('.Box-sc-g0xbh4-0.iNSVHo')
  297. if (!mainContent)
  298. throw Error('mainContent Hook Selector is dead!')
  299. //The original language bar in the sidebar
  300. const originalLangBar = document.querySelector('div.Layout-sidebar span.Progress')
  301. //array that is generated from the tab URL, it's structured this way: ["", "<repo_owner>", "<repo_name>"]
  302. const ownerRepo = window.location.pathname.split('/')
  303.  
  304. //only works against github.com/ABC/DEF links
  305. if (ownerRepo.length === 3) {
  306. //retrieves necessary information about the repository's languages
  307. retrieveLanguages(ownerRepo[1], ownerRepo[2]).then((lang_vals) => {
  308. //assume request is successful if object is not null and it doesn't contain 'message' in its keys
  309. if (lang_vals !== null && !lang_vals.message) {
  310. //Sum of all language values
  311. const total = Object.values(lang_vals).reduce((prev, curr) => prev + curr)
  312. //for each language in the object
  313. Object.keys(lang_vals).forEach((lang) => {
  314. langColorsMap[lang] = languages[lang].color
  315. langPercentagesMap[lang] = ((lang_vals[lang] / total) * 100).toFixed(1)
  316. })
  317. } else return //Short Circuit
  318. //Build the new custom lang stats
  319. const languageSection = buildLanguagesSection(ownerRepo[1], ownerRepo[2])
  320. mainContent.insertAdjacentElement('beforebegin', languageSection)
  321. //^ inserts our custom language stats before the box containing directories and files
  322. //Remove original Language Section (sidebar)
  323. originalLangBar.parentElement.parentElement.remove()
  324. })
  325. }
  326. }
  327. insertCustomLangStats()
  328. function observeUrlChanges(callback, delay = 2000) {
  329. let lastUrl = location.href
  330. const observer = new MutationObserver(() => {
  331. const url = location.href
  332. if (url !== lastUrl) {
  333. lastUrl = url
  334. setTimeout(() => {
  335. // console.log("页面发生变动,允许执行")
  336. callback()
  337. }, delay)
  338. }
  339. })
  340. observer.observe(document, { subtree: true, childList: true })
  341. return observer
  342. }
  343. observeUrlChanges(insertCustomLangStats)