GitHub Sortable Filelist

appends sorting function to github directories

Verzia zo dňa 08.08.2015. Pozri najnovšiu verziu.

Na nainštalovanie skriptu si budete musieť nainštalovať rozšírenie, ako napríklad Tampermonkey, Greasemonkey alebo Violentmonkey.

Na nainštalovanie skriptu si budete musieť nainštalovať rozšírenie, ako napríklad Tampermonkey, % alebo Violentmonkey.

Na nainštalovanie skriptu si budete musieť nainštalovať rozšírenie, ako napríklad Tampermonkey, % alebo Violentmonkey.

Na nainštalovanie skriptu si budete musieť nainštalovať rozšírenie, ako napríklad Tampermonkey alebo Userscripts.

Na inštaláciu tohto skriptu je potrebné nainštalovať rozšírenie, ako napríklad Tampermonkey.

Na inštaláciu tohto skriptu je potrebné nainštalovať rozšírenie správcu používateľských skriptov.

(Už mám správcu používateľských skriptov, nechajte ma ho nainštalovať!)

Na inštaláciu tohto štýlu je potrebné nainštalovať rozšírenie, ako napríklad Stylus.

Na inštaláciu tohto štýlu je potrebné nainštalovať rozšírenie, ako napríklad Stylus.

Na inštaláciu tohto štýlu je potrebné nainštalovať rozšírenie, ako napríklad Stylus.

Na inštaláciu tohto štýlu je potrebné nainštalovať rozšírenie správcu používateľských štýlov.

Na inštaláciu tohto štýlu je potrebné nainštalovať rozšírenie správcu používateľských štýlov.

Na inštaláciu tohto štýlu je potrebné nainštalovať rozšírenie správcu používateľských štýlov.

