Github Zoznam kódovacích jazykov zobrazuje všetko

Rozbaliť Github Zoznam jazykov v úložisku,Zobraziť každý jazyk,Namiesto skrývania malých častí“iné”Dole

  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)