GitHub Sortable Filelist

appends sorting function to github directories

  1. // ==UserScript==
  2. // @name GitHub Sortable Filelist
  3. // @namespace trespassersW
  4. // @description appends sorting function to github directories
  5. // @include https://github.com/*
  6. // @version 18.04.12.1
  7. // 18.04.12 * hotfix
  8. // 16.04.17 * hotfix -- 'time' becomes 'time-ago'
  9. // 16.02.06 * octicons as svg images
  10. // 15.08.12 ++ octicons for file extensions
  11. // 15.08.07 + case-insensitive sorting
  12. // 15.05.07 sorting is now faster
  13. // .12 new age format; fix for chrome
  14. // .10 datetime auto-updating fix; right-aligned datetime column; proper local time; .ext sorting fix;
  15. // .8 sorting by file extention
  16. // .7 date/time display mode switching
  17. // @created 2014-11-10
  18. // @author trespassersW
  19. // @license MIT
  20. // @icon https://i.imgur.com/8buFLcs.png
  21. // (C) Icon: Aaron Nichols CC Attribution 3.0 Unported
  22. // (C) Opticons Font License: SIL OFL 1.1 (http://scripts.sil.org/OFL)
  23. // @run-at document-end
  24. // @grant unsafeWindow
  25. // ==/UserScript==
  26.  
  27. if(document.body && document.querySelector('#js-repo-pjax-container')){
  28.  
  29. var llii=0, _l= function(){/* * /
  30. for (var s=++llii +':', li=arguments.length, i = 0; i<li; i++)
  31. s+=' ' + arguments[i];
  32. console.log(s)
  33. /* */
  34. }
  35. //_l=console.log.bind(console);
  36. var fakejs = // avoid compiler warning
  37. (function(){ "use strict";
  38.  
  39. var ii=0,tt;
  40. var d0=[0,0,1];
  41. var C=[{c:1, d: 0, s: 0},{c:2, d: 0, s: 0},{c:3, d: 1, s: 0}];
  42. var ASC;
  43. var oa=[],ca=[],clock,ext,dtStyle,upc;
  44. var D=document, TB;
  45. var catcher,locStor;
  46. var prefs={dtStyle:0, ext: 0, upc: 1};
  47. var W= unsafeWindow || window;
  48.  
  49. // see: https://octicons.github.com/
  50. var extIcon=[
  51. //0...........1..............2..............3..............4.......
  52. "octoface" ,"zap" ,"list-unordered","paintcan" ,"eye"
  53. //5...........6..............7..............8..............9.......
  54. ,"globe" ,"file-binary" ,"file-zip" ,"file-pdf" ,"megaphone"
  55. //10..........11.............12.............13.............14......
  56. ,"gear" ,"triangle-right","ruby" ,"info" ,"device-camera"
  57. //15..........16.............17.............18.............19......
  58. ,"pencil" ,"terminal" ,"book","device-camera-video","stop"
  59. ]
  60. var extList={
  61. md:0,
  62. js:1,jsm:1,
  63. json:2,xml:2,xul:2,rdf:2,yml:2,
  64. css:3,scss:3,less:3,
  65. png:4,bmp:4,gif:4,cur:4,ico:4,svg:4,
  66. htm:5,html:5,php:5,
  67. bin:6,exe:6,dll:6,
  68. zip:7,rar:7,arj:7,gem:7,tgz:7,
  69. pdf:8,
  70. wav:9,mp3:9,ogg:9,mp4:9,aac:9,
  71. cfg:10,ini:10,
  72. c:11,cpp:11,cc:11,h:11,hpp:11,asm:11,m:11,
  73. rb:12,py:12,
  74. EmptyExt:13,
  75. jpg:14,jpeg:14,
  76. pl:15,java:15,jar:15,cs:15,
  77. sh:16,mak:16,cmd:16,bat:16,
  78. doc:17,rtf:17,djvu:17,
  79. avi:18,mkv:18,mpg:18,mpeg:18,vob:18,m2v:18,
  80. gitignore:19
  81. }
  82.  
  83. /*
  84. https://github.com/github/octicons
  85. */
  86. var svgList={
  87. octoface: '<svg class="octicon octicon-octoface"><path d="M14.7 4.34c0.13-0.32 0.55-1.59-0.13-3.31 0 0-1.05-0.33-3.44 1.3C10.13 2.05 9.06 2.01 8 2.01c-1.06 0-2.13 0.04-3.13 0.32C2.48 0.69 1.43 1.03 1.43 1.03 0.75 2.75 1.17 4.02 1.3 4.34 0.49 5.21 0 6.33 0 7.69 0 12.84 3.33 14 7.98 14 12.63 14 16 12.84 16 7.69 16 6.33 15.51 5.21 14.7 4.34zM8 13.02c-3.3 0-5.98-0.15-5.98-3.35 0-0.76 0.38-1.48 1.02-2.07 1.07-0.98 2.9-0.46 4.96-0.46 2.07 0 3.88-0.52 4.96 0.46 0.65 0.59 1.02 1.3 1.02 2.07C13.98 12.86 11.3 13.02 8 13.02zM5.49 8.01c-0.66 0-1.2 0.8-1.2 1.78s0.54 1.79 1.2 1.79c0.66 0 1.2-0.8 1.2-1.79S6.15 8.01 5.49 8.01zM10.51 8.01C9.85 8.01 9.31 8.8 9.31 9.79s0.54 1.79 1.2 1.79 1.2-0.8 1.2-1.79C11.71 8.8 11.18 8.01 10.51 8.01z" /></svg>',
  88. zap:'<svg class="octicon octicon-zip"><path d="M10 7H6L9 0 0 9h4L1 16 10 7z" /></svg>',
  89. 'list-unordered':'<svg class="octicon octicon-list-unordered"><path d="M2 13c0 0.59 0 1-0.59 1H0.59c-0.59 0-0.59-0.41-0.59-1s0-1 0.59-1h0.81c0.59 0 0.59 0.41 0.59 1z m2.59-9h6.81c0.59 0 0.59-0.41 0.59-1s0-1-0.59-1H4.59c-0.59 0-0.59 0.41-0.59 1s0 1 0.59 1zM1.41 7H0.59c-0.59 0-0.59 0.41-0.59 1s0 1 0.59 1h0.81c0.59 0 0.59-0.41 0.59-1s0-1-0.59-1z m0-5H0.59c-0.59 0-0.59 0.41-0.59 1s0 1 0.59 1h0.81c0.59 0 0.59-0.41 0.59-1s0-1-0.59-1z m10 5H4.59c-0.59 0-0.59 0.41-0.59 1s0 1 0.59 1h6.81c0.59 0 0.59-0.41 0.59-1s0-1-0.59-1z m0 5H4.59c-0.59 0-0.59 0.41-0.59 1s0 1 0.59 1h6.81c0.59 0 0.59-0.41 0.59-1s0-1-0.59-1z" /></svg>',
  90. paintcan:'<svg class="octicon octicon-paintcan"><path d="M6 0C2.69 0 0 2.69 0 6v1c0 0.55 0.45 1 1 1v5c0 1.1 2.24 2 5 2s5-0.9 5-2V8c0.55 0 1-0.45 1-1v-1C12 2.69 9.31 0 6 0zM9 10v0.5c0 0.28-0.22 0.5-0.5 0.5s-0.5-0.22-0.5-0.5v-0.5c0-0.28-0.22-0.5-0.5-0.5s-0.5 0.22-0.5 0.5v2.5c0 0.28-0.22 0.5-0.5 0.5s-0.5-0.22-0.5-0.5V10.5c0-0.28-0.22-0.5-0.5-0.5s-0.5 0.22-0.5 0.5v0.5c0 0.55-0.45 1-1 1s-1-0.45-1-1v-1c-0.55 0-1-0.45-1-1V7.2C2.91 7.69 4.36 8 6 8s3.09-0.31 4-0.8V9C10 9.55 9.55 10 9 10zM6 7c-1.68 0-3.12-0.41-3.71-1 0.59-0.59 2.03-1 3.71-1s3.12 0.41 3.71 1C9.12 6.59 7.68 7 6 7zM6 4c-2.76 0-5 0.89-5 2 0 0 0 0 0 0C1 3.24 3.24 1 6 1c2.76 0 5 2.24 5 5C11 4.9 8.76 4 6 4z"/></svg>',
  91. eye:'<svg class="octicon octicon-zip"><path d="M8.06 2C3 2 0 8 0 8s3 6 8.06 6c4.94 0 7.94-6 7.94-6S13 2 8.06 2z m-0.06 10c-2.2 0-4-1.78-4-4 0-2.2 1.8-4 4-4 2.22 0 4 1.8 4 4 0 2.22-1.78 4-4 4z m2-4c0 1.11-0.89 2-2 2s-2-0.89-2-2 0.89-2 2-2 2 0.89 2 2z" /></svg>',
  92. globe:'<svg class="octicon octicon-globe"><path d="M7 1C3.14 1 0 4.14 0 8s3.14 7 7 7c0.48 0 0.94-0.05 1.38-0.14-0.17-0.08-0.2-0.73-0.02-1.09 0.19-0.41 0.81-1.45 0.2-1.8s-0.44-0.5-0.81-0.91-0.22-0.47-0.25-0.58c-0.08-0.34 0.36-0.89 0.39-0.94 0.02-0.06 0.02-0.27 0-0.33 0-0.08-0.27-0.22-0.34-0.23-0.06 0-0.11 0.11-0.2 0.13s-0.5-0.25-0.59-0.33-0.14-0.23-0.27-0.34c-0.13-0.13-0.14-0.03-0.33-0.11s-0.8-0.31-1.28-0.48c-0.48-0.19-0.52-0.47-0.52-0.66-0.02-0.2-0.3-0.47-0.42-0.67-0.14-0.2-0.16-0.47-0.2-0.41s0.25 0.78 0.2 0.81c-0.05 0.02-0.16-0.2-0.3-0.38-0.14-0.19 0.14-0.09-0.3-0.95s0.14-1.3 0.17-1.75 0.38 0.17 0.19-0.13 0-0.89-0.14-1.11c-0.13-0.22-0.88 0.25-0.88 0.25 0.02-0.22 0.69-0.58 1.16-0.92s0.78-0.06 1.16 0.05c0.39 0.13 0.41 0.09 0.28-0.05-0.13-0.13 0.06-0.17 0.36-0.13 0.28 0.05 0.38 0.41 0.83 0.36 0.47-0.03 0.05 0.09 0.11 0.22s-0.06 0.11-0.38 0.3c-0.3 0.2 0.02 0.22 0.55 0.61s0.38-0.25 0.31-0.55 0.39-0.06 0.39-0.06c0.33 0.22 0.27 0.02 0.5 0.08s0.91 0.64 0.91 0.64c-0.83 0.44-0.31 0.48-0.17 0.59s-0.28 0.3-0.28 0.3c-0.17-0.17-0.19 0.02-0.3 0.08s-0.02 0.22-0.02 0.22c-0.56 0.09-0.44 0.69-0.42 0.83 0 0.14-0.38 0.36-0.47 0.58-0.09 0.2 0.25 0.64 0.06 0.66-0.19 0.03-0.34-0.66-1.31-0.41-0.3 0.08-0.94 0.41-0.59 1.08 0.36 0.69 0.92-0.19 1.11-0.09s-0.06 0.53-0.02 0.55 0.53 0.02 0.56 0.61 0.77 0.53 0.92 0.55c0.17 0 0.7-0.44 0.77-0.45 0.06-0.03 0.38-0.28 1.03 0.09 0.66 0.36 0.98 0.31 1.2 0.47s0.08 0.47 0.28 0.58 1.06-0.03 1.28 0.31-0.88 2.09-1.22 2.28-0.48 0.64-0.84 0.92-0.81 0.64-1.27 0.91c-0.41 0.23-0.47 0.66-0.66 0.8 3.14-0.7 5.48-3.5 5.48-6.84 0-3.86-3.14-7-7-7z m1.64 6.56c-0.09 0.03-0.28 0.22-0.78-0.08-0.48-0.3-0.81-0.23-0.86-0.28 0 0-0.05-0.11 0.17-0.14 0.44-0.05 0.98 0.41 1.11 0.41s0.19-0.13 0.41-0.05 0.05 0.13-0.05 0.14zM6.34 1.7c-0.05-0.03 0.03-0.08 0.09-0.14 0.03-0.03 0.02-0.11 0.05-0.14 0.11-0.11 0.61-0.25 0.52 0.03-0.11 0.27-0.58 0.3-0.66 0.25z m1.23 0.89c-0.19-0.02-0.58-0.05-0.52-0.14 0.3-0.28-0.09-0.38-0.34-0.38-0.25-0.02-0.34-0.16-0.22-0.19s0.61 0.02 0.7 0.08c0.08 0.06 0.52 0.25 0.55 0.38 0.02 0.13 0 0.25-0.17 0.25z m1.47-0.05c-0.14 0.09-0.83-0.41-0.95-0.52-0.56-0.48-0.89-0.31-1-0.41s-0.08-0.19 0.11-0.34 0.69 0.06 1 0.09c0.3 0.03 0.66 0.27 0.66 0.55 0.02 0.25 0.33 0.5 0.19 0.63z"/></svg>',
  93. 'file-binary':'<svg class="octicon octicon-file-binary"><path d="M4 12h1v1H2v-1h1V10h-1v-1h2v3z m8-7.5v9.5c0 0.55-0.45 1-1 1H1c-0.55 0-1-0.45-1-1V2c0-0.55 0.45-1 1-1h7.5l3.5 3.5z m-1 0.5L8 2H1v12h10V5z m-3-1H6v1h1v2h-1v1h3v-1h-1V4z m-6 0h3v4H2V4z m1 3h1V5h-1v2z m3 2h3v4H6V9z m1 3h1V10h-1v2z"/></svg>',
  94. 'file-zip':'<svg class="octicon octicon-file-zip"><path d="M8.5 1H1C0.45 1 0 1.45 0 2v12c0 0.55 0.45 1 1 1h10c0.55 0 1-0.45 1-1V4.5L8.5 1z m2.5 13H1V2h3v1h1v-1h3l3 3v9zM5 4v-1h1v1h-1z m-1 0h1v1h-1v-1z m1 2v-1h1v1h-1z m-1 0h1v1h-1v-1z m1 2v-1h1v1h-1z m-1 1.28c-0.59 0.34-1 0.98-1 1.72v1h4v-1c0-1.11-0.89-2-2-2v-1h-1v1.28z m2 0.72v1H4v-1h2z" /></svg>',
  95. 'file-pdf':'<svg class="octicon octicon-file-pdf"><path d="M8.5 1H1C0.45 1 0 1.45 0 2v12c0 0.55 0.45 1 1 1h10c0.55 0 1-0.45 1-1V4.5L8.5 1zM1 2h4c-0.11 0.03-0.2 0.09-0.31 0.2-0.09 0.09-0.17 0.25-0.23 0.47-0.11 0.39-0.14 0.89-0.09 1.47s0.17 1.17 0.34 1.8c-0.23 0.73-0.61 1.61-1.11 2.66s-0.8 1.66-0.91 1.84c-0.14 0.05-0.36 0.14-0.69 0.3-0.33 0.14-0.66 0.36-1 0.64V2z m4.42 4.8c0.45 1.13 0.84 1.83 1.17 2.09s0.64 0.45 0.94 0.53c-0.64 0.09-1.23 0.2-1.81 0.33-0.56 0.13-1.17 0.33-1.81 0.59 0.02-0.02 0.22-0.44 0.61-1.25s0.7-1.58 0.91-2.3z m5.58 7.2H1.5c-0.06 0-0.13-0.02-0.17-0.03 0.2-0.06 0.45-0.2 0.73-0.44 0.45-0.38 1.05-1.16 1.78-2.38 0.31-0.13 0.58-0.23 0.81-0.31l0.42-0.14c0.45-0.13 0.94-0.23 1.44-0.33 0.5-0.08 1-0.16 1.48-0.2 0.45 0.22 0.91 0.39 1.39 0.53 0.48 0.13 0.91 0.2 1.23 0.23 0.14 0 0.27-0.02 0.38-0.03v3.09z m0-4.86c-0.19-0.11-0.41-0.2-0.64-0.28-0.23-0.06-0.48-0.09-0.75-0.11-0.39 0-0.8 0.03-1.23 0.08-0.23-0.06-0.56-0.28-0.98-0.64s-0.86-1.14-1.31-2.33c0.13-0.83 0.19-1.48 0.2-1.97s0.02-0.73 0-0.75c0.05-0.41-0.03-0.7-0.2-0.88s-0.38-0.27-0.61-0.27h2.53l3 3v4.14z" /></svg>',
  96. megaphone:'<svg class="octicon octicon-megaphone"><path d="M10 1c-0.17 0-0.36 0.05-0.52 0.14-1.44 0.88-4.98 3.44-6.48 3.86-1.38 0-3 0.67-3 2.5s1.63 2.5 3 2.5c0.3 0.08 0.64 0.23 1 0.41v4.59h2V11.55c1.34 0.86 2.69 1.83 3.48 2.31 0.16 0.09 0.34 0.14 0.52 0.14 0.52 0 1-0.42 1-1V2c0-0.58-0.48-1-1-1z m0 12c-0.38-0.23-0.89-0.58-1.5-1-0.16-0.11-0.33-0.22-0.5-0.34V3.31c0.16-0.11 0.31-0.2 0.47-0.31 0.61-0.41 1.16-0.77 1.53-1v11z m2-6h4v1H12v-1z m0 2l4 2v1L12 10v-1z m4-6v1L12 6v-1l4-2z" /></svg>',
  97. gear:'<svg class="octicon octicon-gear"><path d="M6.999 5.469C5.602 5.469 4.469 6.602 4.469 8c0 1.396 1.133 2.532 2.53 2.532 1.397 0 2.522-1.136 2.522-2.532C9.521 6.602 8.396 5.469 6.999 5.469zM12.072 9.454l-0.456 1.099 0.813 1.598 0.107 0.211-1.128 1.128L9.559 12.615l-1.099 0.451L7.902 14.773l-0.071 0.227H6.237L5.547 13.073l-1.099-0.453-1.6 0.812-0.211 0.105-1.127-1.127 0.873-1.852-0.453-1.098L0.226 8.904 0 8.831V7.238L1.928 6.547l0.453-1.097-0.811-1.601-0.107-0.21 1.126-1.126 1.853 0.873 1.097-0.454 0.557-1.706L6.168 1h1.594l0.69 1.929 1.096 0.454L11.148 2.571l0.213-0.107 1.127 1.126-0.873 1.85L12.066 6.539l1.709 0.557L14 7.168v1.593L12.072 9.454z" /></svg>',
  98. 'triangle-right':'<svg class="octicon octicon-triangle-right"><path d="M0 14l6-6L0 2v12z" /></svg>',
  99. ruby:'<svg class="octicon octicon-ruby"><path d="M13 6L8 11V4h3l2 2z m3 0L8 14 0 6l4-4h8l4 4zM8 12.5l6.5-6.5-3-3H4.5L1.5 6l6.5 6.5z"/></svg>',
  100. info:'<svg class="octicon octicon-info"><path d="M6.3 5.69c-0.19-0.19-0.28-0.42-0.28-0.7s0.09-0.52 0.28-0.7 0.42-0.28 0.7-0.28 0.52 0.09 0.7 0.28 0.28 0.42 0.28 0.7-0.09 0.52-0.28 0.7-0.42 0.3-0.7 0.3-0.52-0.11-0.7-0.3z m1.7 2.3c-0.02-0.25-0.11-0.48-0.31-0.69-0.2-0.19-0.42-0.3-0.69-0.31h-1c-0.27 0.02-0.48 0.13-0.69 0.31-0.2 0.2-0.3 0.44-0.31 0.69h1v3c0.02 0.27 0.11 0.5 0.31 0.69 0.2 0.2 0.42 0.31 0.69 0.31h1c0.27 0 0.48-0.11 0.69-0.31 0.2-0.19 0.3-0.42 0.31-0.69h-1V7.98z m-1-5.69C3.86 2.3 1.3 4.84 1.3 7.98s2.56 5.7 5.7 5.7 5.7-2.55 5.7-5.7-2.56-5.69-5.7-5.69m0-1.31c3.86 0 7 3.14 7 7S10.86 14.98 7 14.98 0 11.86 0 7.98 3.14 0.98 7 0.98z"/></svg>',
  101. 'device-camera':'<svg class="octicon octicon-device-camera"><path d="M15 3H7c0-0.55-0.45-1-1-1H2c-0.55 0-1 0.45-1 1-0.55 0-1 0.45-1 1v9c0 0.55 0.45 1 1 1h14c0.55 0 1-0.45 1-1V4c0-0.55-0.45-1-1-1zM6 5H2v-1h4v1z m4.5 7c-1.94 0-3.5-1.56-3.5-3.5s1.56-3.5 3.5-3.5 3.5 1.56 3.5 3.5-1.56 3.5-3.5 3.5z m2.5-3.5c0 1.38-1.13 2.5-2.5 2.5s-2.5-1.13-2.5-2.5 1.13-2.5 2.5-2.5 2.5 1.13 2.5 2.5z"/></svg>',
  102. pencil:'<svg class="octicon octicon-pencil"><path d="M0 12v3h3l8-8-3-3L0 12z m3 2H1V12h1v1h1v1z m10.3-9.3l-1.3 1.3-3-3 1.3-1.3c0.39-0.39 1.02-0.39 1.41 0l1.59 1.59c0.39 0.39 0.39 1.02 0 1.41z"/></svg>',
  103. terminal:'<svg class="octicon octicon-terminal"><path d="M7 10h4v1H7v-1z m-3 1l3-3-3-3-0.75 0.75 2.25 2.25-2.25 2.25 0.75 0.75z m10-8v10c0 0.55-0.45 1-1 1H1c-0.55 0-1-0.45-1-1V3c0-0.55 0.45-1 1-1h12c0.55 0 1 0.45 1 1z m-1 0H1v10h12V3z"/></svg>',
  104. book:'<svg class="octicon octicon-book"><path d="M2 5h4v1H2v-1z m0 3h4v-1H2v1z m0 2h4v-1H2v1z m11-5H9v1h4v-1z m0 2H9v1h4v-1z m0 2H9v1h4v-1z m2-6v9c0 0.55-0.45 1-1 1H8.5l-1 1-1-1H1c-0.55 0-1-0.45-1-1V3c0-0.55 0.45-1 1-1h5.5l1 1 1-1h5.5c0.55 0 1 0.45 1 1z m-8 0.5l-0.5-0.5H1v9h6V3.5z m7-0.5H8.5l-0.5 0.5v8.5h6V3z"/></svg>',
  105. 'device-camera-video':'<svg class="octicon octicon-device-camera-video"><path d="M15.2 3.09L10 6.72V4c0-0.55-0.45-1-1-1H1c-0.55 0-1 0.45-1 1v9c0 0.55 0.45 1 1 1h8c0.55 0 1-0.45 1-1V10.28l5.2 3.63c0.33 0.23 0.8 0 0.8-0.41V3.5c0-0.41-0.47-0.64-0.8-0.41z"/></svg>',
  106. stop:'<svg class="octicon octicon-stop"><path d="M10 1H4L0 5v6l4 4h6l4-4V5L10 1z m3 9.5L9.5 14H4.5L1 10.5V5.5l3.5-3.5h5l3.5 3.5v5zM6 4h2v5H6V4z m0 6h2v2H6V10z"/></svg>'
  107. }
  108. var svgUsed={};
  109.  
  110. function stickStyle(css){
  111. var s=document.createElement("style"); s.type="text/css";
  112. s.appendChild(document.createTextNode(css));
  113. return (document.head||document.documentElement).appendChild(s);
  114. }
  115. function insBefore(n,e){
  116. return e.parentNode.insertBefore(n,e);
  117. }
  118. function insAfter(n,e){
  119. if(e.nextElementSibling)
  120. return e.parentNode.insertBefore(n,e.nextElementSibling);
  121. return e.parentNode.appendChild(n);
  122. }
  123. function outerNode(target, node) {
  124. if (target.nodeName==node) return target;
  125. if (target.parentNode)
  126. while (target = target.parentNode) try{
  127. if (target.nodeName==node)
  128. return target;
  129. }catch(e){};
  130. return null;
  131. }
  132. function savePrefs(){
  133. if(locStor) locStor.setItem('GHSFL',JSON.stringify(prefs));
  134. }
  135.  
  136. function css(){
  137. stickStyle('\
  138. .fsort-butt,\n\
  139. .tables.file td.content, .tables.file td.message, .tables.file td.age\n\
  140. {position: relative; }\n\
  141. \n\
  142. .fsort-butt:before{\n\
  143. position: absolute; display: inline-block;\n\
  144. cursor: pointer;\n\
  145. text-align:center; vertical-align: top;\n\
  146. width: 18px; height: 14px;\n\
  147. line-height: 14px;\n\
  148. padding:0; margin:0;\n\
  149. border-color: transparent;\n\
  150. border-width: 0;\n\
  151. content: "";\n\
  152. opacity: .2;\n\
  153. z-index: 99;\
  154. }\n\
  155. .fsort-butt.fsort-asc:before,.fsort-butt.fsort-desc:before{\n\
  156. left:1.5em; top: -1em;\n\
  157. }\n\
  158. td.age .fsort-butt.fsort-asc:before, td.age .fsort-butt.fsort-desc:before{\n\
  159. left: 4.5em; \n\
  160. }\n\
  161. .fsort-asc:before,.fsort-desc:before{\n\
  162. background-color: #48C;\n\
  163. }\n\
  164. .fsort-asc:before{\n\
  165. border-radius: 24px 24px 8px 8px;\n\
  166. }\n\
  167. .fsort-desc:before{\n\
  168. border-radius: 8px 8px 24px 24px;\n\
  169. }\n\
  170. .fsort-asc:before,\n\
  171. .fsort-desc.fsort-sel:hover:before\n\
  172. {\n\
  173. content: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAMCAYAAABbayygAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAqklEQVR42mNgQAIfPnzg//fv3z4g3vjs2TNOBmzg27dv0kAFl/5DAZB95OPHj4Ioin79+qUFlHj0Hw0Axa5+//5dFqzo58+fGkCB9/9xAKDcw69fv0ow/P37twAqAAJLkRQsgLGBapIZQO4ACk798+eP9+/fv21gkkArZYAKYoFy09++fcuL4lZ0hQy4wMAqtIQpBEaAFE6FL1684AL6chcQb1m1ahUTshwAw2kAJAeNI30AAAAASUVORK5CYII=);\n\
  174. }\n\
  175. .fsort-desc:before,\n\
  176. .fsort-asc.fsort-sel:hover:before{content: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAMCAYAAABbayygAAAACXBIWXMAAAsTAAALEwEAmpwYAAAApUlEQVR42mNgQAKrVq1i+vfv3xYg3vXixQsuBlzg27dvUv+h4Pfv35Y4FX7//l0GSaHNYFH49u1bXqAvp//9+zcWXeGfP3+8gXJTP378KMgAVJAMkwQKLkBiLwXifyA2UE0Bw9evXyWA/If/cQCg3PufP39qwNwmCxS4ikXRo1+/fmmhuBXkDqDEESRFl4ARII3V18+ePeMEKtgIxPs+fPjAjywHANCcACRZ1c8XAAAAAElFTkSuQmCC);\n\
  177. }\n\
  178. \n\
  179. .fsort-butt.fsort-sel:before\n\
  180. {\n\
  181. background-color: #4183C4 !important;\n\
  182. opacity:.6 !important;\n\
  183. }\n\
  184. \n\
  185. span.fsort-butt:hover:before\n\
  186. ,span.fsort-butt:hover span:before\n\
  187. { opacity: 1 !important;}\n\
  188. \n\
  189. #fsort-clock:before{\n\
  190. left:6.5em; top: -15px; \n\
  191. text-align:center; vertical-align: top; top:-15px;\n\
  192. width: 16px; height: 16px;\
  193. border-radius: 16px;\n\
  194. content: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAlZJREFUeNqkU0tLG1EUvjORFJPMw6mhTUgxy75EUxiJj6CGLKQV0o2IQd3pxp2bbPs/3MVCIHSRgC3uXBhCSErjtLRkK7TcNCYhk4eGPHvO6AwjXXrgu/fOOff77plzz2VGoxF5iI3hEA6HCcuyxGKxEIZhOMBLcHsAwt0+FfAbDvsFaA4GAzIcDkkqlboVMNlzB8+vzgUCq3N+v+xyOl3opFdXNJfN5nPn52dNVT0DV/FeBjpZcjrfR/b3Dzwul0e02ciPiwsyPTtLptxur7C25n0xMzMfPzoSypQmdREWB0iLt3NcKLK3dzAhSR5+fFxT/JbPG+row9g2HABZhpBjCMA/vZYDgRVOFD02q5WwDKOROp2OIYA+jDlgz8Ly8gpyDIF+v++d9vlkXDdubshlpaKhWCwaawTGsHg+WZaRY9QAPiYEUXyinzY1OanNzWbTWGv7gPynViO4FzlmARavcWgivw2FSDAYJDubm4TjOA0Oh4O8WVwk80tLGscsoLZUtWwThGf6afFEgmxvbZGP8biRAbac2u2S60ajjByjBr1e7/JrJqOMQSNhmmiCJGlknHVAAckjuI1cOq0gx3wLyudkMt1ttejgTkAXMRsWkO106KdEIo0cQwAC9b+l0umHaPRYrVaphWX/63n0XasqjR4eHlNKT5FzrxPBoXxXFEtkY6Ozs7u78G59/dVTt/sxdkSJ0uqXk5OfsVgsU6lUUjzPKzqPwdfo8/lIF4pTr9dJu92WID0/tjZAv8MKti48tqzdbq+JUAsrNFWhULgVeIj9E2AAamUckFr2UCoAAAAASUVORK5CYII=\n\
  195. );}\n\
  196. .fsort-on:before{ background-color: #4183C4 !important; } \n\
  197. #fsort-ext:before{\n\
  198. left:4em; top:-14px;\n\
  199. width:28px; height: 14px;\n\
  200. border-radius: 6px;\n\
  201. content:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAANCAYAAAC3mX7tAAAABmJLR0QAAAAAAAD5Q7t/AAAACXBIWXMAAAsTAAALEwEAmpwYAAABWUlEQVQ4y+2SP0sDQRDFT7BQTGtnITYSK8Emha1NCrXwC4gWYiUKiiB4jYKdWAmC4AewtxEExSqVjZ1/OEgwrEQwkLvbmd/aTCBI0IBYCD7YYmaYfW/mTRT9VWRZNq6qm79OBBwBrueGPM8ngWvgHbgXkQX7aC+EEFR1x+IDi7dUdQOQYACuviSp1+tDQA2oquoycAlInucT1Wp1EHgA3r3300AG3FUqlX4RKQOvQFNVV0Rk9ksiEZkzRbtJkgx476faqq1etnoK4L0vdazuqefVqepq6ALgKIqiKI7jPuDRcpVPHn1P5JwrxHHc1zHRofe+1H5pmo6akCWrv4QQgojMdxA9AI3vzPfAsXOuACRAXVW3VXUNOM2yrNhsNofNh1qapmPAG5A45wpGdGMiToD9bvdftKZ9I54ALoCGXd5tq9UaAc7Mr0Wbbr09vfk3Azybf+fRP36KDxJ2sN2uMATcAAAAAElFTkSuQmCC);\n\
  202. }\n\
  203. #fsort-ext:before{ background-color: #BBB}\n\
  204. /* 150806 uppercase */\n\
  205. #fsort-upc:before{\n\
  206. left:7em; top:-14px;\n\
  207. width:16px; height: 16px;\n\
  208. border-radius: 0 4px 0 4px;\n\
  209. content:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QAAAAAAAD5Q7t/AAAACXBIWXMAAAsTAAALEwEAmpwYAAABcElEQVQ4y5WSsWoVQRSG/7kbyL1VCosgeQBBbFIYtBCsLYOx1QewiZgqr5HOF5ALRlALbcUigsK1TOUWooUaEbOL2d3z/TaTsOBduPeHYQ4zZ77555yRJEXEDnAE/AZ+As/qur6sBbSS50uS1iQ9lbSZUtoej8eWdHcRiKbT6eg8bprmqm0D37Souq7bBt4BP4AuA04XOtw0zTUggLOIeBgR95YBjIqi2EwpjSTNiqI4sP1dy6ht21v5xjPgCfAZaPoOImLfWRGx/x8EOAD+AF8j4gFw2AcAx8DfPI6XdXgzO3wNvLHttm1vXNRAkmzfGQIURXE/57ywfdhfu5Dt57av59i2b0tSWZarwC+Auq43qqpazx07KctytQ+4Yvuj7c52advnXzzbP+rV420u5s5cy30HwCsPCHgpSWno7VVVrU8mky8ppRXb73tbKaW0Zbur63pjsPoR8Sjf9GFO22f5GbuDAOBTTno8B76X4bN/RgN/lIzFNCAAAAAASUVORK5CYII=);\n\
  210. }\n\
  211. #fsort-upc:before{ background-color: #BBB}\n\
  212. \n\
  213. table.files td.age .css-truncate.css-truncate-target{\n\
  214. width: 99% !important; \n\
  215. max-width: none !important;\n\
  216. }\n\
  217. /*table.files td.age span.css-truncate time{\n\
  218. position: relative !important;\n\
  219. }*/\n\
  220. .fsort-time {\n\
  221. visibility: hidden;\n\
  222. display: none;\n\
  223. padding-right: 0px;\n\
  224. }\n\
  225. .fsort-time i {\n\
  226. display:inline-block;\
  227. color: #BBB;\
  228. font-style: normal !important;\n\
  229. transform: scale(0.9);\n\
  230. margin-left: 0px;\n\
  231. /* font-size: 12px;*/\n\
  232. }\n\
  233. \n\
  234. /* patches (--min-width:12em!important;) */\n\
  235. table.files td.age {text-align: right !important; padding-right: 4px !important;\n\
  236. width:12em!important;\n\
  237. \n\
  238. max-width:none!important;\n\
  239. overflow:visible!important;\n\
  240. }\n\
  241. table.files td.message {overflow: visible !important;}\n\
  242. /*.file-wrap .include-fragment-error { display: table-row !important;}*/\n\
  243. /* 150315 wide filelist *150426 better not touch this* /\n\
  244. div.wrapper div.container{\n\
  245. min-width: 980px!important;\n\
  246. width:90%!important;}\n\
  247. div.wrapper div#js-repo-pjax-container{\n\
  248. min-width: 790px!important;\n\
  249. width: calc(100% - 200px)!important;\n\
  250. }/* */\n\
  251. td.icon .octicon {height: 16px; width: 16px;}\
  252. \
  253. ');
  254.  
  255. dtStyle=stickStyle('\
  256. td.age span.css-truncate time-ago{\
  257. visibility: hidden !important;\
  258. display: none !important;\
  259. }\
  260. td.age span.css-truncate .fsort-time {\
  261. visibility: visible !important;\
  262. display: inline !important;\
  263. }\
  264. ')
  265. }
  266.  
  267. function setC(n){
  268. for(var i=0,il=C.length; i<il; i++ ){
  269. if(i!=n) C[i].s= 0, C[i].d=d0[i];
  270. else C[i].s=1;
  271. oa[i].className='fsort-butt fsort-'+(C[i].d?'desc':'asc')+(C[i].s?' fsort-sel':'') ;
  272. //oa[i].title=C[i].d? '\u21ca' : '\u21c8';
  273. }
  274. }
  275.  
  276. function dd(s)
  277. { s=s.toString(); if(s.length<2)return'0'+s; return s}
  278. function d2s(n){
  279. var hs=dd(n.getHours())+':'+dd(n.getMinutes());
  280. return {
  281. d: n.getFullYear()+'-'+dd(n.getMonth()+1)+'-'+dd(n.getDate())+'<i>'+ hs+'</i>',
  282. t: hs+':'+dd(n.getSeconds())
  283. }
  284. }
  285.  
  286. var xmatch=/(.*)\.(.*)$/;
  287. function filext(x){
  288. var m= x.match(xmatch);
  289. if(!m || !m[2]) return "EmptyExt";
  290. return m[2].toLowerCase();
  291. }
  292. function setIcon(tr){
  293. var xt,xs,xn,xi,tc,tn,ti;
  294. //ti=tr.querySelector('td.icon > .octicon-file-text');
  295. ti=tr.querySelector('td.icon > .octicon-file');
  296. if(!ti) return;
  297. tc=tr.querySelector('td.content > span.css-truncate');
  298. if(!tc) return;
  299. tc=tc.textContent;
  300. if(!tc) return;
  301. xt=filext(tc);
  302. if(!xt) return;
  303. xn=extList[xt];
  304. if(typeof xn === "undefined") return;
  305. xi=extIcon[xn];
  306. if(!svgList[xi]) return;
  307. tn=svgUsed[xn];
  308. if(!tn){
  309. tn=document.createElement('span');
  310. tn.innerHTML=svgList[xi];
  311. tn=tn.childNodes[0];
  312. // tn.className='octicon octicon-'+xi;
  313. // console.log('XI:',xi,svgList[xi]);
  314. svgUsed[xn]=tn;
  315. }else{
  316. tn=tn.cloneNode(true);
  317. }
  318. ti.parentNode.replaceChild(tn, ti);
  319. //_l('setIcon '+xt);
  320. }
  321.  
  322. function setDateTime(x){
  323. var dt,dtm,dta,dtd,tc,m,now,t;
  324. var DT=D.querySelectorAll('td.age span.css-truncate time-ago');
  325. _l('sDT',(x?'refresh':'create')+' # '+DT.length);
  326. try{
  327. now = new Date();
  328. for(var dl=DT.length, i=0; i<dl; i++){
  329. dta=DT[i].getAttribute('datetime');
  330. dtd=new Date(dta);
  331. dt= d2s(dtd); // 2014-07-24T17:06:11Z
  332. dtm=null;
  333. if(x){
  334. dtm=DT[i].parentNode.querySelector('.fsort-time');
  335. }
  336. if(!dtm){
  337. dtm=D.createElement('span');
  338. dtm.className='fsort-time';
  339. x=0;
  340. }
  341. if(!x || !dtm.title || dtm.title != DT[i].title)
  342. { dtm.title= DT[i].title;
  343. t= dt.d;
  344. if( (now.getTime() - dtd.getTime() < 12*3600*1000) ||
  345. ((now.getTime() - dtd.getTime() < 24*3600*1000) &&
  346. (now.getDate() == dtd.getDate()) )
  347. ) t=dt.t;
  348. dtm.innerHTML=t;
  349. }
  350. if(!x) insAfter(dtm,DT[i]);
  351. if(!x)
  352. setIcon(outerNode(DT[i],'TR'));
  353. }
  354. }catch(e){(console.log(e+'\n*GHSFL* wrong datetime'+x))}
  355. }
  356.  
  357. function isDir(x){
  358. var c= TB.rows[x].cells[0].querySelector(".octicon"); //<svg> now!!!11
  359. try{
  360. c=c.getAttribute('class');
  361. if(c.indexOf("-directory")>0) return 0;
  362. if(c.indexOf("octicon-")>0) return -1;
  363. } catch(e){ console.log(c,'n',e)};
  364. return 1;
  365. }
  366. function getCell(r,c,s,p){
  367. var rc=TB.rows[r].cells[c],q=null;
  368. if(typeof rc == "undefined") {
  369. _l('r:',r,'c:',c,'- ???' );
  370. }else
  371. q=rc.querySelector(s);
  372. if(q) q= p? q.getAttribute(p): q.textContent;
  373. if(q) return q;
  374. return "";
  375. }
  376. var sDir,sCells,sExts;
  377. var fa=[
  378. function(a){
  379. var r=getCell(a,1,'span.css-truncate-target a');
  380. return prefs.upc? r.toUpperCase(): r;
  381. },
  382. function(a){
  383. var r= getCell(a,2,'span.css-truncate');
  384. r=r.replace(/\s+/,' ').replace(/^\s|\s$/,'');
  385. return prefs.upc? r.toUpperCase(): r;
  386. },
  387. function(a){
  388. var c = getCell(a,3,'span.css-truncate>time-ago','datetime');
  389. if(c) return c;
  390. return "2099-12-31T23:59:59Z"
  391. }
  392. ]
  393.  
  394. var b9='\x20\x20\x20'; b9+=b9+b9;
  395. function pad9(s){
  396. if(s.length<9) return (s+b9).substr(0,9);
  397. return s;
  398. }
  399. function sort_p(n){// prepare data for sorting
  400. sDir=[],sCells=[];
  401. for(var tl=TB.rows.length, a=0; a<tl; a++)
  402. sDir.push(isDir(a));
  403. if( n === 0 && prefs.ext ){
  404. for( a=0; a<tl; a++){ // f.x -> x.f
  405. var x=fa[n](a),
  406. m= x.match(/(.*)(\..*)$/);
  407. if(!m || !m[2]) m=['',x,''];
  408. x=pad9(m[2])+' '+m[1];
  409. sCells.push(x);
  410. }
  411. }else{
  412. for( a=0; a<tl; a++) sCells.push(fa[n](a));
  413. }
  414. }
  415.  
  416. function sort_fn(a,b){
  417. var x=sDir[a], y=sDir[b];
  418. if(x!=y) return ((x<y)? 1: -1);
  419. x= sCells[a], y= sCells[b];
  420. return x==y? 0: (((x>y)^ASC)<<1)-1;
  421. }
  422.  
  423. var CNn={content: 0, message: 1, age: 2}
  424.  
  425. function oClr(){
  426. var o= catcher.querySelectorAll('.fsort-butt,.fsort-time')
  427. for(var ol=o.length,i=0;i<ol;i++)
  428. o[i] && o[i].parentNode.removeChild(o[i]);
  429. }
  430. //
  431. function extclassName(){
  432. ext.className='fsort-butt'+ (prefs.ext? ' fsort-on': '' );
  433. }
  434. function clockclassName(){
  435. clock.className='fsort-butt'+ (prefs.dtStyle? '': ' fsort-on');
  436. }
  437. function upcclassName(){
  438. upc.className='fsort-butt'+ (prefs.upc? ' fsort-on': '' );
  439. }
  440. //
  441. function doSort(t){
  442. TB=outerNode(t,'TBODY');
  443. if(!TB){ _l( "*GHSFL* TBODY not found"); return; }
  444. var n = CNn[t.parentNode.className];
  445. if(typeof n=="undefined") n= CNn[t.parentNode.parentNode.className];
  446. if(typeof n=="undefined"){ _l( "*GHSFL* undefined col"); return; }
  447. if(t.id=='fsort-clock'){
  448. dtStyle.disabled = (prefs.dtStyle ^= 1);
  449. savePrefs();
  450. clockclassName();
  451. return;
  452. }
  453. if (t.id=='fsort-ext'){
  454. if(C[n].s) prefs.ext ^= 1;
  455. else prefs.ext= 1;
  456. savePrefs();
  457. extclassName();
  458. C[n].d^=C[n].s; // don't toggle dir on ext.click
  459. }else
  460. if (t.id=='fsort-upc'){
  461. if(C[n].s) prefs.upc ^= 1;
  462. else prefs.upc= 1;
  463. savePrefs();
  464. upcclassName();
  465. C[n].d^=C[n].s; // don't toggle case on upc.click
  466. }
  467. var tb=[],ix=[], i, tl,ti,tx;
  468. _l('n:'+n);
  469. tl=TB.rows.length;
  470. ASC=C[n].d^=C[n].s;
  471. for( i=0; i<tl; i++)
  472. ix.push(i);
  473. oClr();
  474. //var ms=new Date();
  475. sort_p(n);
  476. ix.sort(sort_fn);
  477. for( i=0; i<tl; i++)
  478. tb.push(TB.rows[ix[i]]);
  479. for( i=tl-1; i>=0; i--)
  480. TB.removeChild(TB.rows[i]);
  481. for( i=0; i<tl; i++)
  482. TB.appendChild(tb[i]);
  483. //ms=(new Date())-ms;
  484. //console.info('sorted by '+ms+'ms');
  485. setC(n);
  486. gitDir(0);
  487. }
  488.  
  489. function onClik(e){doSort(e.target)}
  490.  
  491. function gitDir(x){
  492. if(x && document.querySelector('.fsort-butt')) {
  493. _l('gitDir'+x+ '- already'); return;
  494. }
  495. _l('gitDir',x?'create':'refresh')
  496. var c,o;
  497. ca=[];
  498. c= D.querySelector('.file-wrap table.files td.content >span');
  499. if(!c){ _l( '*GHSFL* no content') ; return; }
  500. ca.push(c);
  501. c=D.querySelector('.file-wrap table.files td.message >span');
  502. if(!c){ _l( '*GHSFL* no messages'); return; }
  503. ca.push(c);
  504. c=D.querySelector('.file-wrap table.files td.age >span');
  505. if(!c){_l( '*GHSFL* no ages'); return; }
  506. ca.push(c);
  507. if(x){ oClr(); oa=[];
  508. o=D.createElement('span');
  509. o.textContent='';
  510. oa.push(o);
  511. o=o.cloneNode(true);
  512. oa.push(o);
  513. o=o.cloneNode(true);
  514. oa.push(o);
  515. clock=D.createElement('span');
  516. clock.id='fsort-clock'; clockclassName();
  517. ext=D.createElement('span');
  518. ext.id='fsort-ext'; extclassName();
  519. upc=D.createElement('span');
  520. upc.id='fsort-upc'; upcclassName();
  521. setDateTime();
  522. setC(-1);
  523. }
  524. o=insBefore(oa[0],ca[0]);
  525. o.appendChild(upc);
  526. o.appendChild(ext);
  527. insBefore(oa[1],ca[1]);
  528. o=insBefore(oa[2],ca[2]);
  529. o.appendChild(clock);
  530. }
  531.  
  532.  
  533. catcher= D.querySelector('#js-repo-pjax-container');
  534. if(!catcher){ _l( "*GHSFL* err0r"); return; }
  535.  
  536. catcher.addEventListener('mousedown',function(e){
  537. if(e.target.nodeName && e.target.nodeName=='SPAN' &&
  538. e.target.className.indexOf('fsort-butt')>-1)
  539. { onClik(e); }
  540. }
  541. ,false);
  542.  
  543. _l('startup()');
  544.  
  545. try {
  546. locStor = W.localStorage;
  547. tt=locStor.getItem("GHSFL");
  548. } catch(e){ locStor =null}
  549.  
  550. if(locStor && tt) try{
  551. var pa =JSON.parse(tt);
  552. for (var a in pa) prefs[a]=pa[a];
  553. // _l('prefs:'+JSON.stringify(prefs));
  554. }catch(e){ console.log(e+"\n*GHSFL* bad prefs") }
  555.  
  556. css();
  557. dtStyle.disabled=(prefs.dtStyle===1);
  558.  
  559. gitDir(1);
  560. var target = catcher; //document.body; //D.querSelector('.file-wrap');
  561. var MO = window.MutationObserver;
  562. if(!MO) MO= window.WebKitMutationObserver;
  563. if(!MO) return;
  564. var __started=0;
  565. var mII=0,mI=0;;
  566. var observer = new MO(function(mutations) {
  567. var t=mutations[0].target;
  568. //mI++; _l('mut'+mI+'.'+mutations[0].target.nodeName);
  569. var fc=document.getElementById('fsort-clock')
  570. if(!fc){
  571. gitDir(1);
  572. __started=1;
  573. return; }
  574. if(!fc.parentNode.parentNode.querySelector('.fsort-time')){
  575. setDateTime(1);
  576. return;}
  577. });
  578. // D.body
  579. observer.observe(catcher, { attributes: true, childList: true, subtree: true } );
  580. /* attributes: true , childList: true, subtree: true,
  581. characterData: true, attributeOldValue:true, characterDataOldValue:true
  582. */
  583.  
  584. })()};