From 8896a0ed624b9c5c125c744ccf70168bc8ccc64f Mon Sep 17 00:00:00 2001 From: Michael Murtaugh Date: Mon, 22 Jul 2019 17:20:59 +0200 Subject: [PATCH] recentchanges --- dist/index.js | 5 +- img/Ateliers_pluridisciplinaires.png | Bin 948 -> 886 bytes img/Cours_de_soutien_a_lorientation.png | Bin 448 -> 480 bytes img/Cours_de_soutien_specifique.png | Bin 1162 -> 1061 bytes img/Cours_techniques.png | Bin 1654 -> 1361 bytes img/Cours_theoriques.png | Bin 1311 -> 1164 bytes img/Enseignants.png | Bin 879 -> 828 bytes img/Main.png | Bin 340 -> 462 bytes img/Orientations.png | Bin 1558 -> 1348 bytes index.html | 7 +- special/recentchanges/Makefile | 6 + special/recentchanges/dist/recentchanges.js | 915 ++++++++++++++++++ special/recentchanges/index.html | 53 + special/recentchanges/package.json | 16 + special/recentchanges/rollup.config.js | 17 + special/recentchanges/src/recentchanges.js | 55 ++ special/recentfiles/dist/recentfiles.js | 35 +- .../{recentfiles.html => index.html} | 11 + special/recentfiles/src/recentfiles.js | 40 +- style.css | 22 +- symbols.svg | 46 +- 21 files changed, 1148 insertions(+), 80 deletions(-) create mode 100644 special/recentchanges/Makefile create mode 100644 special/recentchanges/dist/recentchanges.js create mode 100644 special/recentchanges/index.html create mode 100644 special/recentchanges/package.json create mode 100644 special/recentchanges/rollup.config.js create mode 100644 special/recentchanges/src/recentchanges.js rename special/recentfiles/{recentfiles.html => index.html} (71%) diff --git a/dist/index.js b/dist/index.js index 04ec175..dc69a58 100644 --- a/dist/index.js +++ b/dist/index.js @@ -28,6 +28,9 @@ function resize() { // Match size of parent svg.setAttribute("width", page.clientWidth); svg.setAttribute("height", page.clientHeight); + + // Checks if narrow device + if (x>600){ g.querySelector("#cats").classList.add("expanded")} } async function doload () { @@ -105,4 +108,4 @@ specialclosebutton.addEventListener("click", function (e) { specialselect.addEventListener("input", function (e) { console.log("specialselect", specialselect.value); set_special(specialselect.value); -}); \ No newline at end of file +}); diff --git a/img/Ateliers_pluridisciplinaires.png b/img/Ateliers_pluridisciplinaires.png index 5c69cfef0e9c336ffe0137b1c1f7d6018c4113fc..750fcf90a04e91c0bb0110e57eba83c80b2ecfd4 100644 GIT binary patch delta 818 zcmdnO{*7&dWDo-ogngGg0Hj#b9eo`c7&i8E|4C#8@)eRjf_xbms?-=58d?|_egTCV zUNA6}8Za=tN?>5Hn!&&zUNC1@pbb!hDaqU2h2ejD|C#+04JGQ?OFVsD*&nlu@##qm ztokJiRN&(2;uzv_ymy+fzi^;P+j*ZJ`K9tnCYPED!-F!Ud#+Ah=2qXr$+1gtvYOd1 zi0}ubz;%w?h`I6cOP0E z+j(k_ zE;DrmEq6I~L8Yf(_fTI3lZzp{LV}~TLKG8^iTd`dC$4_ntlnCCb^ZpQL!0W8`1fvM zV3@6Mm-BeeHRi1Ukaj2i_B^q`{m!osRUN2fyYWdg{^isNXUUkQ z+%^w;XFfmn$JFro*X1>Hme0PkL1F4s&g~i}zB@8r*mKCp?X0pH-|E?E1@AAc*|0HO z^~79oA#{-sWR>xQ}bWf%zG2H!AAy2X&lf-dMEp+IB9*IR<;5wJle%d$;aR z@h_!iKDYkF+!g$opYprK^sSqpTvx^c#WSbG{mbHVzOUo4V@!07T&+GgSM=2L=TmR6 zOJum!ubN$8S+s6j?Sfyz(>xC-y?kx!&>(!7ZP}}}vwlSGR!j4Ho#!>#W4m^#@A_@( zS#$pd^3-QCB&U}5-;$E!h&k11XJN*`k(Rn%_glR8qyAgxSFg1DYZLprh?&9eXf?yf z(r~fe(=EL3-n#l^w^fy(Lvrr9^Oub-BUo;9>j0zt@ zjX`7lIGUO?5qUrn5u%PzMaPbl^(2K@PS{_!9nc_@m&faI{jQ?b1lF6*K z{{MYu@4fcgXG}e4;Yl3AW7v%y*n<18h-F;I0_JfBXYo&eO&pR?;0Qjz64nxI5hrnY zJ>JmJ!clyaNW7a}#w!>fw163WRWte9?OVJs2=aI17*+=?ptM!YVWKVp58>jF$lq?~ zF_|l13RfEvP}=vHP8BeX-x?NB+OODKRlvhy1ezw_Zr4=!Yfa$G5g^^kE{H{@C*BzW zvYXjlF99=uhPRBS+A5yyCZHvD&8A8AV;6PV*^iC@xhnQ@NqlVmv%n?n>7*_ZKZ+9K zFWiMku)W6km&LNXT7GdvJ)^UXH$^$#36J9~tkjfmLydK+hJYVqXV38qJcv(f$oYO5 zuqFLGP}(WgOXwC(XXd?G<~@)Z=%WMy?Lu;&$kT;?I8vr!1+Pj!V*V{w#XmAQ94bVm znu>RECBq-S!|@FNDfmMAqwKZ{RmHvx4rhrDM2hndH3=a0tDh2iTrF^KV&a7?+8eQ! z5pQdOdlH?O6aBhjDba6Bf!`CIw2|xK|Gw70*eh;mnkK)7Ut}~iro;#| zDd4*9n`hsc)Z837hX-;6l$a2!)-dm}XH}TQRq%|sHyfmY3!=3;P>hQUj=FD^=JAqE zO?KizpuqE@y?!&1_zk?b9w+%No3Y+M=?mj{LNuqRMCW3MXv}RBBA3M7_=0%J<&0>d cX20)r3kQ(psKa`k;Q#;t07*qoM6N<$f|HA| zV@@~+RI$#}#W95Ax^15|*C7W6R(40vOI|L{eF`fi{2#7ApZI9~cM-w8hrTt&95~l2 zcI}q7-uXl4OM-cLCdJsjykb51j;E8=*PjL(gf=PKJ88$+a+qD+9QFG``4fRDM$wCn z8f24iXs`yYP4JS|Vs5D4C~)hvUUYSubo=}wHxp|M&-~g~A-Z`JzwiT{u3F+6QIe8a zl4_M)lnSI6j0_Adbq&mP4a`G~46O{!tPD-H4UDV|3<{3yE&*!LL+HrOPsvQH#I1vI VCi97jZt7eN44$rjF6*2UngAm9kA46E delta 398 zcmV;90dfA|1Hc2287&3?002AIl}Z2r00eVFNmK|32nc)#WQYI&010qNS#tmY1nd9+ z1ndEdZvAqTuK_220X<1XK~yM_g_FH%!!Q(uKitLk*sdNL($VkJ;=GIV<2}#PG+neC z3~gyTc#Acev?P!Rh?mpF0wuWVg^SQ9&gGsf3C<$`Ccql_2D*M-_dMW_cmOtluH+{$ zz7&pu!#_fo2fx4#@Z}EUI95>kVO3R-37qW?b@~_P18Yfnx?dE>!Txm?*cTN&8~XR^W5jp08b7?QKYgg z2d7<@rNS^(^u>?#_x0gm7>1for)ru;r_)K>?N)i7Ukcyxp6UqL4^4R>_rU$-Oh$dh sYr?l7p^KoO!3x*`r+!`a9?yQ&FVqJ2R$xkdpa1{>07*qoM6N<$g3npD=>Px# diff --git a/img/Cours_de_soutien_specifique.png b/img/Cours_de_soutien_specifique.png index e2d7ce0029c876aea02fe64b7bc121b09f657034..019600c6242612b8e752c44de3e71ca79cc435c6 100644 GIT binary patch delta 1002 zcmeC;T*@&)GKc{PtV6En0x6bsM_)$E)e-c@Ne1&9>AYTTCDm4a%h86~fUqGRT z7Yq!g1`G_Z5*Qe)W-u^_7tGleXakgBO7eDhVff$Pe`fzgLy3C!5>H=O_Q&jE{08c; z+%8uE6@2z|aSZV|K6Tn@f8jup_WhDR(JYm-ek^Ke61mdKpOWabsNuk&sqb6e#N7@E z{AUw2IWm>I(^TykujqxP((;WOStd-6{0th!u824*26<>)kP*K;?cPi7^RLdmFW+zd z{oa{5#U=-3g8#<5-8HW7o-{N5%?g_^k;lqe6}PlQ?iUu{F>!TuJNI&9_p9Y?!b6lv}mLFfE9l)V6W*X*Q!pj3(Y)8EhBaTm&q+ z10MLdo_Wt;q2ILQGDFNtj){5=CjAPz3`R!@f0XQ~9| zizaxzXSSFn|GC>|fB(c!s~CTMRjhB2+FY%ho4qyd`^+m+4F`GeGiv$XYZPplAN}u% z<|oGnLoWuKSIgvEpNp*i#p0k@$#8mAs6=G=)#(go$&5M6R&R8hz`rVyaZO=ym#UFg z7%#8Gd6sEmA?f863-ZIiI56B;lFnQa`lMA%DkiX0-(lN6?g#Bzxx3R1e#@`=CE-xt z8OLXkVs+;0%fpe^l%9uAw&8j3z|i4wm7U?lss{B6hMeNpifL;Z@|N%%*eQ2}GeGeK zZ^NgAETtX%3w$RO$~sAERhBTnc-(ZtlcD-l$;Jqtf+&`Wio6RK`rsSiMW7$3vLmCFkW&n|m2dPD%+` z;o1w?SJDkj~kdxR7+eVN>UO_QmvAUQh^kMk%6J5 zu7SC(kx_`Dsg;R^m9eF^fsvJgL43mr4-^f#`6-!cmAEzN-7WY6)F276VWOWr7XyQ* LtDnm{r-UW|U9gwq delta 1118 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 Hu0mjfv9>-J delta 1614 zcmV-U2C@0k3ib?;87&3?00168h_L_w00eVFNmK|32nc)#WQYI&010qNS#tmY4$%Mr z4$%Seg?lHHAO$CX1@lQnK~!jg&6->%f1Vr()U@W}G&AaqljDOXVS-2~q$s{s zno~_Ag&1g;$4JvIubCA=LJ$>&nbd={P6egd{46EWtP54;bI#1uBpa}DT3Rx~ljC9Gc$YzH1L&^8O40J?!* z;4JWOo;ESxz73d*OhzVxM-G{!XMnzh^2I_2&`)?Khk(7nTHxjc{B8l-fqlT$2)-AA z2U3z9fC<2VTM->y23|&Hxm+{=uK)uP{p`%kP!=Wv2P2qw0@I7Mt3tNWa^SxFvmBTW zj4#seR%BacU4NegHUP8WVK_%pNV5Yt*g@jd|ZO?g`Pdg z*3zg2j=Oqq#vMevYuF1+b9Gh$=OTo;f@rW!z#^aynZc@jc@gjgqN$>`Umvj2^;Lry zO|p-J8r(+2iw@`?c?Km0_7d-xR{33QU@Kq zQ_;GEk2A5OU#l9lU=_gD3JD&C7gfJmtUL1{R^}#vN7aXGSXW$cxho{I6Xl`?Yc#hw znm*I(GT4ah1hS+7wEF8pw$@nTJmT*KSm|ip>iy0PFh_kjsmfJ|OA$ab9V;ACSV!hnWidKzvQ62%&&DsHL zR}Gr6PUE(Uif-`|)@jtKs1B^mjR8StDfT&rU5Ykp(4P`~66AoR?^iVKs+cW*bQK9+ z0xZFf-bZYefR9KQD_SEGYDaB3nz4Ishhyv`wvDNaejQJ`zI;Ubnxc&mk%QL44x;uQ zvO;~1!J1UX7u=6cKAgoS2d5+VEdl+*C?mUGV#lHqt7(KOSL;A}#^ycpR+`-#48 zJBwThY19(FHI98gce;kh3EPi)!a3V=o?V0|td8)t!W(f10TQokLzqK<{2A|!f+Wul zQu;;Dr&v1?U^WtZ>-q;sc+mqAn;dbB`YF7uEx>cYS4irpknmTKKOQy{zOo3=jy)4O z;9KNQvm{JJX2A>7iOab zfP?@5`Tzg`fam}Kbua(`>RI+y?e7jT@qQ9J+u00Lr5M??VshmXv^kuey52XskI zMF-;t77s8d>PFLg000A8NklwXCsIB6Al`^67}%J{~G^>oe=xJt=Oab+zvQQ@y%v zNThqCMzF2;6pYm8s96~q>aU!J0HlAbC5M(CZ;lR%3`U!dSA?u+O~Q-B7MW7XnIGzh ze?MJp3gt035}RklCtv;RSs(d(#a!q4F%{`IYG}2;B*5ak%{mDM*#ba+)(siL8Z!ad z?jV-{$a^G1+QZQRG+0P?EtFo{-Ig;V48(K*W&DK#kWAYXK-05-fj>!S8v>9CmNVE7 zjMQ^orCH!7rWRP<7l2%Snz3+}Rr!%h+j|EvU5@~?+R<5+ULw5Lc3S}=`dok(C*xSQ z2iZT-c3S{S=>$mcaSqaT_h4S>v_)?QKo?RBa7t;VYigZMe;nZ?z-&Pd158gU%-fX~ zP^e6ANfrSd6(pK}2Ihpa?N!~9;)!M3ZYI>=MS!$UL1YcUgudY>Oe`N@y$B-DHGrMN zAvFN{D`WH-t$R5&Q4c_k7|6FgfYAL^#Jv!}m>v@`hi6U-=3Wkfc3mt)b^#C?^4sc- zo~RWE8K^M!VMiCI+qz!kOU(^0I@zlNJttz^DHQ*M`-I z+}bvt0001AC3HntbYx+4WjbSWWnpw>05UK!IV~_ZEiy7xF*Q0gI65;qD=;!TFfd<$ z$VdPH03~!qSaf7zbY(hiZ)9m^c>ppnF*z+TH!U(UR53L=G&njlIV&(SIxsLU-Ej1g QMkfjY07*qoM6N<$g5jdskN^Mx delta 1268 zcmVgYs}`_)s3=L*ngS1!w$H_x zhtqlI&YXMSy!TJeX6Br8|7Y&Ux%b>@qB!&b>w!L?7gzy*EC-eVW#BY02^VC_e$)fGZnIU9cAT0GKrpwaP586S%$+0dxX8fVlz#(BxyFt6o72 z08;^^&c@xPC)z^B0Dzy_cjSdj3uAbz$n*4Z1|kyOo~t8fI@e9GwF0E{b&q`jG^xad_40^(b;e=7oia!iGEx-k-XVVce`l4BmU zg=i`QeooI|bzthk5pdhl-S$Au2`^6U9cr&j5E)FTj(L)f%u5N}bv z0%c*V;^RP4;Ymf|5YX%y%qrvy=LIlH88nF@J-AAgQ#3Z1b?8@pb4cDY;bp}^ zrDqy3%m#2@%MJTDYC*47RAf6fT!m$z9erX~4k( e1WV;47ykhtUH6iA*K-B{0000B9AqX#q=l72ajXg3jb^u>}1;#q4c~V`QVulnMLxhDf{>;Bu{K% ze(t)YV&m^?%rgQPr1`nHoY5(`e}6_~!i8tA|NolBn9v`&s*hp%-!nNuKkMI}lnC+r zG2^mB``Ud>TPkO7ue$CGtP!S2>3aFD&K=O=X{PT{yLesY_-Ctxa3=n+>g$j?X@d6)Ni#c9+{3zpK-ecNV zBP<_Gdr{1up{0>_<7P%ySb1*m)kTrFR^Dsyp2xJ3b@od(zV7m<#@EqlM$c|#WB~)@ zTkd5UR=uuxv*TKiE@ossd)@Hdb@R0sRzK(L+&!DQMVO|PeP>z{%y4`A zLhpJTMxUCtU+X=WOfJ}|vZuSnWNLhmaK6{kB*))(POVy-@tc3H^XXcH&Uwwiw4++$ z8c~vxSdwa$T$Bo=7>o=IEp-jdb&ZTd3{9*|%&bgIv<-}`3=F=X^<0jkAvZrIGp!Os d1Fw~lIYdXH_#?)NZt7eN44$rjF6*2UngEo`KH2~P delta 833 zcmV-H1HSyc2JZ%t87&3?0077#fMfsw00eVFNmK|32nc)#WQYI&010qNS#tmY4$%Mr z4$%Seg?lHH3j-&A0_;gdK~!jg)tF6)jZqlKf0r2_V+{GarQ|avg$5OIfAw|mZc&wbySU!BE$ z?|J^u|9QLjeV_9{I-Cb4q?D_wYygIULs=V1N)7M^Rm>lMV0N~4lF^DPM6a9K+VN*5 z@DsC`L10amrhK`IS%_ZGfn0{ZoM{63i7#ddXvxl+8#$l@)BIEM`4ccHBY#fpz%<^4 zGX6+hKc1CATk3#LOw-#--z^3HMXvt^=4as1nv6n$xpr&s|KDm&)vuFVfe**fb29z~qD}i*&64!q%52QT@C`7ae zfK`FCW0C#W#lZTy z?Z13~hA@U}khRQqC3(QR_YDpgT^3=Hp zf%U#(alhRo$vrx8P~?A!YJZ$*5kg7&FJHz1AB7L+X=pvrEkuGp?=9IPeDnYfE&`{8 zz~jIMU6Iq!6Sjf!I2*G6@n47%bx4Nar}@+EE>x~bgeTGWv> zx_QJ5=Su9uvaLEGHojtnjZLXA4b^9bJn#XS5((@EKF0_aP&2MHD54I7Q5u0|kxPBbx`#rZM)W=YYd z?p6NZ;#+qg`75&PNM&z**nE-XekuNKmm+RPCF|PVk9yad*saWzo1@Ed=KG0f2A_8H z1^K-G^kbps<~4g-%l|NT`^1=~S^bs(I#jj9HKHUXu_Vlzt_ z7@Am_nphbaX&V?>85msEshx$QAvZrIGp&-rNCs7hv6ZO-M90ia2ZbiOX>c-ly85}S Ib4q9e0NsO%R5*>T)xk~zF%*U2kCJiatD%Dlk0d1c6v7MeAZ#HSiCf*P zYj820gp31poSx+D+CQhax3_ewz!TQk<2!nf6{c}bk{(dubi)-U*FXVt91~!Tk9dxI z|7g(z)b_j$D|;sEO8VHq3cL+~HGan(%rd|l&%$}s3@S-yYmrn}BXz^xXG-|f**^nx z3i!wf{0!J;1a1R18G#$>#y%K+!v|**Xqo|7w&N}bz?NO-ALHepu<@m$iqTVsMWx5H mE!1^gVTZ5i9bR4e0)7DzQp&$<_z-ab0000 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
-
?
+
@@ -26,8 +26,9 @@
diff --git a/special/recentchanges/Makefile b/special/recentchanges/Makefile new file mode 100644 index 0000000..1b03c31 --- /dev/null +++ b/special/recentchanges/Makefile @@ -0,0 +1,6 @@ + +all: dist/app.js + +dist/app.js: src/*.js + # node_modules/.bin/rollup src/index.js --file dist/index.js --format iife + node_modules/.bin/rollup -c diff --git a/special/recentchanges/dist/recentchanges.js b/special/recentchanges/dist/recentchanges.js new file mode 100644 index 0000000..92182dc --- /dev/null +++ b/special/recentchanges/dist/recentchanges.js @@ -0,0 +1,915 @@ +(function () { + 'use strict'; + + var xhtml = "http://www.w3.org/1999/xhtml"; + + var namespaces = { + svg: "http://www.w3.org/2000/svg", + xhtml: xhtml, + xlink: "http://www.w3.org/1999/xlink", + xml: "http://www.w3.org/XML/1998/namespace", + xmlns: "http://www.w3.org/2000/xmlns/" + }; + + function namespace(name) { + var prefix = name += "", i = prefix.indexOf(":"); + if (i >= 0 && (prefix = name.slice(0, i)) !== "xmlns") name = name.slice(i + 1); + return namespaces.hasOwnProperty(prefix) ? {space: namespaces[prefix], local: name} : name; + } + + function creatorInherit(name) { + return function() { + var document = this.ownerDocument, + uri = this.namespaceURI; + return uri === xhtml && document.documentElement.namespaceURI === xhtml + ? document.createElement(name) + : document.createElementNS(uri, name); + }; + } + + function creatorFixed(fullname) { + return function() { + return this.ownerDocument.createElementNS(fullname.space, fullname.local); + }; + } + + function creator(name) { + var fullname = namespace(name); + return (fullname.local + ? creatorFixed + : creatorInherit)(fullname); + } + + function none() {} + + function selector(selector) { + return selector == null ? none : function() { + return this.querySelector(selector); + }; + } + + function selection_select(select) { + if (typeof select !== "function") select = selector(select); + + for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) { + if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) { + if ("__data__" in node) subnode.__data__ = node.__data__; + subgroup[i] = subnode; + } + } + } + + return new Selection(subgroups, this._parents); + } + + function empty() { + return []; + } + + function selectorAll(selector) { + return selector == null ? empty : function() { + return this.querySelectorAll(selector); + }; + } + + function selection_selectAll(select) { + if (typeof select !== "function") select = selectorAll(select); + + for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) { + if (node = group[i]) { + subgroups.push(select.call(node, node.__data__, i, group)); + parents.push(node); + } + } + } + + return new Selection(subgroups, parents); + } + + function matcher(selector) { + return function() { + return this.matches(selector); + }; + } + + function selection_filter(match) { + if (typeof match !== "function") match = matcher(match); + + for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) { + if ((node = group[i]) && match.call(node, node.__data__, i, group)) { + subgroup.push(node); + } + } + } + + return new Selection(subgroups, this._parents); + } + + function sparse(update) { + return new Array(update.length); + } + + function selection_enter() { + return new Selection(this._enter || this._groups.map(sparse), this._parents); + } + + function EnterNode(parent, datum) { + this.ownerDocument = parent.ownerDocument; + this.namespaceURI = parent.namespaceURI; + this._next = null; + this._parent = parent; + this.__data__ = datum; + } + + EnterNode.prototype = { + constructor: EnterNode, + appendChild: function(child) { return this._parent.insertBefore(child, this._next); }, + insertBefore: function(child, next) { return this._parent.insertBefore(child, next); }, + querySelector: function(selector) { return this._parent.querySelector(selector); }, + querySelectorAll: function(selector) { return this._parent.querySelectorAll(selector); } + }; + + function constant(x) { + return function() { + return x; + }; + } + + var keyPrefix = "$"; // Protect against keys like “__proto__”. + + function bindIndex(parent, group, enter, update, exit, data) { + var i = 0, + node, + groupLength = group.length, + dataLength = data.length; + + // Put any non-null nodes that fit into update. + // Put any null nodes into enter. + // Put any remaining data into enter. + for (; i < dataLength; ++i) { + if (node = group[i]) { + node.__data__ = data[i]; + update[i] = node; + } else { + enter[i] = new EnterNode(parent, data[i]); + } + } + + // Put any non-null nodes that don’t fit into exit. + for (; i < groupLength; ++i) { + if (node = group[i]) { + exit[i] = node; + } + } + } + + function bindKey(parent, group, enter, update, exit, data, key) { + var i, + node, + nodeByKeyValue = {}, + groupLength = group.length, + dataLength = data.length, + keyValues = new Array(groupLength), + keyValue; + + // Compute the key for each node. + // If multiple nodes have the same key, the duplicates are added to exit. + for (i = 0; i < groupLength; ++i) { + if (node = group[i]) { + keyValues[i] = keyValue = keyPrefix + key.call(node, node.__data__, i, group); + if (keyValue in nodeByKeyValue) { + exit[i] = node; + } else { + nodeByKeyValue[keyValue] = node; + } + } + } + + // Compute the key for each datum. + // If there a node associated with this key, join and add it to update. + // If there is not (or the key is a duplicate), add it to enter. + for (i = 0; i < dataLength; ++i) { + keyValue = keyPrefix + key.call(parent, data[i], i, data); + if (node = nodeByKeyValue[keyValue]) { + update[i] = node; + node.__data__ = data[i]; + nodeByKeyValue[keyValue] = null; + } else { + enter[i] = new EnterNode(parent, data[i]); + } + } + + // Add any remaining nodes that were not bound to data to exit. + for (i = 0; i < groupLength; ++i) { + if ((node = group[i]) && (nodeByKeyValue[keyValues[i]] === node)) { + exit[i] = node; + } + } + } + + function selection_data(value, key) { + if (!value) { + data = new Array(this.size()), j = -1; + this.each(function(d) { data[++j] = d; }); + return data; + } + + var bind = key ? bindKey : bindIndex, + parents = this._parents, + groups = this._groups; + + if (typeof value !== "function") value = constant(value); + + for (var m = groups.length, update = new Array(m), enter = new Array(m), exit = new Array(m), j = 0; j < m; ++j) { + var parent = parents[j], + group = groups[j], + groupLength = group.length, + data = value.call(parent, parent && parent.__data__, j, parents), + dataLength = data.length, + enterGroup = enter[j] = new Array(dataLength), + updateGroup = update[j] = new Array(dataLength), + exitGroup = exit[j] = new Array(groupLength); + + bind(parent, group, enterGroup, updateGroup, exitGroup, data, key); + + // Now connect the enter nodes to their following update node, such that + // appendChild can insert the materialized enter node before this node, + // rather than at the end of the parent node. + for (var i0 = 0, i1 = 0, previous, next; i0 < dataLength; ++i0) { + if (previous = enterGroup[i0]) { + if (i0 >= i1) i1 = i0 + 1; + while (!(next = updateGroup[i1]) && ++i1 < dataLength); + previous._next = next || null; + } + } + } + + update = new Selection(update, parents); + update._enter = enter; + update._exit = exit; + return update; + } + + function selection_exit() { + return new Selection(this._exit || this._groups.map(sparse), this._parents); + } + + function selection_join(onenter, onupdate, onexit) { + var enter = this.enter(), update = this, exit = this.exit(); + enter = typeof onenter === "function" ? onenter(enter) : enter.append(onenter + ""); + if (onupdate != null) update = onupdate(update); + if (onexit == null) exit.remove(); else onexit(exit); + return enter && update ? enter.merge(update).order() : update; + } + + function selection_merge(selection) { + + for (var groups0 = this._groups, groups1 = selection._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) { + for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) { + if (node = group0[i] || group1[i]) { + merge[i] = node; + } + } + } + + for (; j < m0; ++j) { + merges[j] = groups0[j]; + } + + return new Selection(merges, this._parents); + } + + function selection_order() { + + for (var groups = this._groups, j = -1, m = groups.length; ++j < m;) { + for (var group = groups[j], i = group.length - 1, next = group[i], node; --i >= 0;) { + if (node = group[i]) { + if (next && node.compareDocumentPosition(next) ^ 4) next.parentNode.insertBefore(node, next); + next = node; + } + } + } + + return this; + } + + function selection_sort(compare) { + if (!compare) compare = ascending; + + function compareNode(a, b) { + return a && b ? compare(a.__data__, b.__data__) : !a - !b; + } + + for (var groups = this._groups, m = groups.length, sortgroups = new Array(m), j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, sortgroup = sortgroups[j] = new Array(n), node, i = 0; i < n; ++i) { + if (node = group[i]) { + sortgroup[i] = node; + } + } + sortgroup.sort(compareNode); + } + + return new Selection(sortgroups, this._parents).order(); + } + + function ascending(a, b) { + return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN; + } + + function selection_call() { + var callback = arguments[0]; + arguments[0] = this; + callback.apply(null, arguments); + return this; + } + + function selection_nodes() { + var nodes = new Array(this.size()), i = -1; + this.each(function() { nodes[++i] = this; }); + return nodes; + } + + function selection_node() { + + for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) { + for (var group = groups[j], i = 0, n = group.length; i < n; ++i) { + var node = group[i]; + if (node) return node; + } + } + + return null; + } + + function selection_size() { + var size = 0; + this.each(function() { ++size; }); + return size; + } + + function selection_empty() { + return !this.node(); + } + + function selection_each(callback) { + + for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) { + for (var group = groups[j], i = 0, n = group.length, node; i < n; ++i) { + if (node = group[i]) callback.call(node, node.__data__, i, group); + } + } + + return this; + } + + function attrRemove(name) { + return function() { + this.removeAttribute(name); + }; + } + + function attrRemoveNS(fullname) { + return function() { + this.removeAttributeNS(fullname.space, fullname.local); + }; + } + + function attrConstant(name, value) { + return function() { + this.setAttribute(name, value); + }; + } + + function attrConstantNS(fullname, value) { + return function() { + this.setAttributeNS(fullname.space, fullname.local, value); + }; + } + + function attrFunction(name, value) { + return function() { + var v = value.apply(this, arguments); + if (v == null) this.removeAttribute(name); + else this.setAttribute(name, v); + }; + } + + function attrFunctionNS(fullname, value) { + return function() { + var v = value.apply(this, arguments); + if (v == null) this.removeAttributeNS(fullname.space, fullname.local); + else this.setAttributeNS(fullname.space, fullname.local, v); + }; + } + + function selection_attr(name, value) { + var fullname = namespace(name); + + if (arguments.length < 2) { + var node = this.node(); + return fullname.local + ? node.getAttributeNS(fullname.space, fullname.local) + : node.getAttribute(fullname); + } + + return this.each((value == null + ? (fullname.local ? attrRemoveNS : attrRemove) : (typeof value === "function" + ? (fullname.local ? attrFunctionNS : attrFunction) + : (fullname.local ? attrConstantNS : attrConstant)))(fullname, value)); + } + + function defaultView(node) { + return (node.ownerDocument && node.ownerDocument.defaultView) // node is a Node + || (node.document && node) // node is a Window + || node.defaultView; // node is a Document + } + + function styleRemove(name) { + return function() { + this.style.removeProperty(name); + }; + } + + function styleConstant(name, value, priority) { + return function() { + this.style.setProperty(name, value, priority); + }; + } + + function styleFunction(name, value, priority) { + return function() { + var v = value.apply(this, arguments); + if (v == null) this.style.removeProperty(name); + else this.style.setProperty(name, v, priority); + }; + } + + function selection_style(name, value, priority) { + return arguments.length > 1 + ? this.each((value == null + ? styleRemove : typeof value === "function" + ? styleFunction + : styleConstant)(name, value, priority == null ? "" : priority)) + : styleValue(this.node(), name); + } + + function styleValue(node, name) { + return node.style.getPropertyValue(name) + || defaultView(node).getComputedStyle(node, null).getPropertyValue(name); + } + + function propertyRemove(name) { + return function() { + delete this[name]; + }; + } + + function propertyConstant(name, value) { + return function() { + this[name] = value; + }; + } + + function propertyFunction(name, value) { + return function() { + var v = value.apply(this, arguments); + if (v == null) delete this[name]; + else this[name] = v; + }; + } + + function selection_property(name, value) { + return arguments.length > 1 + ? this.each((value == null + ? propertyRemove : typeof value === "function" + ? propertyFunction + : propertyConstant)(name, value)) + : this.node()[name]; + } + + function classArray(string) { + return string.trim().split(/^|\s+/); + } + + function classList(node) { + return node.classList || new ClassList(node); + } + + function ClassList(node) { + this._node = node; + this._names = classArray(node.getAttribute("class") || ""); + } + + ClassList.prototype = { + add: function(name) { + var i = this._names.indexOf(name); + if (i < 0) { + this._names.push(name); + this._node.setAttribute("class", this._names.join(" ")); + } + }, + remove: function(name) { + var i = this._names.indexOf(name); + if (i >= 0) { + this._names.splice(i, 1); + this._node.setAttribute("class", this._names.join(" ")); + } + }, + contains: function(name) { + return this._names.indexOf(name) >= 0; + } + }; + + function classedAdd(node, names) { + var list = classList(node), i = -1, n = names.length; + while (++i < n) list.add(names[i]); + } + + function classedRemove(node, names) { + var list = classList(node), i = -1, n = names.length; + while (++i < n) list.remove(names[i]); + } + + function classedTrue(names) { + return function() { + classedAdd(this, names); + }; + } + + function classedFalse(names) { + return function() { + classedRemove(this, names); + }; + } + + function classedFunction(names, value) { + return function() { + (value.apply(this, arguments) ? classedAdd : classedRemove)(this, names); + }; + } + + function selection_classed(name, value) { + var names = classArray(name + ""); + + if (arguments.length < 2) { + var list = classList(this.node()), i = -1, n = names.length; + while (++i < n) if (!list.contains(names[i])) return false; + return true; + } + + return this.each((typeof value === "function" + ? classedFunction : value + ? classedTrue + : classedFalse)(names, value)); + } + + function textRemove() { + this.textContent = ""; + } + + function textConstant(value) { + return function() { + this.textContent = value; + }; + } + + function textFunction(value) { + return function() { + var v = value.apply(this, arguments); + this.textContent = v == null ? "" : v; + }; + } + + function selection_text(value) { + return arguments.length + ? this.each(value == null + ? textRemove : (typeof value === "function" + ? textFunction + : textConstant)(value)) + : this.node().textContent; + } + + function htmlRemove() { + this.innerHTML = ""; + } + + function htmlConstant(value) { + return function() { + this.innerHTML = value; + }; + } + + function htmlFunction(value) { + return function() { + var v = value.apply(this, arguments); + this.innerHTML = v == null ? "" : v; + }; + } + + function selection_html(value) { + return arguments.length + ? this.each(value == null + ? htmlRemove : (typeof value === "function" + ? htmlFunction + : htmlConstant)(value)) + : this.node().innerHTML; + } + + function raise() { + if (this.nextSibling) this.parentNode.appendChild(this); + } + + function selection_raise() { + return this.each(raise); + } + + function lower() { + if (this.previousSibling) this.parentNode.insertBefore(this, this.parentNode.firstChild); + } + + function selection_lower() { + return this.each(lower); + } + + function selection_append(name) { + var create = typeof name === "function" ? name : creator(name); + return this.select(function() { + return this.appendChild(create.apply(this, arguments)); + }); + } + + function constantNull() { + return null; + } + + function selection_insert(name, before) { + var create = typeof name === "function" ? name : creator(name), + select = before == null ? constantNull : typeof before === "function" ? before : selector(before); + return this.select(function() { + return this.insertBefore(create.apply(this, arguments), select.apply(this, arguments) || null); + }); + } + + function remove() { + var parent = this.parentNode; + if (parent) parent.removeChild(this); + } + + function selection_remove() { + return this.each(remove); + } + + function selection_cloneShallow() { + return this.parentNode.insertBefore(this.cloneNode(false), this.nextSibling); + } + + function selection_cloneDeep() { + return this.parentNode.insertBefore(this.cloneNode(true), this.nextSibling); + } + + function selection_clone(deep) { + return this.select(deep ? selection_cloneDeep : selection_cloneShallow); + } + + function selection_datum(value) { + return arguments.length + ? this.property("__data__", value) + : this.node().__data__; + } + + var filterEvents = {}; + + if (typeof document !== "undefined") { + var element = document.documentElement; + if (!("onmouseenter" in element)) { + filterEvents = {mouseenter: "mouseover", mouseleave: "mouseout"}; + } + } + + function filterContextListener(listener, index, group) { + listener = contextListener(listener, index, group); + return function(event) { + var related = event.relatedTarget; + if (!related || (related !== this && !(related.compareDocumentPosition(this) & 8))) { + listener.call(this, event); + } + }; + } + + function contextListener(listener, index, group) { + return function(event1) { + try { + listener.call(this, this.__data__, index, group); + } finally { + } + }; + } + + function parseTypenames(typenames) { + return typenames.trim().split(/^|\s+/).map(function(t) { + var name = "", i = t.indexOf("."); + if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i); + return {type: t, name: name}; + }); + } + + function onRemove(typename) { + return function() { + var on = this.__on; + if (!on) return; + for (var j = 0, i = -1, m = on.length, o; j < m; ++j) { + if (o = on[j], (!typename.type || o.type === typename.type) && o.name === typename.name) { + this.removeEventListener(o.type, o.listener, o.capture); + } else { + on[++i] = o; + } + } + if (++i) on.length = i; + else delete this.__on; + }; + } + + function onAdd(typename, value, capture) { + var wrap = filterEvents.hasOwnProperty(typename.type) ? filterContextListener : contextListener; + return function(d, i, group) { + var on = this.__on, o, listener = wrap(value, i, group); + if (on) for (var j = 0, m = on.length; j < m; ++j) { + if ((o = on[j]).type === typename.type && o.name === typename.name) { + this.removeEventListener(o.type, o.listener, o.capture); + this.addEventListener(o.type, o.listener = listener, o.capture = capture); + o.value = value; + return; + } + } + this.addEventListener(typename.type, listener, capture); + o = {type: typename.type, name: typename.name, value: value, listener: listener, capture: capture}; + if (!on) this.__on = [o]; + else on.push(o); + }; + } + + function selection_on(typename, value, capture) { + var typenames = parseTypenames(typename + ""), i, n = typenames.length, t; + + if (arguments.length < 2) { + var on = this.node().__on; + if (on) for (var j = 0, m = on.length, o; j < m; ++j) { + for (i = 0, o = on[j]; i < n; ++i) { + if ((t = typenames[i]).type === o.type && t.name === o.name) { + return o.value; + } + } + } + return; + } + + on = value ? onAdd : onRemove; + if (capture == null) capture = false; + for (i = 0; i < n; ++i) this.each(on(typenames[i], value, capture)); + return this; + } + + function dispatchEvent(node, type, params) { + var window = defaultView(node), + event = window.CustomEvent; + + if (typeof event === "function") { + event = new event(type, params); + } else { + event = window.document.createEvent("Event"); + if (params) event.initEvent(type, params.bubbles, params.cancelable), event.detail = params.detail; + else event.initEvent(type, false, false); + } + + node.dispatchEvent(event); + } + + function dispatchConstant(type, params) { + return function() { + return dispatchEvent(this, type, params); + }; + } + + function dispatchFunction(type, params) { + return function() { + return dispatchEvent(this, type, params.apply(this, arguments)); + }; + } + + function selection_dispatch(type, params) { + return this.each((typeof params === "function" + ? dispatchFunction + : dispatchConstant)(type, params)); + } + + var root = [null]; + + function Selection(groups, parents) { + this._groups = groups; + this._parents = parents; + } + + function selection() { + return new Selection([[document.documentElement]], root); + } + + Selection.prototype = selection.prototype = { + constructor: Selection, + select: selection_select, + selectAll: selection_selectAll, + filter: selection_filter, + data: selection_data, + enter: selection_enter, + exit: selection_exit, + join: selection_join, + merge: selection_merge, + order: selection_order, + sort: selection_sort, + call: selection_call, + nodes: selection_nodes, + node: selection_node, + size: selection_size, + empty: selection_empty, + each: selection_each, + attr: selection_attr, + style: selection_style, + property: selection_property, + classed: selection_classed, + text: selection_text, + html: selection_html, + raise: selection_raise, + lower: selection_lower, + append: selection_append, + insert: selection_insert, + remove: selection_remove, + clone: selection_clone, + datum: selection_datum, + on: selection_on, + dispatch: selection_dispatch + }; + + function select(selector) { + return typeof selector === "string" + ? new Selection([[document.querySelector(selector)]], [document.documentElement]) + : new Selection([[selector]], root); + } + + /* + Uses the Mediawiki API to display a list of recent images and a link to + the page where the image has been used/placed. + + Makes use of the following API calls: + + * https://www.mediawiki.org/wiki/API:Allimages + * https://www.mediawiki.org/wiki/API:Imageinfo + * https://www.mediawiki.org/wiki/API:Imageusage + */ + var PAGE_COUNT = 25; /* how many edits to show per load*/ + var main = select("#content"), + baseurl = "/mw/api.php?action=query&list=recentchanges&rclimit=25&rcnamespace=0&rctoponly=1&format=json&formatversion=2&aisort=timestamp&aidir=older&aiprop=timestamp|user|url|mime|size", + url = baseurl; + + async function get_json (url) { + var resp = await fetch(url); + return await resp.json(); + } + + function url_for_title (title) { + return "/w/"+encodeURI(title.replace(/ /g, "_")); + } + + async function load () { + let count = 0; + while (count < PAGE_COUNT) { + // console.log("starting loop", "count", count, "url", url); + let data = await get_json(url), + recentchanges = data.query.recentchanges; + console.log("recentchanges", recentchanges); + let items = main.selectAll("div.edit") + .data(recentchanges, d=>d.title) + .enter() + .append("div") + .attr("class", "edit") + .append("a") + .attr("href", d=>url_for_title(d.title)) + .attr("target", "wikiframe") + .text(d=>d.title); + + if (data.continue) { + url = baseurl+"&rccontinue="+data.continue.rccontinue; + } else { + return; + } + count += recentchanges.length; + } + } + document.addEventListener("DOMContentLoaded", load); + document.querySelector("a#more").addEventListener("click", function (e) { + e.preventDefault(); + load(); + }); + +}()); diff --git a/special/recentchanges/index.html b/special/recentchanges/index.html new file mode 100644 index 0000000..4be4d62 --- /dev/null +++ b/special/recentchanges/index.html @@ -0,0 +1,53 @@ + + + +erg: modifications récentes + + + + + +

Modifications récentes

+
+ + + + diff --git a/special/recentchanges/package.json b/special/recentchanges/package.json new file mode 100644 index 0000000..012e95d --- /dev/null +++ b/special/recentchanges/package.json @@ -0,0 +1,16 @@ +{ + "name": "recentfiles", + "version": "1.0.0", + "description": "", + "main": "rollup.config.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "keywords": [], + "author": "", + "license": "ISC", + "dependencies": { + "d3-selection": "^1.4.0", + "rollup": "^1.17.0" + } +} diff --git a/special/recentchanges/rollup.config.js b/special/recentchanges/rollup.config.js new file mode 100644 index 0000000..81da768 --- /dev/null +++ b/special/recentchanges/rollup.config.js @@ -0,0 +1,17 @@ +// rollup.config.js +// https://github.com/rollup/rollup-plugin-commonjs +import commonjs from 'rollup-plugin-commonjs'; +import resolve from 'rollup-plugin-node-resolve'; + +export default [{ + input: 'src/recentchanges.js', + output: { + file: 'dist/recentchanges.js', + format: 'iife', + name: 'app' + }, + plugins: [ + resolve(), + commonjs() + ] +}]; \ No newline at end of file diff --git a/special/recentchanges/src/recentchanges.js b/special/recentchanges/src/recentchanges.js new file mode 100644 index 0000000..37e59f3 --- /dev/null +++ b/special/recentchanges/src/recentchanges.js @@ -0,0 +1,55 @@ +import { selectAll, select } from 'd3-selection'; +/* +Uses the Mediawiki API to display a list of recent images and a link to +the page where the image has been used/placed. + +Makes use of the following API calls: + +* https://www.mediawiki.org/wiki/API:Allimages +* https://www.mediawiki.org/wiki/API:Imageinfo +* https://www.mediawiki.org/wiki/API:Imageusage +*/ +var PAGE_COUNT = 25; /* how many edits to show per load*/ +var main = select("#content"), + baseurl = "/mw/api.php?action=query&list=recentchanges&rclimit=25&rcnamespace=0&rctoponly=1&format=json&formatversion=2&aisort=timestamp&aidir=older&aiprop=timestamp|user|url|mime|size", + url = baseurl; + +async function get_json (url) { + var resp = await fetch(url); + return await resp.json(); +} + +function url_for_title (title) { + return "/w/"+encodeURI(title.replace(/ /g, "_")); +} + +async function load () { + let count = 0; + while (count < PAGE_COUNT) { + // console.log("starting loop", "count", count, "url", url); + let data = await get_json(url), + recentchanges = data.query.recentchanges; + console.log("recentchanges", recentchanges); + let items = main.selectAll("div.edit") + .data(recentchanges, d=>d.title) + .enter() + .append("div") + .attr("class", "edit") + .append("a") + .attr("href", d=>url_for_title(d.title)) + .attr("target", "wikiframe") + .text(d=>d.title); + + if (data.continue) { + url = baseurl+"&rccontinue="+data.continue.rccontinue; + } else { + return; + } + count += recentchanges.length; + } +} +document.addEventListener("DOMContentLoaded", load); +document.querySelector("a#more").addEventListener("click", function (e) { + e.preventDefault(); + load(); +}); \ No newline at end of file diff --git a/special/recentfiles/dist/recentfiles.js b/special/recentfiles/dist/recentfiles.js index 7100e62..e07971f 100644 --- a/special/recentfiles/dist/recentfiles.js +++ b/special/recentfiles/dist/recentfiles.js @@ -858,7 +858,6 @@ } /* - Uses the Mediawiki API to display a list of recent images and a link to the page where the image has been used/placed. @@ -867,9 +866,11 @@ * https://www.mediawiki.org/wiki/API:Allimages * https://www.mediawiki.org/wiki/API:Imageinfo * https://www.mediawiki.org/wiki/API:Imageusage - */ var NUM_FILES = 10; /* how many files to show */ + var main = select("#content"), + baseurl = "/mw/api.php?action=query&list=allimages&ailimit=1&format=json&formatversion=2&aisort=timestamp&aidir=older&aiprop=timestamp|user|url|mime|size", + url = baseurl; async function get_json (url) { var resp = await fetch(url); @@ -881,43 +882,29 @@ } async function load () { - var main = select("#content"), - baseurl = "/mw/api.php?action=query&list=allimages&ailimit=1&format=json&formatversion=2&aisort=timestamp&aidir=older&aiprop=timestamp|user|url|mime|size", - url = baseurl, - count = 0; + let count = 0; while (count < NUM_FILES) { - // console.log("starting loop", debugloopcount, "count", count, "url", url); - let resp = await fetch(url), - data = await resp.json(), + // console.log("starting loop", "count", count, "url", url); + let data = await get_json(url), allimages = data.query.allimages, useimages = []; + // console.log("got data", data.query.allimages.length); - // For each image: - // Use API:Imageinfo request/get the URL to a thumbnail image - // for (var i=0, l=allimages.length; id.imageinfo.thumburl && (d.imageusage.length > 0)); let items = main.selectAll("div.file") .data(useimages, d=>d.title) .enter() @@ -929,14 +916,16 @@ .append("img") .attr('src', d=>d.imageinfo.thumburl); - count += useimages.length; if (data.continue) { url = baseurl+"&aicontinue="+data.continue.aicontinue; } - // if (debugloopcount >= 5) break; + count += useimages.length; } - } document.addEventListener("DOMContentLoaded", load); + document.querySelector("a#more").addEventListener("click", function (e) { + e.preventDefault(); + load(); + }); }()); diff --git a/special/recentfiles/recentfiles.html b/special/recentfiles/index.html similarity index 71% rename from special/recentfiles/recentfiles.html rename to special/recentfiles/index.html index a78ec21..e883a63 100644 --- a/special/recentfiles/recentfiles.html +++ b/special/recentfiles/index.html @@ -18,10 +18,21 @@ div.file img { max-width: 100%; } + div#footer { + clear: both; + text-align: center; + } + a#more { + color: white; + text-decoration: none; + background: black; + padding: 5px; + }
+ diff --git a/special/recentfiles/src/recentfiles.js b/special/recentfiles/src/recentfiles.js index 843d5df..afd63f0 100644 --- a/special/recentfiles/src/recentfiles.js +++ b/special/recentfiles/src/recentfiles.js @@ -1,7 +1,5 @@ import { selectAll, select } from 'd3-selection'; - /* - Uses the Mediawiki API to display a list of recent images and a link to the page where the image has been used/placed. @@ -10,9 +8,11 @@ Makes use of the following API calls: * https://www.mediawiki.org/wiki/API:Allimages * https://www.mediawiki.org/wiki/API:Imageinfo * https://www.mediawiki.org/wiki/API:Imageusage - */ var NUM_FILES = 10; /* how many files to show */ +var main = select("#content"), + baseurl = "/mw/api.php?action=query&list=allimages&ailimit=1&format=json&formatversion=2&aisort=timestamp&aidir=older&aiprop=timestamp|user|url|mime|size", + url = baseurl; async function get_json (url) { var resp = await fetch(url); @@ -24,44 +24,29 @@ function url_for_title (title) { } async function load () { - var main = select("#content"), - baseurl = "/mw/api.php?action=query&list=allimages&ailimit=1&format=json&formatversion=2&aisort=timestamp&aidir=older&aiprop=timestamp|user|url|mime|size", - url = baseurl, - count = 0; - let debugloopcount = 0; + let count = 0; while (count < NUM_FILES) { - // console.log("starting loop", debugloopcount, "count", count, "url", url); - let resp = await fetch(url), - data = await resp.json(), + // console.log("starting loop", "count", count, "url", url); + let data = await get_json(url), allimages = data.query.allimages, useimages = []; + // console.log("got data", data.query.allimages.length); - // For each image: - // Use API:Imageinfo request/get the URL to a thumbnail image - // for (var i=0, l=allimages.length; id.imageinfo.thumburl && (d.imageusage.length > 0)); let items = main.selectAll("div.file") .data(useimages, d=>d.title) .enter() @@ -73,15 +58,14 @@ async function load () { .append("img") .attr('src', d=>d.imageinfo.thumburl); - count += useimages.length; if (data.continue) { url = baseurl+"&aicontinue="+data.continue.aicontinue; } - debugloopcount += 1; - // if (debugloopcount >= 5) break; + count += useimages.length; } - } document.addEventListener("DOMContentLoaded", load); - - +document.querySelector("a#more").addEventListener("click", function (e) { + e.preventDefault(); + load(); +}); \ No newline at end of file diff --git a/style.css b/style.css index 8de9d08..b420c04 100644 --- a/style.css +++ b/style.css @@ -146,7 +146,7 @@ use { /* Categories */ #cats .body { - /*display: none;*/ + display: none; } #cats .placeholder { @@ -160,7 +160,20 @@ use { } #cats.expanded .placeholder { - display: none; + display: block; +} +#cats.expanded .placeholder:hover { + color: var(--color-b); +} +#cats.expanded .placeholder:before { + content: "×"; + font-size: 17px; + cursor: pointer; +} +#cats .placeholder:before { + content: "?"; + font-size: 12px; + cursor: pointer; } #cats { @@ -203,6 +216,11 @@ use { color: black; text-decoration: none; } +#cats div.cat.highlight span.icon { + background-color: var(--color-b); + background-blend-mode: screen; +} +#cats div.cat a:hover, #cats div.cat.highlight a { color: var(--color-b); } diff --git a/symbols.svg b/symbols.svg index a2a52c0..e505b71 100644 --- a/symbols.svg +++ b/symbols.svg @@ -15,7 +15,7 @@ version="1.1" id="svg5507" inkscape:version="0.92.4 5da689c313, 2019-01-14" - sodipodi:docname="symbols.svg" + sodipodi:docname="symbols.new.svg" enable-background="new"> @@ -26,9 +26,9 @@ borderopacity="1.0" inkscape:pageopacity="0.0" inkscape:pageshadow="2" - inkscape:zoom="15.839192" - inkscape:cx="2.6413863" - inkscape:cy="122.46453" + inkscape:zoom="7.919596" + inkscape:cx="-11.795379" + inkscape:cy="127.59394" inkscape:document-units="mm" inkscape:current-layer="layer8" showgrid="false" @@ -52,7 +52,7 @@ inkscape:snap-smooth-nodes="true" inkscape:snap-center="true" inkscape:snap-object-midpoints="true" - showguides="true" + showguides="false" inkscape:guide-bbox="true"> @@ -97,7 +97,7 @@ + transform="matrix(0.40423298,0,0,0.40423298,35.516699,-0.22522322)">