(Už mám správcu používateľských štýlov, nechajte ma ho nainštalovať!)

  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 15.08.08
  7. // 15.08.08 * css fixes
  8. // 15.08.07 + case-insensitive sorting
  9. // 15.05.07 sorting is now faster
  10. // 14.11.19.13 fixes for latest github changes
  11. // .12 new age format; fix for chrome
  12. // .10 datetime auto-updating fix; right-aligned datetime column; proper local time; .ext sorting fix;
  13. // .8 sorting by file extention
  14. // .7 date/time display mode switching
  15. // @created 2014-11-10
  16. // @updated 2015-03-25
  17. // @author trespassersW
  18. // @license MIT
  19. // @icon https://i.imgur.com/8buFLcs.png
  20. // (C) Icon: Aaron Nichols CC Attribution 3.0 Unported
  21. // @run-at document-end
  22. // @grant unsafeWindow
  23. // ==/UserScript==
  24.  
  25. if(document.body && document.querySelector('#js-repo-pjax-container')){
  26.  
  27. var llii=0, _l= function(){/* * /
  28. for (var s=++llii +':', li=arguments.length, i = 0; i<li; i++)
  29. s+=' ' + arguments[i];
  30. console.log(s)
  31. /* */
  32. }
  33. //_l=console.log.bind(console);
  34. var fakejs = // avoid compiler warning
  35. (function(){ "use strict";
  36.  
  37. var ii=0,tt;
  38. var d0=[0,0,1];
  39. var C=[{c:1, d: 0, s: 0},{c:2, d: 0, s: 0},{c:3, d: 1, s: 0}];
  40. var ASC;
  41. var oa=[],ca=[],clock,ext,dtStyle,upc;
  42. var D=document, TB;
  43. var catcher,locStor;
  44. var prefs={dtStyle:0, ext: 0, upc: 1};
  45. var W= unsafeWindow || window;
  46. function stickStyle(css){
  47. var s=document.createElement("style"); s.type="text/css";
  48. s.appendChild(document.createTextNode(css));
  49. return (document.head||document.documentElement).appendChild(s);
  50. }
  51. function insBefore(n,e){
  52. return e.parentNode.insertBefore(n,e);
  53. }
  54. function insAfter(n,e){
  55. if(e.nextElementSibling)
  56. return e.parentNode.insertBefore(n,e.nextElementSibling);
  57. return e.parentNode.appendChild(n);
  58. }
  59. function outerNode(target, node) {
  60. if (target.nodeName==node) return target;
  61. if (target.parentNode)
  62. while (target = target.parentNode) try{
  63. if (target.nodeName==node)
  64. return target;
  65. }catch(e){};
  66. return null;
  67. }
  68. function savePrefs(){
  69. if(locStor) locStor.setItem('GHSFL',JSON.stringify(prefs));
  70. }
  71.  
  72. function css(){
  73. stickStyle('\
  74. .fsort-butt,\n\
  75. .tables.file td.content, .tables.file td.message, .tables.file td.age\n\
  76. {position: relative; }\n\
  77. \n\
  78. .fsort-butt:before{\n\
  79. position: absolute; display: inline-block;\n\
  80. cursor: pointer;\n\
  81. text-align:center; vertical-align: top;\n\
  82. width: 18px; height: 14px;\n\
  83. line-height: 14px;\n\
  84. padding:0; margin:0;\n\
  85. border-color: transparent;\n\
  86. border-width: 0;\n\
  87. content: "";\n\
  88. opacity: .2\n\
  89. }\n\
  90. .fsort-butt.fsort-asc:before,.fsort-butt.fsort-desc:before{\n\
  91. left:1.5em; top: -1em;\n\
  92. }\n\
  93. td.age .fsort-butt.fsort-asc:before, td.age .fsort-butt.fsort-desc:before{\n\
  94. left: 4.5em; \n\
  95. }\n\
  96. .fsort-asc:before,.fsort-desc:before{\n\
  97. background-color: #48C;\n\
  98. }\n\
  99. .fsort-asc:before{\n\
  100. border-radius: 24px 24px 8px 8px;\n\
  101. }\n\
  102. .fsort-desc:before{\n\
  103. border-radius: 8px 8px 24px 24px;\n\
  104. }\n\
  105. .fsort-asc:before,\n\
  106. .fsort-desc.fsort-sel:hover:before\n\
  107. {\n\
  108. content: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAMCAYAAABbayygAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAqklEQVR42mNgQAIfPnzg//fv3z4g3vjs2TNOBmzg27dv0kAFl/5DAZB95OPHj4Ioin79+qUFlHj0Hw0Axa5+//5dFqzo58+fGkCB9/9xAKDcw69fv0ow/P37twAqAAJLkRQsgLGBapIZQO4ACk798+eP9+/fv21gkkArZYAKYoFy09++fcuL4lZ0hQy4wMAqtIQpBEaAFE6FL1684AL6chcQb1m1ahUTshwAw2kAJAeNI30AAAAASUVORK5CYII=);\n\
  109. }\n\
  110. .fsort-desc:before,\n\
  111. .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\
  112. }\n\
  113. \n\
  114. .fsort-butt.fsort-sel:before\n\
  115. {\n\
  116. background-color: #4183C4 !important;\n\
  117. opacity:.6 !important;\n\
  118. }\n\
  119. \n\
  120. span.fsort-butt:hover:before\n\
  121. ,span.fsort-butt:hover span:before\n\
  122. { opacity: 1 !important;}\n\
  123. \n\
  124. #fsort-clock:before{\n\
  125. left:6.5em; top: -15px; \n\
  126. text-align:center; vertical-align: top; top:-15px;\n\
  127. width: 16px; height: 16px;\
  128. border-radius: 16px;\n\
  129. 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\
  130. );}\n\
  131. .fsort-on:before{ background-color: #4183C4 !important; } \n\
  132. #fsort-ext:before{\n\
  133. left:4em; top:-14px;\n\
  134. width:28px; height: 14px;\n\
  135. border-radius: 6px;\n\
  136. content:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAANCAYAAAC3mX7tAAAABmJLR0QAAAAAAAD5Q7t/AAAACXBIWXMAAAsTAAALEwEAmpwYAAABWUlEQVQ4y+2SP0sDQRDFT7BQTGtnITYSK8Emha1NCrXwC4gWYiUKiiB4jYKdWAmC4AewtxEExSqVjZ1/OEgwrEQwkLvbmd/aTCBI0IBYCD7YYmaYfW/mTRT9VWRZNq6qm79OBBwBrueGPM8ngWvgHbgXkQX7aC+EEFR1x+IDi7dUdQOQYACuviSp1+tDQA2oquoycAlInucT1Wp1EHgA3r3300AG3FUqlX4RKQOvQFNVV0Rk9ksiEZkzRbtJkgx476faqq1etnoK4L0vdazuqefVqepq6ALgKIqiKI7jPuDRcpVPHn1P5JwrxHHc1zHRofe+1H5pmo6akCWrv4QQgojMdxA9AI3vzPfAsXOuACRAXVW3VXUNOM2yrNhsNofNh1qapmPAG5A45wpGdGMiToD9bvdftKZ9I54ALoCGXd5tq9UaAc7Mr0Wbbr09vfk3Azybf+fRP36KDxJ2sN2uMATcAAAAAElFTkSuQmCC);\n\
  137. }\n\
  138. #fsort-ext:before{ background-color: #BBB}\n\
  139. /* 150806 uppercase */\n\
  140. #fsort-upc:before{\n\
  141. left:7em; top:-14px;\n\
  142. width:16px; height: 16px;\n\
  143. border-radius: 0 4px 0 4px;\n\
  144. content:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QAAAAAAAD5Q7t/AAAACXBIWXMAAAsTAAALEwEAmpwYAAABcElEQVQ4y5WSsWoVQRSG/7kbyL1VCosgeQBBbFIYtBCsLYOx1QewiZgqr5HOF5ALRlALbcUigsK1TOUWooUaEbOL2d3z/TaTsOBduPeHYQ4zZ77555yRJEXEDnAE/AZ+As/qur6sBbSS50uS1iQ9lbSZUtoej8eWdHcRiKbT6eg8bprmqm0D37Souq7bBt4BP4AuA04XOtw0zTUggLOIeBgR95YBjIqi2EwpjSTNiqI4sP1dy6ht21v5xjPgCfAZaPoOImLfWRGx/x8EOAD+AF8j4gFw2AcAx8DfPI6XdXgzO3wNvLHttm1vXNRAkmzfGQIURXE/57ywfdhfu5Dt57av59i2b0tSWZarwC+Auq43qqpazx07KctytQ+4Yvuj7c52advnXzzbP+rV420u5s5cy30HwCsPCHgpSWno7VVVrU8mky8ppRXb73tbKaW0Zbur63pjsPoR8Sjf9GFO22f5GbuDAOBTTno8B76X4bN/RgN/lIzFNCAAAAAASUVORK5CYII=);\n\
  145. }\n\
  146. #fsort-upc:before{ background-color: #BBB}\n\
  147. \n\
  148. table.files td.age .css-truncate.css-truncate-target{\n\
  149. width: 99% !important; \n\
  150. max-width: none !important;\n\
  151. }\n\
  152. /*table.files td.age span.css-truncate time{\n\
  153. position: relative !important;\n\
  154. }*/\n\
  155. .fsort-time {\n\
  156. visibility: hidden;\n\
  157. display: none;\n\
  158. padding-right: 0px;\n\
  159. }\n\
  160. .fsort-time i {\n\
  161. display:inline-block;\
  162. color: #BBB;\
  163. font-style: normal !important;\n\
  164. transform: scale(0.9);\n\
  165. margin-left: 0px;\n\
  166. /* font-size: 12px;*/\n\
  167. }\n\
  168. \n\
  169. /* patches (--min-width:12em!important;) */\n\
  170. table.files td.age {text-align: right !important; padding-right: 4px !important;\n\
  171. width:12em!important;\n\
  172. \n\
  173. max-width:none!important;\n\
  174. overflow:visible!important;\n\
  175. }\n\
  176. table.files td.message {overflow: visible !important;}\n\
  177. /*.file-wrap .include-fragment-error { display: table-row !important;}*/\n\
  178. /* 150315 wide filelist *150426 better not touch this* /\n\
  179. div.wrapper div.container{\n\
  180. min-width: 980px!important;\n\
  181. width:90%!important;}\n\
  182. div.wrapper div#js-repo-pjax-container{\n\
  183. min-width: 790px!important;\n\
  184. width: calc(100% - 200px)!important;\n\
  185. }/* */\n\
  186. \
  187. ');
  188.  
  189. dtStyle=stickStyle('\
  190. td.age span.css-truncate time{\
  191. visibility: hidden !important;\
  192. display: none !important;\
  193. }\
  194. td.age span.css-truncate .fsort-time {\
  195. visibility: visible !important;\
  196. display: inline !important;\
  197. }\
  198. ')
  199. }
  200.  
  201. function setC(n){
  202. for(var i=0,il=C.length; i<il; i++ ){
  203. if(i!=n) C[i].s= 0, C[i].d=d0[i];
  204. else C[i].s=1;
  205. oa[i].className='fsort-butt fsort-'+(C[i].d?'desc':'asc')+(C[i].s?' fsort-sel':'') ;
  206. //oa[i].title=C[i].d? '\u21ca' : '\u21c8';
  207. }
  208. }
  209.  
  210. function dd(s)
  211. { s=s.toString(); if(s.length<2)return'0'+s; return s}
  212. function d2s(n){
  213. var hs=dd(n.getHours())+':'+dd(n.getMinutes());
  214. return {
  215. d: n.getFullYear()+'-'+dd(n.getMonth()+1)+'-'+dd(n.getDate())+'<i>'+ hs+'</i>',
  216. t: hs+':'+dd(n.getSeconds())
  217. }
  218. }
  219.  
  220. function setDateTime(x){
  221. var dt,dtm,dta,dtd,tc,m,now,t;
  222. var DT=D.querySelectorAll('td.age span.css-truncate time');
  223. _l('sDT',x?'refresh':'create');
  224. try{
  225. now = new Date();
  226. for(var dl=DT.length, i=0; i<dl; i++){
  227. dta=DT[i].getAttribute('datetime');
  228. dtd=new Date(dta);
  229. dt= d2s(dtd); // 2014-07-24T17:06:11Z
  230. dtm=null;
  231. if(x){
  232. dtm=DT[i].parentNode.querySelector('.fsort-time');
  233. }
  234. if(!dtm){
  235. dtm=D.createElement('span');
  236. dtm.className='fsort-time';
  237. x=0;
  238. }
  239. if(!x || !dtm.title || dtm.title != DT[i].title)
  240. { dtm.title= DT[i].title;
  241. t= dt.d;
  242. if( (now.getTime() - dtd.getTime() < 12*3600*1000) ||
  243. ((now.getTime() - dtd.getTime() < 24*3600*1000) &&
  244. (now.getDate() == dtd.getDate()) )
  245. ) t=dt.t;
  246. dtm.innerHTML=t;
  247. }
  248. if(!x) insAfter(dtm,DT[i]);
  249. }
  250. }catch(e){(console.log(e+'\n*GHSFL* wrong datetime'+x))}
  251. }
  252.  
  253. function isDir(x){
  254. var c= TB.rows[x].cells[0].querySelector("span");
  255. if(c.className.indexOf("-directory")>0) return 0;
  256. if(c.className.indexOf("-file")>0) return -1;
  257. return 1;
  258. }
  259. function getCell(r,c,s,p){
  260. var rc=TB.rows[r].cells[c],q=null;
  261. if(typeof rc == "undefined") {
  262. _l('r:',r,'c:',c,'- ???' );
  263. }else
  264. q=rc.querySelector(s);
  265. if(q) q= p? q.getAttribute(p): q.textContent;
  266. if(q) return q;
  267. return "";
  268. }
  269. var sDir,sCells,sExts;
  270. var fa=[
  271. function(a){
  272. var r=getCell(a,1,'span.css-truncate-target a');
  273. return prefs.upc? r.toUpperCase(): r;
  274. },
  275. function(a){
  276. var r= getCell(a,2,'span.css-truncate');
  277. r=r.replace(/\s+/,' ').replace(/^\s|\s$/,'');
  278. return prefs.upc? r.toUpperCase(): r;
  279. },
  280. function(a){
  281. var c = getCell(a,3,'span.css-truncate>time','datetime');
  282. if(c) return c;
  283. return "2099-12-31T23:59:59Z"
  284. }
  285. ]
  286.  
  287. var b9='\x20\x20\x20'; b9+=b9+b9;
  288. function pad9(s){
  289. if(s.length<9) return (s+b9).substr(0,9);
  290. return s;
  291. }
  292. function sort_p(n){// prepare data for sorting
  293. sDir=[],sCells=[];
  294. for(var tl=TB.rows.length, a=0; a<tl; a++)
  295. sDir.push(isDir(a));
  296. if( n === 0 && prefs.ext ){
  297. for( a=0; a<tl; a++){ // f.x -> x.f
  298. var x=fa[n](a),
  299. m= x.match(/(.*)(\..*)$/);
  300. if(!m || !m[2]) m=['',x,''];
  301. x=pad9(m[2])+' '+m[1];
  302. sCells.push(x);
  303. }
  304. }else{
  305. for( a=0; a<tl; a++) sCells.push(fa[n](a));
  306. }
  307. }
  308.  
  309. function sort_fn(a,b){
  310. var x=sDir[a], y=sDir[b];
  311. if(x!=y) return ((x<y)? 1: -1);
  312. x= sCells[a], y= sCells[b];
  313. return x==y? 0: (((x>y)^ASC)<<1)-1;
  314. }
  315.  
  316. var CNn={content: 0, message: 1, age: 2}
  317.  
  318. function oClr(){
  319. var o= catcher.querySelectorAll('.fsort-butt,.fsort-time')
  320. for(var ol=o.length,i=0;i<ol;i++)
  321. o[i] && o[i].parentNode.removeChild(o[i]);
  322. }
  323. //
  324. function extclassName(){
  325. ext.className='fsort-butt'+ (prefs.ext? ' fsort-on': '' );
  326. }
  327. function clockclassName(){
  328. clock.className='fsort-butt'+ (prefs.dtStyle? '': ' fsort-on');
  329. }
  330. function upcclassName(){
  331. upc.className='fsort-butt'+ (prefs.upc? ' fsort-on': '' );
  332. }
  333. //
  334. function doSort(t){
  335. TB=outerNode(t,'TBODY');
  336. if(!TB){ _l( "*GHSFL* TBODY not found"); return; }
  337. var n = CNn[t.parentNode.className];
  338. if(typeof n=="undefined") n= CNn[t.parentNode.parentNode.className];
  339. if(typeof n=="undefined"){ _l( "*GHSFL* undefined col"); return; }
  340. if(t.id=='fsort-clock'){
  341. dtStyle.disabled = (prefs.dtStyle ^= 1);
  342. savePrefs();
  343. clockclassName();
  344. return;
  345. }
  346. if (t.id=='fsort-ext'){
  347. if(C[n].s) prefs.ext ^= 1;
  348. else prefs.ext= 1;
  349. savePrefs();
  350. extclassName();
  351. C[n].d^=C[n].s; // don't toggle dir on ext.click
  352. }else
  353. if (t.id=='fsort-upc'){
  354. if(C[n].s) prefs.upc ^= 1;
  355. else prefs.upc= 1;
  356. savePrefs();
  357. upcclassName();
  358. C[n].d^=C[n].s; // don't toggle case on upc.click
  359. }
  360. var tb=[],ix=[], i, tl,ti,tx;
  361. _l('n:'+n);
  362. tl=TB.rows.length;
  363. ASC=C[n].d^=C[n].s;
  364. for( i=0; i<tl; i++)
  365. ix.push(i);
  366. oClr();
  367. sort_p(n);
  368. ix.sort(sort_fn);
  369. for( i=0; i<tl; i++)
  370. tb.push(TB.rows[ix[i]]);
  371. for( i=tl-1; i>=0; i--)
  372. TB.removeChild(TB.rows[i]);
  373. for( i=0; i<tl; i++)
  374. TB.appendChild(tb[i]);
  375. setC(n);
  376. gitDir1(0);
  377. }
  378.  
  379. function onClik(e){doSort(e.target)}
  380.  
  381. function gitDir1(x){
  382. if(x && document.querySelector('.fsort-butt')) {
  383. _l('gitDir'+x+ '- already'); return;
  384. }
  385. _l('gitDir',x?'create':'refresh')
  386. var c,o;
  387. ca=[];
  388. c= D.querySelector('.file-wrap table.files td.content >span');
  389. if(!c){ _l( '*GHSFL* no content') ; return; }
  390. ca.push(c);
  391. c=D.querySelector('.file-wrap table.files td.message >span');
  392. if(!c){ _l( '*GHSFL* no messages'); return; }
  393. ca.push(c);
  394. c=D.querySelector('.file-wrap table.files td.age >span');
  395. if(!c){_l( '*GHSFL* no ages'); return; }
  396. ca.push(c);
  397. if(x){ oClr(); oa=[];
  398. o=D.createElement('span');
  399. o.textContent='';
  400. oa.push(o);
  401. o=o.cloneNode(true);
  402. oa.push(o);
  403. o=o.cloneNode(true);
  404. oa.push(o);
  405. clock=D.createElement('span');
  406. clock.id='fsort-clock'; clockclassName();
  407. ext=D.createElement('span');
  408. ext.id='fsort-ext'; extclassName();
  409. upc=D.createElement('span');
  410. upc.id='fsort-upc'; upcclassName();
  411. setDateTime();
  412. setC(-1);
  413. }
  414. o=insBefore(oa[0],ca[0]);
  415. o.appendChild(upc);
  416. o.appendChild(ext);
  417. insBefore(oa[1],ca[1]);
  418. o=insBefore(oa[2],ca[2]);
  419. o.appendChild(clock);
  420. }
  421.  
  422. function gitDir(){
  423. gitDir1(1);
  424. }
  425.  
  426. catcher= D.querySelector('#js-repo-pjax-container');
  427. if(!catcher){ _l( "*GHSFL* err0r"); return; }
  428.  
  429. catcher.addEventListener('mousedown',function(e){
  430. if(e.target.nodeName && e.target.nodeName=='SPAN' &&
  431. e.target.className.indexOf('fsort-butt')>-1)
  432. { onClik(e); }
  433. }
  434. ,false);
  435.  
  436. _l('startup()');
  437.  
  438. try {
  439. locStor = W.localStorage;
  440. tt=locStor.getItem("GHSFL");
  441. } catch(e){ locStor =null}
  442.  
  443. if(locStor && tt) try{
  444. var pa =JSON.parse(tt);
  445. for (var a in pa) prefs[a]=pa[a];
  446. _l('prefs:'+JSON.stringify(prefs));
  447. }catch(e){ console.log(e+"\n*GHSFL* bad prefs") }
  448.  
  449. css();
  450. dtStyle.disabled=(prefs.dtStyle===1);
  451.  
  452. gitDir();
  453. var target = catcher; //document.body; //D.querSelector('.file-wrap');
  454. var MO = window.MutationObserver;
  455. if(!MO) MO= window.WebKitMutationObserver;
  456. if(!MO) return;
  457. var __started=0;
  458. var mutI=0;
  459. var observer = new MO(function(mutations) {
  460.  
  461. for(var m,t, ml=mutations.length, i=0; i<ml; i++)
  462. {
  463. m=mutations[i],t = m.target;
  464. if( m.type=="attributes")
  465. {
  466. if( t.nodeName == 'DIV' &&
  467. t.className == "file-wrap"
  468. ){
  469. gitDir();
  470. return;
  471. }
  472. // patch for the very first page
  473. if( 0===__started && t.nodeName=='TIME' )
  474. {
  475. if( t.parentNode.parentNode.className=="age" )
  476. {
  477. //_l('T'+mutI++,ml,' T:' +m.type,'N:'+t.nodeName, 'C:',"age" ) ;
  478. if(!catcher.querySelector('.fsort-butt'))
  479. gitDir(1); //chrome ?!11
  480. setDateTime(1);
  481. __started=1;
  482. return;
  483. }
  484. else continue;
  485. }
  486. }
  487. if( m.type=="childList" )
  488. {
  489. if( t.className=='age' )
  490. {
  491. if(!catcher.querySelector('.fsort-butt'))
  492. gitDir(1); //chrome ?!11
  493. //_l('C'+mutI++,ml,' T:' +m.type,'N:'+t.nodeName,'C:'+ t.className,t.querySelector('TIME').textContent) ;
  494. setDateTime(1);
  495. return;
  496. }
  497. else continue;
  498. }
  499. }
  500. });
  501.  
  502. observer.observe(D.body, { attributes: true, childList: true, subtree: true } );
  503. /* attributes: true , childList: true, subtree: true,
  504. characterData: true, attributeOldValue:true, characterDataOldValue:true
  505. */
  506.  
  507. })()};