Greasy Fork is available in English.

GitHub Sortable Filelist

appends sorting function to github directories

As of 19.08.2015. See ბოლო ვერსია.

  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.19
  7. // 15.08.19 * slight changes
  8. // 15.08.12 ++ octicons for file extensions
  9. // 15.08.07 + case-insensitive sorting
  10. // 15.05.07 sorting is now faster
  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. //
  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.  
  47. // see: https://octicons.github.com/
  48. var extIcon=[
  49. //0...........1..............2..............3..............4.......
  50. "octoface" ,"zap" ,"list-unordered","paintcan" ,"eye"
  51. //5...........6..............7..............8..............9.......
  52. ,"globe" ,"file-binary" ,"file-zip" ,"file-pdf" ,"megaphone"
  53. //10..........11.............12.............13.............14......
  54. ,"gear" ,"triangle-right","ruby" ,"info" ,"device-camera"
  55. //15..........16.............17.............18.............19......
  56. ,"pencil" ,"terminal" ,"book"
  57. ]
  58. var extList={
  59. md:0,
  60. js:1,jsm:1,
  61. json:2,xml:2,xul:2,rdf:2,yml:2,
  62. css:3,scss:3,less:3,
  63. png:4,bmp:4,gif:4,cur:4,ico:4,svg:4,
  64. htm:5,html:5,php:5,
  65. bin:6,exe:6,dll:6,
  66. zip:7,rar:7,arj:7,
  67. pdf:8,
  68. wav:9,mp3:9,ogg:9,mp4:9,aac:9,
  69. cfg:10,ini:10,
  70. c:11,cpp:11,cc:11,h:11,hpp:11,asm:11,m:11,
  71. rb:12,py:12,
  72. EmptyExt:13,
  73. jpg:14,jpeg:14,
  74. pl:15,java:15,jar:15,cs:15,
  75. sh:16,mak:16,cmd:16,bat:16,
  76. doc:17,rtf:17,djvu:17
  77. }
  78.  
  79. function stickStyle(css){
  80. var s=document.createElement("style"); s.type="text/css";
  81. s.appendChild(document.createTextNode(css));
  82. return (document.head||document.documentElement).appendChild(s);
  83. }
  84. function insBefore(n,e){
  85. return e.parentNode.insertBefore(n,e);
  86. }
  87. function insAfter(n,e){
  88. if(e.nextElementSibling)
  89. return e.parentNode.insertBefore(n,e.nextElementSibling);
  90. return e.parentNode.appendChild(n);
  91. }
  92. function outerNode(target, node) {
  93. if (target.nodeName==node) return target;
  94. if (target.parentNode)
  95. while (target = target.parentNode) try{
  96. if (target.nodeName==node)
  97. return target;
  98. }catch(e){};
  99. return null;
  100. }
  101. function savePrefs(){
  102. if(locStor) locStor.setItem('GHSFL',JSON.stringify(prefs));
  103. }
  104.  
  105. function css(){
  106. stickStyle('\
  107. .fsort-butt,\n\
  108. .tables.file td.content, .tables.file td.message, .tables.file td.age\n\
  109. {position: relative; }\n\
  110. \n\
  111. .fsort-butt:before{\n\
  112. position: absolute; display: inline-block;\n\
  113. cursor: pointer;\n\
  114. text-align:center; vertical-align: top;\n\
  115. width: 18px; height: 14px;\n\
  116. line-height: 14px;\n\
  117. padding:0; margin:0;\n\
  118. border-color: transparent;\n\
  119. border-width: 0;\n\
  120. content: "";\n\
  121. opacity: .2\n\
  122. }\n\
  123. .fsort-butt.fsort-asc:before,.fsort-butt.fsort-desc:before{\n\
  124. left:1.5em; top: -1em;\n\
  125. }\n\
  126. td.age .fsort-butt.fsort-asc:before, td.age .fsort-butt.fsort-desc:before{\n\
  127. left: 4.5em; \n\
  128. }\n\
  129. .fsort-asc:before,.fsort-desc:before{\n\
  130. background-color: #48C;\n\
  131. }\n\
  132. .fsort-asc:before{\n\
  133. border-radius: 24px 24px 8px 8px;\n\
  134. }\n\
  135. .fsort-desc:before{\n\
  136. border-radius: 8px 8px 24px 24px;\n\
  137. }\n\
  138. .fsort-asc:before,\n\
  139. .fsort-desc.fsort-sel:hover:before\n\
  140. {\n\
  141. content: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAMCAYAAABbayygAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAqklEQVR42mNgQAIfPnzg//fv3z4g3vjs2TNOBmzg27dv0kAFl/5DAZB95OPHj4Ioin79+qUFlHj0Hw0Axa5+//5dFqzo58+fGkCB9/9xAKDcw69fv0ow/P37twAqAAJLkRQsgLGBapIZQO4ACk798+eP9+/fv21gkkArZYAKYoFy09++fcuL4lZ0hQy4wMAqtIQpBEaAFE6FL1684AL6chcQb1m1ahUTshwAw2kAJAeNI30AAAAASUVORK5CYII=);\n\
  142. }\n\
  143. .fsort-desc:before,\n\
  144. .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\
  145. }\n\
  146. \n\
  147. .fsort-butt.fsort-sel:before\n\
  148. {\n\
  149. background-color: #4183C4 !important;\n\
  150. opacity:.6 !important;\n\
  151. }\n\
  152. \n\
  153. span.fsort-butt:hover:before\n\
  154. ,span.fsort-butt:hover span:before\n\
  155. { opacity: 1 !important;}\n\
  156. \n\
  157. #fsort-clock:before{\n\
  158. left:6.5em; top: -15px; \n\
  159. text-align:center; vertical-align: top; top:-15px;\n\
  160. width: 16px; height: 16px;\
  161. border-radius: 16px;\n\
  162. 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\
  163. );}\n\
  164. .fsort-on:before{ background-color: #4183C4 !important; } \n\
  165. #fsort-ext:before{\n\
  166. left:4em; top:-14px;\n\
  167. width:28px; height: 14px;\n\
  168. border-radius: 6px;\n\
  169. content:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAANCAYAAAC3mX7tAAAABmJLR0QAAAAAAAD5Q7t/AAAACXBIWXMAAAsTAAALEwEAmpwYAAABWUlEQVQ4y+2SP0sDQRDFT7BQTGtnITYSK8Emha1NCrXwC4gWYiUKiiB4jYKdWAmC4AewtxEExSqVjZ1/OEgwrEQwkLvbmd/aTCBI0IBYCD7YYmaYfW/mTRT9VWRZNq6qm79OBBwBrueGPM8ngWvgHbgXkQX7aC+EEFR1x+IDi7dUdQOQYACuviSp1+tDQA2oquoycAlInucT1Wp1EHgA3r3300AG3FUqlX4RKQOvQFNVV0Rk9ksiEZkzRbtJkgx476faqq1etnoK4L0vdazuqefVqepq6ALgKIqiKI7jPuDRcpVPHn1P5JwrxHHc1zHRofe+1H5pmo6akCWrv4QQgojMdxA9AI3vzPfAsXOuACRAXVW3VXUNOM2yrNhsNofNh1qapmPAG5A45wpGdGMiToD9bvdftKZ9I54ALoCGXd5tq9UaAc7Mr0Wbbr09vfk3Azybf+fRP36KDxJ2sN2uMATcAAAAAElFTkSuQmCC);\n\
  170. }\n\
  171. #fsort-ext:before{ background-color: #BBB}\n\
  172. /* 150806 uppercase */\n\
  173. #fsort-upc:before{\n\
  174. left:7em; top:-14px;\n\
  175. width:16px; height: 16px;\n\
  176. border-radius: 0 4px 0 4px;\n\
  177. content:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QAAAAAAAD5Q7t/AAAACXBIWXMAAAsTAAALEwEAmpwYAAABcElEQVQ4y5WSsWoVQRSG/7kbyL1VCosgeQBBbFIYtBCsLYOx1QewiZgqr5HOF5ALRlALbcUigsK1TOUWooUaEbOL2d3z/TaTsOBduPeHYQ4zZ77555yRJEXEDnAE/AZ+As/qur6sBbSS50uS1iQ9lbSZUtoej8eWdHcRiKbT6eg8bprmqm0D37Souq7bBt4BP4AuA04XOtw0zTUggLOIeBgR95YBjIqi2EwpjSTNiqI4sP1dy6ht21v5xjPgCfAZaPoOImLfWRGx/x8EOAD+AF8j4gFw2AcAx8DfPI6XdXgzO3wNvLHttm1vXNRAkmzfGQIURXE/57ywfdhfu5Dt57av59i2b0tSWZarwC+Auq43qqpazx07KctytQ+4Yvuj7c52advnXzzbP+rV420u5s5cy30HwCsPCHgpSWno7VVVrU8mky8ppRXb73tbKaW0Zbur63pjsPoR8Sjf9GFO22f5GbuDAOBTTno8B76X4bN/RgN/lIzFNCAAAAAASUVORK5CYII=);\n\
  178. }\n\
  179. #fsort-upc:before{ background-color: #BBB}\n\
  180. \n\
  181. table.files td.age .css-truncate.css-truncate-target{\n\
  182. width: 99% !important; \n\
  183. max-width: none !important;\n\
  184. }\n\
  185. /*table.files td.age span.css-truncate time{\n\
  186. position: relative !important;\n\
  187. }*/\n\
  188. .fsort-time {\n\
  189. visibility: hidden;\n\
  190. display: none;\n\
  191. padding-right: 0px;\n\
  192. }\n\
  193. .fsort-time i {\n\
  194. display:inline-block;\
  195. color: #BBB;\
  196. font-style: normal !important;\n\
  197. transform: scale(0.9);\n\
  198. margin-left: 0px;\n\
  199. /* font-size: 12px;*/\n\
  200. }\n\
  201. \n\
  202. /* patches (--min-width:12em!important;) */\n\
  203. table.files td.age {text-align: right !important; padding-right: 4px !important;\n\
  204. width:12em!important;\n\
  205. \n\
  206. max-width:none!important;\n\
  207. overflow:visible!important;\n\
  208. }\n\
  209. table.files td.message {overflow: visible !important;}\n\
  210. /*.file-wrap .include-fragment-error { display: table-row !important;}*/\n\
  211. /* 150315 wide filelist *150426 better not touch this* /\n\
  212. div.wrapper div.container{\n\
  213. min-width: 980px!important;\n\
  214. width:90%!important;}\n\
  215. div.wrapper div#js-repo-pjax-container{\n\
  216. min-width: 790px!important;\n\
  217. width: calc(100% - 200px)!important;\n\
  218. }/* */\n\
  219. \
  220. ');
  221.  
  222. dtStyle=stickStyle('\
  223. td.age span.css-truncate time{\
  224. visibility: hidden !important;\
  225. display: none !important;\
  226. }\
  227. td.age span.css-truncate .fsort-time {\
  228. visibility: visible !important;\
  229. display: inline !important;\
  230. }\
  231. ')
  232. }
  233.  
  234. function setC(n){
  235. for(var i=0,il=C.length; i<il; i++ ){
  236. if(i!=n) C[i].s= 0, C[i].d=d0[i];
  237. else C[i].s=1;
  238. oa[i].className='fsort-butt fsort-'+(C[i].d?'desc':'asc')+(C[i].s?' fsort-sel':'') ;
  239. //oa[i].title=C[i].d? '\u21ca' : '\u21c8';
  240. }
  241. }
  242.  
  243. function dd(s)
  244. { s=s.toString(); if(s.length<2)return'0'+s; return s}
  245. function d2s(n){
  246. var hs=dd(n.getHours())+':'+dd(n.getMinutes());
  247. return {
  248. d: n.getFullYear()+'-'+dd(n.getMonth()+1)+'-'+dd(n.getDate())+'<i>'+ hs+'</i>',
  249. t: hs+':'+dd(n.getSeconds())
  250. }
  251. }
  252.  
  253. var xmatch=/(.*)\.(.*)$/;
  254. function filext(x){
  255. var m= x.match(xmatch);
  256. if(!m || !m[2]) return "EmptyExt";
  257. return m[2].toLowerCase();
  258. }
  259. function setIcon(tr){
  260. var xt,tc,ti=tr.querySelector('td.icon > span.octicon-file-text');
  261. if(!ti) return;
  262. tc=tr.querySelector('td.content > span.css-truncate');
  263. if(!tc) return;
  264. tc=tc.textContent;
  265. if(!tc) return;
  266. xt=filext(tc);
  267. if(!xt) return;
  268. xt=extList[xt];
  269. if(typeof xt === "undefined") return;
  270. ti.className='octicon octicon-'+ extIcon[xt];
  271. //_l('setIcon '+xt);
  272. }
  273.  
  274. function setDateTime(x){
  275. var dt,dtm,dta,dtd,tc,m,now,t;
  276. var DT=D.querySelectorAll('td.age span.css-truncate time');
  277. _l('sDT',x?'refresh':'create');
  278. try{
  279. now = new Date();
  280. for(var dl=DT.length, i=0; i<dl; i++){
  281. dta=DT[i].getAttribute('datetime');
  282. dtd=new Date(dta);
  283. dt= d2s(dtd); // 2014-07-24T17:06:11Z
  284. dtm=null;
  285. if(x){
  286. dtm=DT[i].parentNode.querySelector('.fsort-time');
  287. }
  288. if(!dtm){
  289. dtm=D.createElement('span');
  290. dtm.className='fsort-time';
  291. x=0;
  292. }
  293. if(!x || !dtm.title || dtm.title != DT[i].title)
  294. { dtm.title= DT[i].title;
  295. t= dt.d;
  296. if( (now.getTime() - dtd.getTime() < 12*3600*1000) ||
  297. ((now.getTime() - dtd.getTime() < 24*3600*1000) &&
  298. (now.getDate() == dtd.getDate()) )
  299. ) t=dt.t;
  300. dtm.innerHTML=t;
  301. }
  302. if(!x) insAfter(dtm,DT[i]);
  303. if(!x)
  304. setIcon(outerNode(DT[i],'TR'));
  305. }
  306. /* 150810 */
  307. }catch(e){(console.log(e+'\n*GHSFL* wrong datetime'+x))}
  308. }
  309.  
  310. function isDir(x){
  311. var c= TB.rows[x].cells[0].querySelector("span");
  312. if(c.className.indexOf("-directory")>0) return 0;
  313. if(c.className.indexOf("octicon-")>0) return -1;
  314. return 1;
  315. }
  316. function getCell(r,c,s,p){
  317. var rc=TB.rows[r].cells[c],q=null;
  318. if(typeof rc == "undefined") {
  319. _l('r:',r,'c:',c,'- ???' );
  320. }else
  321. q=rc.querySelector(s);
  322. if(q) q= p? q.getAttribute(p): q.textContent;
  323. if(q) return q;
  324. return "";
  325. }
  326. var sDir,sCells,sExts;
  327. var fa=[
  328. function(a){
  329. var r=getCell(a,1,'span.css-truncate-target a');
  330. return prefs.upc? r.toUpperCase(): r;
  331. },
  332. function(a){
  333. var r= getCell(a,2,'span.css-truncate');
  334. r=r.replace(/\s+/,' ').replace(/^\s|\s$/,'');
  335. return prefs.upc? r.toUpperCase(): r;
  336. },
  337. function(a){
  338. var c = getCell(a,3,'span.css-truncate>time','datetime');
  339. if(c) return c;
  340. return "2099-12-31T23:59:59Z"
  341. }
  342. ]
  343.  
  344. var b9='\x20\x20\x20'; b9+=b9+b9;
  345. function pad9(s){
  346. if(s.length<9) return (s+b9).substr(0,9);
  347. return s;
  348. }
  349. function sort_p(n){// prepare data for sorting
  350. sDir=[],sCells=[];
  351. for(var tl=TB.rows.length, a=0; a<tl; a++)
  352. sDir.push(isDir(a));
  353. if( n === 0 && prefs.ext ){
  354. for( a=0; a<tl; a++){ // f.x -> x.f
  355. var x=fa[n](a),
  356. m= x.match(/(.*)(\..*)$/);
  357. if(!m || !m[2]) m=['',x,''];
  358. x=pad9(m[2])+' '+m[1];
  359. sCells.push(x);
  360. }
  361. }else{
  362. for( a=0; a<tl; a++) sCells.push(fa[n](a));
  363. }
  364. }
  365.  
  366. function sort_fn(a,b){
  367. var x=sDir[a], y=sDir[b];
  368. if(x!=y) return ((x<y)? 1: -1);
  369. x= sCells[a], y= sCells[b];
  370. return x==y? 0: (((x>y)^ASC)<<1)-1;
  371. }
  372.  
  373. var CNn={content: 0, message: 1, age: 2}
  374.  
  375. function oClr(){
  376. var o= catcher.querySelectorAll('.fsort-butt,.fsort-time')
  377. for(var ol=o.length,i=0;i<ol;i++)
  378. o[i] && o[i].parentNode.removeChild(o[i]);
  379. }
  380. //
  381. function extclassName(){
  382. ext.className='fsort-butt'+ (prefs.ext? ' fsort-on': '' );
  383. }
  384. function clockclassName(){
  385. clock.className='fsort-butt'+ (prefs.dtStyle? '': ' fsort-on');
  386. }
  387. function upcclassName(){
  388. upc.className='fsort-butt'+ (prefs.upc? ' fsort-on': '' );
  389. }
  390. //
  391. function doSort(t){
  392. TB=outerNode(t,'TBODY');
  393. if(!TB){ _l( "*GHSFL* TBODY not found"); return; }
  394. var n = CNn[t.parentNode.className];
  395. if(typeof n=="undefined") n= CNn[t.parentNode.parentNode.className];
  396. if(typeof n=="undefined"){ _l( "*GHSFL* undefined col"); return; }
  397. if(t.id=='fsort-clock'){
  398. dtStyle.disabled = (prefs.dtStyle ^= 1);
  399. savePrefs();
  400. clockclassName();
  401. return;
  402. }
  403. if (t.id=='fsort-ext'){
  404. if(C[n].s) prefs.ext ^= 1;
  405. else prefs.ext= 1;
  406. savePrefs();
  407. extclassName();
  408. C[n].d^=C[n].s; // don't toggle dir on ext.click
  409. }else
  410. if (t.id=='fsort-upc'){
  411. if(C[n].s) prefs.upc ^= 1;
  412. else prefs.upc= 1;
  413. savePrefs();
  414. upcclassName();
  415. C[n].d^=C[n].s; // don't toggle case on upc.click
  416. }
  417. var tb=[],ix=[], i, tl,ti,tx;
  418. _l('n:'+n);
  419. tl=TB.rows.length;
  420. ASC=C[n].d^=C[n].s;
  421. for( i=0; i<tl; i++)
  422. ix.push(i);
  423. oClr();
  424. sort_p(n);
  425. ix.sort(sort_fn);
  426. for( i=0; i<tl; i++)
  427. tb.push(TB.rows[ix[i]]);
  428. for( i=tl-1; i>=0; i--)
  429. TB.removeChild(TB.rows[i]);
  430. for( i=0; i<tl; i++)
  431. TB.appendChild(tb[i]);
  432. setC(n);
  433. gitDir1(0);
  434. }
  435.  
  436. function onClik(e){doSort(e.target)}
  437.  
  438. function gitDir1(x){
  439. if(x && document.querySelector('.fsort-butt')) {
  440. _l('gitDir'+x+ '- already'); return;
  441. }
  442. _l('gitDir',x?'create':'refresh')
  443. var c,o;
  444. ca=[];
  445. c= D.querySelector('.file-wrap table.files td.content >span');
  446. if(!c){ _l( '*GHSFL* no content') ; return; }
  447. ca.push(c);
  448. c=D.querySelector('.file-wrap table.files td.message >span');
  449. if(!c){ _l( '*GHSFL* no messages'); return; }
  450. ca.push(c);
  451. c=D.querySelector('.file-wrap table.files td.age >span');
  452. if(!c){_l( '*GHSFL* no ages'); return; }
  453. ca.push(c);
  454. if(x){ oClr(); oa=[];
  455. o=D.createElement('span');
  456. o.textContent='';
  457. oa.push(o);
  458. o=o.cloneNode(true);
  459. oa.push(o);
  460. o=o.cloneNode(true);
  461. oa.push(o);
  462. clock=D.createElement('span');
  463. clock.id='fsort-clock'; clockclassName();
  464. ext=D.createElement('span');
  465. ext.id='fsort-ext'; extclassName();
  466. upc=D.createElement('span');
  467. upc.id='fsort-upc'; upcclassName();
  468. setDateTime();
  469. setC(-1);
  470. }
  471. o=insBefore(oa[0],ca[0]);
  472. o.appendChild(upc);
  473. o.appendChild(ext);
  474. insBefore(oa[1],ca[1]);
  475. o=insBefore(oa[2],ca[2]);
  476. o.appendChild(clock);
  477. }
  478.  
  479. function gitDir(){
  480. gitDir1(1);
  481. }
  482.  
  483. catcher= D.querySelector('#js-repo-pjax-container');
  484. if(!catcher){ _l( "*GHSFL* err0r"); return; }
  485.  
  486. catcher.addEventListener('mousedown',function(e){
  487. if(e.target.nodeName && e.target.nodeName=='SPAN' &&
  488. e.target.className.indexOf('fsort-butt')>-1)
  489. { onClik(e); }
  490. }
  491. ,false);
  492.  
  493. _l('startup()');
  494.  
  495. try {
  496. locStor = W.localStorage;
  497. tt=locStor.getItem("GHSFL");
  498. } catch(e){ locStor =null}
  499.  
  500. if(locStor && tt) try{
  501. var pa =JSON.parse(tt);
  502. for (var a in pa) prefs[a]=pa[a];
  503. _l('prefs:'+JSON.stringify(prefs));
  504. }catch(e){ console.log(e+"\n*GHSFL* bad prefs") }
  505.  
  506. css();
  507. dtStyle.disabled=(prefs.dtStyle===1);
  508.  
  509. gitDir();
  510. var target = catcher; //document.body; //D.querSelector('.file-wrap');
  511. var MO = window.MutationObserver;
  512. if(!MO) MO= window.WebKitMutationObserver;
  513. if(!MO) return;
  514. var __started=0;
  515. var mutI=0;
  516. var observer = new MO(function(mutations) {
  517.  
  518. for(var m,t, ml=mutations.length, i=0; i<ml; i++)
  519. {
  520. m=mutations[i],t = m.target;
  521. if( m.type=="attributes")
  522. {
  523. if( t.nodeName == 'DIV' &&
  524. t.className == "file-wrap"
  525. ){
  526. gitDir();
  527. return;
  528. }
  529. // patch for the very first page
  530. if( 0===__started && t.nodeName=='TIME' )
  531. {
  532. if( t.parentNode.parentNode.className=="age" )
  533. {
  534. //_l('T'+mutI++,ml,' T:' +m.type,'N:'+t.nodeName, 'C:',"age" ) ;
  535. if(!catcher.querySelector('.fsort-butt'))
  536. gitDir(1); //chrome ?!11
  537. setDateTime(1);
  538. __started=1;
  539. return;
  540. }
  541. else continue;
  542. }
  543. }
  544. if( m.type=="childList" )
  545. {
  546. if( t.className=='age' )
  547. {
  548. if(!catcher.querySelector('.fsort-butt'))
  549. gitDir(1); //chrome ?!11
  550. //_l('C'+mutI++,ml,' T:' +m.type,'N:'+t.nodeName,'C:'+ t.className,t.querySelector('TIME').textContent) ;
  551. setDateTime(1);
  552. return;
  553. }
  554. else continue;
  555. }
  556. }
  557. });
  558.  
  559. observer.observe(D.body, { attributes: true, childList: true, subtree: true } );
  560. /* attributes: true , childList: true, subtree: true,
  561. characterData: true, attributeOldValue:true, characterDataOldValue:true
  562. */
  563.  
  564. })()};