From fb6278744c13a16cbc8a6d1a1cd6468ed212d6a2 Mon Sep 17 00:00:00 2001 From: Thomas Marstrander Date: Fri, 28 Aug 2020 10:30:06 +0200 Subject: [PATCH] Add content hub and a11y changes from Drupal git See Drupal 7 git for git history for these commits. --- fonts/h5p-core-26.eot | Bin 0 -> 24988 bytes fonts/h5p-core-26.svg | 112 +++++++++ fonts/h5p-core-26.ttf | Bin 0 -> 24808 bytes fonts/h5p-core-26.woff | Bin 0 -> 24884 bytes fonts/h5p-hub-publish.eot | Bin 0 -> 2712 bytes fonts/h5p-hub-publish.svg | 38 +++ fonts/h5p-hub-publish.ttf | Bin 0 -> 2548 bytes fonts/h5p-hub-publish.woff | Bin 0 -> 2624 bytes h5p-metadata.class.php | 5 + h5p.classes.php | 343 +++++++++++++++++++++++++++ js/h5p-hub-registration.js | 37 +++ js/h5p-hub-sharing.js | 54 +++++ styles/h5p-hub-registration.css | 369 +++++++++++++++++++++++++++++ styles/h5p-hub-sharing.css | 399 ++++++++++++++++++++++++++++++++ styles/h5p.css | 49 +++- 15 files changed, 1401 insertions(+), 5 deletions(-) create mode 100644 fonts/h5p-core-26.eot create mode 100644 fonts/h5p-core-26.svg create mode 100644 fonts/h5p-core-26.ttf create mode 100644 fonts/h5p-core-26.woff create mode 100644 fonts/h5p-hub-publish.eot create mode 100644 fonts/h5p-hub-publish.svg create mode 100644 fonts/h5p-hub-publish.ttf create mode 100644 fonts/h5p-hub-publish.woff create mode 100644 js/h5p-hub-registration.js create mode 100644 js/h5p-hub-sharing.js create mode 100644 styles/h5p-hub-registration.css create mode 100644 styles/h5p-hub-sharing.css diff --git a/fonts/h5p-core-26.eot b/fonts/h5p-core-26.eot new file mode 100644 index 0000000000000000000000000000000000000000..b6fdc50ed43c84747bbec57d79e014abaded6272 GIT binary patch literal 24988 zcmchA37lM2neRP!zg72E)vdL=s=C&$s@}VnuBz^&(+Rz0?KBA_gph!h!lG}z zUH9IzerNm6_kHI(-?{zJK0)~9UO`}jD4cyU;a)}|o6bKwoYK12$9`=7=-fC#hzeH< zb>UiJP`FGuDjXB8fU7DrkkBV=h3}wnLbyiQhZst`9U;erNDX;Qx#u?ELVRSM0ky=lRZcg0O2Z;u}{Y!2i$YHu&EMfA^J#ue)*2`K4L-0iW%? z=ICYn?wz_}LJ;;4{J%Q9@5XC|tL6LQ|0evIBl`|tQHX4R0e;-=_XxSieY59;8Z#)}vWo?ldAM_pAUyLP>C~B1!Ws!T!rFsD(HVO1 z(x}8F;@r2yQzZpixDnxT^oAsO5SIDbfuG&;bNQEd{PM0}zUP@0&x}9wo-+$)&JYm9 zUGcNKe=hv;ZHT-383A$cDrN{#Ls|B$IN&@hW}IhH4r4c=A8!@^gyIS|yiC1EG@XCr zaf0w$Nf2w)=LXYCT1iAj#=rEXaj|xWzmb1g8WuBHGbVm%{ER@+Vhs*T4_GF<^~`hP zP0|{)R|5w6g^&;v5<*(Y3nign7)DiUk$e-k_D82u;^z=?*iTew|# zpYUPfKM8*={H^dc;hVy@g&zvP6#hkcL3mO49iR-cd`{K!jp8bnkJOsA6suJm%?VZ? zDV8)JB8#OVwu+5VSgjh3rC21aYB8Rs8SybUO?@$58)C=+n2~U_R&b%mc-AgTiytBY z#Vw^-i`95ZfXNGM0cu7H)o8>HtNCoMShq(SwL%skZNSV{8we=oS-xJ=P`yGi23~;1}?oMo0{R1Wkr!? zpRRlHlI6!VOHnDQR?w}yy=K9;k8tcB75XeFc@?mF`{-b>+}0!9?MLIl7`37 zG%aL#0;*~$q7hS!IG~!k*Q+Rs<+0f>RKrjg-lgigDjr#QS0t5+h)3wTaNXqO_1&hO z$!0US#P?*g3)f_9GubH~?@S_m^W@~M?H{|=v;w+rtF>pte$8uovyn)~Jg91_s)jAa zvK3WMPouh)#+asRVV@a68<-^N zdiYo%s_)TFbPF2hktLb=zHX?_52*SquNvK{i1P!gJ@6>yEM&8`=~1&+PM$Y8={>J$ zTXxpx%i`tBx)<4=uJgJDPWG*%M8P>X{KSAnilj{t3JzD>I`MU+bmTz)mStdTe!oUh(>#ZA-l^8 z`12h((?oisBVdMg-LHw>q+(`dRrPy(K8&<&M%X7cO^pWBV5g>Qx}kRjfZe+O#8BG# zb!O#Ih9%NN&c}Q{Bh<-y&eOskPblE`_r()^{-`L5no^ZjyqnELuOBeAK}m);n@Oi1 z_W+lBbUk1jj2XJ#X$Rtl?vW(fYjnILoHR~&{6IF-(k=7_voWqKg^kje#ixaCF#q=p z9~J(y@C}TsJH>}Vb1*+wGd@^p<`R}Pb193|PSk$45@YyZF_WLQ$Wo-8sr~+6$;@18 zL$nS=CK>@k5%qaRKTF;$sv_pn2K18{78MEZfqm{fEMivWBa}cDhlWIzBB`IrgDXnO zcnp6>C^=#zQCgk{+5f0K;@?O73!n2xqkeJ5A9*FW_=%gTm<=czfWuUcf&KK1xFOCX ze?(ytQuD^N8YMmdvYB|h7h831CXttv(ikijnt=d>4U)D_ z3-83Vcu?pPvckY(y&`VCYE@o~dS%3|2FV4XHeae~qR<#F&ql)G$ZUDIvE1FaW5=66 zRjb`OtcVXr!fS`iXT{cshG(M@ab(8%eC^TN_aJzHTnq1#nD{6`L^is6iq!1hup(ekahcg0azSF$>j zo$pUxdgIjXl*j0;fJCwtlE{AH0D7!Z%%hf(SU6f~YN+38))*OPni6f)o8anNPOZc=HJoM? zRg%0sLK92KUog-FmShz)JE!LRSiW4WqaEcOg{bblZ-D)~%%lP`QLa|t zUBN1`LW2ZO4bP~mp%00Mkc8p>s5|%%bA!*{Xbe(D1qj$^E=6F{ARGTtDdVit&I2Ok zMpb~P%fc(mvLHKJgLkkaE3Cm!z z)gc?Ip%}6eP=K>=$c7?!ThUU~!dU5|40u-2r?7XYtb##MWl@(E&FHj@PM;hwkP+Y& z<}+0Owqo6Lc?E){E=x+ho-hKk8VtyJIT2Nj9Ll!pQAJZcMzq(b1GXvuS+p994=0#{ z64mY*z?#!#Sws>mutP>I-!6;6kgPIgU}pu>OV$j-vXl_2fO4#eCHs}9R6|FFEF=dM z#p|hE1Jn zgnXYiyp$K!^>sy`GJFbFt!*BX6wZ4k4&pM9d?*?Q!OMX>(xW&6f=G`>6(o=z6deo*gbX-=Qd3ELY~|F=kmsxp1CnbwJrzbG{==jwl1A*4% zYh-b#MR!+kP*j<-g9Fn`bUy2{gJsEjjd1!{Bbj=L*Ew+=vS1ek+1Yr1d8Iyez8VFzPSxepHqpWhq5@Xj#}p zET;7*^fOM>AeVt!QJvi=ce##+fw3#gr4P0bH0S{( ztUMqy!+GL+eq+|~U%v?xYYsPPfv@F!gX}X5F-XrhJAY;c0v6ruIm38@|ID`oOm)>nwoAdJjJrV=bUc)6k;Ar;3vFU7Bz#!>mH1}JB?6{UOKe!g%tg7QC6|=M zgSYGYgcjGqq2k(vPVck)>^?;3tK5iHaNd49QnwQ#561iB!Uk!j_+4;wXcn2viy)x6 zL>`RDNpK;f(4NeTe{jnYfvnQUNQ`x}C-roMSN0imIM`mSRN+pL9 z*-ckgau89GZq zl)@!G-A_PNN%VNU)nZ{NR0_qbojR>3ZNpn47^1lFWH6Bk+KD*&RAO0SulOVJYrE--jor2v52k>Ivqtq^R1i0%*GRw)cje=!&eD8#s#kQ;Sfsv~-LsnC-6gJyH| zC~mBJ4XdY1(jarQNX{1vV}&u=Jc^rP0q7knN-8>*r3Zb62g3Of+=k)n&xi~QYo8iT zd30SI=pWcIFfhQ-wN_smQ4Er0Jnsd5BN$Qr&U3W`HA#{5uovPH5pZLcUXZ>KjkmMl$n@){sVf9K%d5yh_}cXDN-c}WgSJ<8NM(;IIj z{CR&rW_z;PSse8qn3e2< z$ZJM)Jr+>B3Zf%vZ*;m3Z~|Taj*`#lv}H~9C4Ir9SM{oT#G*MT2=_rJ`(8fh!n9bU z2d%3?Er{l=q_Krc2ZWE-CXx{G-5>GI`XcxH!(soTlO6Ym-{*@&eD4eUXO^5qs}$%p z*Gg6K2hes8LS9^ljR%4BjHDO<5hQUEUXvltXb2**Mpzo<>b;z_HcXu`aF$em$+ z7KuekqO7wz9PTou&BADH!oidqb#_-Ga7!Q_3*8b(uy-EtWUY5ZFSf0BINSPclbynt z`8@BGJO?CEe#15pT~*q-Q$?>T&f8aN7HNErYhL-dBw4B{jeFI&&5i(62f^zIojl|* z``>N`os(?6^SBudn(P*<%hUe`RXPAr&JVu?ErN7$YNtdOtG#WdCIgbCUahJ}H4_D> z<8RYEUJvyXkXLxSWQw<7Uto}EQI%TE#bUl{d_y;R}T!l<-f{0+u0D@+KRgq_$}61af8T-_IPF^BZQgf9`h z&~gEDTI|SG57zT)v0eavwJ-}PN2=mi@`+FWt};7Y`CWBpraG4G_+2cUjp4EIT(;x4 z9odPQ>Tf9~6za&bPd@6iZQrB5VAy;am$-Je>O4(}S*AMcT-}k)cCapbIzRbymL<5M z5EbS8s4}}+%*6Ay&le2(eD)qV0C<@L{UT%E>)p~V;{Ady*g{R%g`JcM7PG-Cq^yLs zz71{?0)@mn51Mw6IH??^6c|-n{LqT0QIRCXfy^NqNr^V|#ZL$cs!><{hV%sHsp&hW zYHu7XiQD@dZyH&9=X9jFW3ad>pWjp*+)-RpU6tR`msu5!uFCXnF0QJsDQ4CdHCxTB z=!}nLJbq7pCKD)x*K}_z!DU&QnS5zu_sVEK&*@!=&-6G2W7J z5_^5y#OI)2S}E*6Yh1n8Ir^p6>Y!rh(2x?anr1BYI(#xm!qjr;ckEZoD++5TCU(aY ziTLh`iM7k!=Z%eR>*(z4*futHUd!EiA>1Q_LsMZ~Q$vFz%iZF0i3Guzomjmqfos>q z>RE!9NGu%d=meBC%OS1-^v({k8V*eZPHkv#Ivfgxrw4~>fH@rs6ODSe@LusS#a ziyojgGZ%#F<&jDq9=;Qhhl6g8$`Lr|cJ~XQafAC0r9u*D=kQ#DP!6{sP#o^1Qc zdC&ng7rF#+!$rDE>n=VGTmrd_#x~I(e5(cOl!(pl*jSmZ7ELP~yN!w69juu#jKOrO z&+w!<^{mW_>ng7cbaVvlj_6l19seH7TIOK(;p~uMiQgug*EeC#XdM9}giP${J`&Gn z<1Q_nt*}&Oz14}V9Z(rLJBU=WtS_!*hla9R+~<(>fhasB+#>ahPYIo%hVI@a$M#6A zJqMyO=)^P$Gah=cCTY3&)!RE%+mW9A+f6@mU*|@O zuNi8@I<_<#6GOed*|d0emCx@Grr_lEN(_a$-dn>=sBGWQKTcRtK4 z_U@Nva5JC&-b=Eyva^5LN$t>tezfB$>1ynI$FPS}7FG%CVZI^I7D;;)dy1Pf{-r>GR*u~^1)M|x=J?^`EB-RcRlN15p!l`zU z6lw>JwL!6)cp3oN(TaO#8&dl%CfbQf2Kf&{OuAGGV=fgjn`SYaNQ$INW3II46YUJe zphtybpSOn34-kj5e4$pRTBW^Njajw0lTCX|b|oU6l|?-0d|~wbt`14A7ubY1;+YPv z$gTXA*EGG~GW?cz(bY%k&L3qH^t^ba;C!J_r!0k$yBE_);qynGyR)OAStI0O#|m{- ziKiESY zC@;gGmDsjo4~}lxGJ2kD4yChIuY6vj9twvJS*W(cCA&9(xY)dMx$o1lNlG=U#7&|e##hcD|r@XO9xEjZ3o-fXLdt=U>#d=>l z$WBCh&4`_^RPt8f(qtHL!lAA-Kw+zK%b0UVZY(roM7-?!VqMl~?kg|pk8A!v^vH62 z_`lXYY#@2`sQXJCIr@LQvz+e|8np|6ZBAQu^I~?CV0~n8>mnv?n|7Xeo}Xp`=Y?rz zGke;3LHy8+^E|Wha9)^Uw)6Z9H~*4_-wJ;tY2r2DZx;$T3!eidLb@D~3=em)Oj14g zF)0K|b|qmihe%hZC5&@_uG$FlA^$<#b&(mlVwGmp<%Z|xbJMzzfb+Cb(rm2`QH+o3 z-~z(F+e?dqc+skatH!CY|LVntk+^>jCNKKjekFjd?$^Lj0Okr_(z9!{8_h&Tgo* zGSpid7~Ebc##P91%&TK{0nLoaBrIxj;ohCS;hY8G4j}-EJRZEQ{v>!)TfdP6Zz3A? zdhD_S%l;^ZM&Z@<7oZzz-miy863LOU7M3Z7%TB_Xr_BNBE!Yhi7xrMJ z-Ya}k_##FNLPIu^)v#BOIfXxPl=d!U)^5qE&DKsnxXf8wxeDa=LMTt$+wNb>(xJe6 zoHSM}j~NMs0KdVI_#vQ>$`kr4DyLalEFf8JQB5-XipRyb8`*(pD*sk zZk%etPD4p{YF!uayV!_WQpcu3LDrA&=z-n{26XMn*=dzUH}nl*Z8b6&3Bz{J^i?t# zt$4pF+SB_k4yry~_6@}IT~HeuM!GW`3TRqNnkZ&Jd4CKV@o>1%Q>`6oj+TonkY8i- zx?V`7hkC1({ey#9=SM#CAA%{fD-iAR9qP@bnB&~UZaux1%{w3WKo3$X_7^fen;MNd zr*_I$fMK5`*&9-CXI~rG-k(Z^BU|%#yW!BHZb-e&`H!n|{r)SD!X^mg+vn-$E(DQmL z;q&EG2eY0-I^n~$ut3ifE=+(+_`)d*Yc=7_$7DhJkT5F1;yT0`Mq5b{13Hnew{74_ zI7z5WXxEw(uGXee*IL$CgwurVgq0i?-Zkv;gV$7CE||ya++9tP;i^VLTxe+M)~#DF zsg)}i_w?kptA4|d$8G1SU?)@6T|=*(8S3xfkWR;ppeA{>n{<;g8~WG&R{RaqgKoUX zruf^KZi-<7x#bd8tCV;4^yFQbVr2V<^;f4;9#3~7p53l$ok8a*yR*~Aj`6O6nrQ+V z3c(^!%rrpVpQllB?4F1P2IJKP<&`W6JlI7CbgCIEtRV%9NM+} z&K_KM?%s9i(C*!L^z`=j+_8K2!mqNqz#~5HW!*anTfR4HWaXHw_5-TLjf%}b6lv4 zrJ)4Zo%Y895ts=WgR4dYzK&Q|(W7gfu>29lhGJ`L)&%^GLZN@{bl7>0lA%VX0i7G> z7x45XEW20Z7{jafE-8#&UawXjskizXq?=FCSDBI;JA_SAFPfHRR?HLx;I!A-N@U2jAUy1(>0_2zHq$mp@+mfyf#o8t--I*2#rW-k zg?<`V`OvwXYsd*4KFg4^aE|}nc=p|)tn)Xdcw#HFLu|Q6EH3w*9hD-x-+!fS3r%wV z3pxMg#8t*}BS_UTyW z6(8dFGqHt#MuMnVpky!a7XO^FScb7ojIrzC%rfW(8FRKQxvys(l%Rt-=Tjg>FH6Z5 z{tp3Q{tp1hzYQEuL9>A!7TW(qKfFa&X^vuR2w%OCytY3G*)^+QyPNn57t35qQ z#SpB?lchA1jp~3Tl zL5VEjAbjVYPtuuTfSxyo7inW@i_FMNBHWC)4@g730WGy z*7BH3H`IGHt4RBvD_8RND58r*G^rO!Q&g_dP5RNYyBpCC9i`o63eBRw$mXM5kw9Z# zntd^$yJ5i-elFWx$Yytsjp4Y_tz%=mv)RJge&=6JolWBYHUt{H)~s>g5JPqIA_Uy* z`fq`_^O5GuL)n$hb$92oyT%qicL=H3E;q{|W|&U_!qu)<+|qKiUcj|>Kb~ySy;tS8 z(yM6BLoJQ|%Lzk}QaDd-GezRBuKS|7x#N&dvd8Dz8LEZqxCteF3kjU|CQOYN7OWH}`q4d_% zzh1F*>k7$-=jqRc6N#|oqi0c7owq3g9sGU#VUiQZUC%8n1t9_g#Y#=T8u>z$`}D6? zY?Z#A2%Y{_D3J(Bp-{s4N5iiG0A+kX&j0}Myose-!1ysnlJ#8~ig?-o_K5y3kJ|sn z;DFYVJnewq2ZYQ^Mwc)|paVd!W@j)BC?E=fNfu=1gB-g3U> ze8Y7OT7JL9J^RLdk?01ni&1jpf_rqE>3yoZ2U+Gf@4R?^-pxKgfAP#sBTss|0+}HuT^fyStX9Ef zs$eq9-9(E%fIixXK5}Kpmq?DSZ5vX&@+o?*U)l$Ldp$8$@hz~}dPR?9)4{j{(G)Bl zM0y_J$NbK?p#gv6cwAVH&*WirOISWrMK?9%w&za!!q}+?&lHYM}qt3oh7m;F6th1vR7oYwr`9IITd|7i8Ou z-Hs+KS4*+8#elOHrrEP)jI(ID_YW}p6=8ILl6&9$%*=rlt^+eO z^8}?UmFfaSv`fbBa#H%b_m=%%cmbf%xSY9YQ)_1m>E&hIC`s!k(3%zr)SiVg5#|-Gpd?aLh8&k0#mO4(+gil*QQKy zrThBqPmyLnfFOR;UlKf1@u&;;!aF@pUIGUgX+@ctQ2;fh%uI(&@&1L60*cowZsjk+ zr9;?Df46iH7F=0j3K|?fOZ>#UBVhd%7`~S@@cOK~QAit$bt0*pxWWjQgk{e7DFfdO zDq*4ngS4=Uvm=CJE^)_(4Oj0H2Dvx|#FUOZH$-~0@Ta@$>;*j(Ih~F=yQArJlsy_v zJ9lE|0Y;=EPF^UHj@e3ecD9PsrJfG!S6GPCj*DbkD9GB3TVbVmK}s?}$JV zD}MJL0IZJ`7ACQYaX(7Q65xdi4!(mnU$B9rnqD&>>8{nfyK4;lGE$EAc4*%NHh@et zy%5Izy)l?7n%&WGx9Kre@R_P$N#BrC;GJY6k2Z3y*?zZHUT1Mn7J(Ao6~Lh;ue)6$ zeQ`v=QC6Sw@2_#+BMSD9KJU8Odh$5;IqQz$D5m;z@jby(ShscYM?BTPUyB31>WE_D zXovcr=@2zCa9~cy8`x*OF*A_$FI@9`DDEKtpw4ydBYzG1$Yenvu-0(m6nd7Erc2*MGmmM*sR#g5q4=IF%gW^-$-LzI)XFiy&3j;!Bs z;RPGkAIac?`vPpD^^cY-Ya`+3n@3{}Bj}NpU~pAm@9=PM@2X&M`_xQixWT?|cKH-d z)_oo$py>hAgCl9S#|)`T(C&{!%n~z#!NG7y_KBBA4G&Yi{@$L~jF0#B3>bb-FZ-tn zRHFme)@F0UpYn^AC(;*PUJ=)Ql^T!FkBqE%TWo0b%|KRvIyltVJ7EWd_C#;*@P_MR zk2a4+o$ug;G&c4aMjFQ2j5aT!4mMJ$^I*j&Zs_doy?k)cC=OwV)2jzlI#3@L_rdi; ztM~QNILg8hXuy*gM-x=Ahdz)JtMPM>M6+N90Z!01Di~%g@1Amm(X9w8376Xtc}TNE zyV-!ET#ni5oE{&(@nH|vr?4Z_l!wL3cV|DTD7z8$$?@SH9^-tLV!X)WL4@M`kMWD% z^01BOC|uVh`aX36hjx1U1zMT+vs%8es;;XIi04A4Vt@5$?$iypjX0Xuym)A=%9Ved!1IA^arUp7N{ z;R=~-C0^|awvtD{QitN5FY(koo{dv#??>HuHyMSvfI}wX1Fa1V)H&Dsj)#Hoc-;Mq z$JpKCvB%g&zj(|!1_#oJf_>&O>3Qik*v{`oHWD1bcEHr}d$-{5kbL{?^xT3o zZi*qj^>)&&=<-%FW_;^g>A4jr3RGRb{jCzEkR_pVd~yo#juSjgE);Ma1x&dCRN}%_ zTivt(&7p3EW2tT*Vw6)8q!GIG~2^!l@myu!OS9O^ltW zM!5#gi!If~?A+m&RpUiB`Kg!&Y>>$h=pzIR8Zoy95r_glRxgggT$$>MK_!c1N<%-y z(lAG3fU7}vkowTM72KDi{xw^u7Qb04YUK20M9z&;t46=z>EM1;Gw_cH6)Yh ziB>tTsxQ*^!jKwK_~Gylo&*ZE(wHrnWxPeyvA{E} zNMX0HQLUpMfIIH8okb+39(1*6C4R)0-0nGrc0WX@e87euvjNQnAP7EijL> z)1&xWH0&Chm#R33+3pD1^6-&NMj+hdU2YWI?lAWdME1qqJz1dMXTeu7W!AinO{9 z?P>$1vseJ?9;wzKc#bl~?PFfU#c6Y{c2gozlWb7hZw{ZI7)gP?M%?Nz`uV^t<~cj9 z8^=*<5dmln-9aY6V4l5;1aFAKuq;x@+yq}v!H0HW2LJOUfsGJ9*Tt}pim&zX4EQJytWY=@q;tU_C!Ie)YOr>h zf8vEFAy7yO;DF4SqI$9Uje;l=l6%LR9;PaQK|h`wUQNeJ0nki?i}pxn#Z7|2bMfr- zZ4eyf#*&Mw=hhYxydYW*P;van>yPbUMbyzQ7+FzIP;D6UBLq;<1a1t4(--idX(+nY zJyaylgaR^^5bMzSysxQf zSfU{v60}-IS^34QP5E$9!#NbHJg)=QU!(%S1Knao+2`@#Yf^Lwj~7QtndVhg>I@nf zw~r-oKO7q57(lR*h(?R@;IKNq0GVE{6F?Bz>N7snh*4x#xnVLjo|KXu$xY?*Rik59 zmCGB+LOhw=SWZo3F}%sn%^U=W=yr#y^AcfurGbxA8T{f76zvv^*1|LnAL>At1PW2K zUfLl}1Z}YMaw;|1-94E~4}-PaLA#uG{i$;BF6s|4%b!PR@OTG_+3b@0LGB#jNhX(q zUFSgeWEx;dW6V&TtErBY>-NyWCRvE1MLAOvKNR*HxZX)U^sV0c7vSpaIm zI~_PfPTo7Rn1e$WkFuZOcYF*9lL1h~$`Zzp znA|`X+VLXPBhyF1%2wyQq(IlaHt>Su8hVI^9WM>12pIvv6A0>#k?1wCo`qqdrr-=W zec=G;O#O{Q02^N@04Bl9VF6HS9D~Sln8*w@5k3_zDgrIQp+o>i1gAQPgd4R*ZD<<8 z?_O?VxOw&H1*HLXIkX2f3(#bQp=tD@*+e9Ss00;=JRAk7hSZIiMRbl8^NEU~IYiS^ zM^aJLH2^+)I&$hrO#r#Tk!4f`8Bi{)NvUN7o*IlBe*~P0Ujl(BsuaK67rcn(bKi|{ zt3{n+@&Ev*VROp?aHOU}P!@F--Ml(z09+VYYH_Pzsz$4>XcJ}SG>F2m3L`L75pMsA zPG@qV&tp_B=^NhU&fiVL<*UZVt}K@~CG8G1khSak`)_db@CHx=X@3)K=aq5;d5MyO z&e8A%53;Sp1Q%JXFNBI>oIaVF>dr5pVyUV8SyRsWrzQY1@h|yUpgdV}0}k^pZPH|* z9+vS<5}vRXOnJ!ZT#d z<)SR{YJgS5W{Z9!_@nIrM9!fuvWSZCO0}F!{1`_z8hZdCyg2&vWto;a=cs`^Kh=H_ z6qXrS6SFh#0FbBmRNnLIj zeJ24TQfoJ8aWN*2(h5kIen@Mqg%^KgMxgx_2Sl&)+I1akZjNCPRgcVS6z#g5uai@J zj{`mkA)^X;OLAHvEC%dcG`kN<(|TX=Cm#OG8Z=8K|t;kA2jS<|uZ!<3kfNZ4*C z89|nvzi$-SflN5Yre;Te00O3Om^qr~kX;b^c_h z2&1Y?oIkn6c@R#lW!rm%0h}ok+WIlB?xd|w`Vc1oNOzz9>G0Ilu#}{yBRD^u|2q5l zyaQNM!>4~TG&MCObq!CQ{t4@%i1Qs98`1%|bs^h(9PCDA>>9Ly;?FPe zdeYf;(%H@)KY332Ww!dVaL~cuLG}QDum|9grt#per3jRXNp$9<_zd=r(sULLb|0lY z4(5`ch6}tn_vN~%g{#Oyvmb-6VZlI0K)6^bK9dL!u|&}MWhe>P5be6M>%xhvRonP% z7-kCb@Ml8_O>2e{j6E7kBtyI5a*zw}L}-t60FqxKbQc2Sp}P!QqrUJ64+s}X2gQGa zzB$LgRN8<|)HKd-&G8eZ(1k!3>27CLY%J!maEVl~XR|mG^vSXaSs&Ap=@M3;kmL(k zdDd$XYU%Tu{HvM~`r0N=6SvHiHSw5pJx+zE*;_JYc{t--Z-$^Vd5akinGk`);?S$O7j{%Awn7PC#wGsL@2yiD9*-|M zzr4&D@VE&)0d~i-;APIG6oe-_DA)$+aq(%s4_=0K@dkukj*mGDG&h&`R-VpuEf1jc zZOi@ityaD>K?_7OY@wY9EXHsM`4wZD?F?ArNh8iaZ!qX(A24m(+~CBx=NWwMKyq~M z{v9F~3W=VcM6y&$_KuD9_Kc17oa?`GRe%2~y4g2va|L}YVTEZwv*ct?k{dAy|2;VOd z3g_TNzHm-2LC=UzTQWsFH$D%A z9L=8NC!VxCz9zll5$Y-aaJrnI@o!8d@MNE}flk9m=v z%yeFi7hzOoQjAH7@1^j2@1;=waE3lb!SoO>`!Gd*7|w-HZJ|*9cs^*2Q#c+!37V_u zgFUM#vhB(i;;RVUs(8UUy_7avNQ_gdc(6ZP%97&=d6qv}g0bXs#+E=3FA!MggFiBV z{IN^@uP4EyTWq}( ztv7`YEOWzu=2tC$JMGi(llud>sg6`$4L7yz5bi4OI_}-Lhj0($Cb)FlxTCnK?d`DE zo5c|J0PZ*9-i~`Ok`TWOLmnG|)x;)*JT5#T21Q5C$cN;Q%BPiw)QonQ_G|qv{b^%^ zahvg?SN1l%e`iL`N30R+L42y_ul#-f*ZF@K*b(@-eWCr&!5f1QhCUR2L*#=|A^O4C zg|Q!ZjC9=Fd12>w;#Vfj#2tzMk=&HLC3!0OY}eMV_jUa`wI?m7Z_A`IH)bBm-k$wo zZX|bi?veaR@0GnT^yz(#zRi8t_C3+RqW_x%R}Nl?`VzkFkne+K0bOlu;-1zcAp8wa zMP3Qqi*ist$Tlsv2u}C?mRmyj11+}<_X{nz0{4wAw+i=XTW$|_pt69APYM8@iVyO; zZiX+od0TD~pYQ*1%Pk@NgDtlV_rJH?3f#B0+$!8(Zn-@;JH7JC`n7|X9X)o%V72k` z{~=)Z=#lF(2d_AC#j$@~ literal 0 HcmV?d00001 diff --git a/fonts/h5p-core-26.svg b/fonts/h5p-core-26.svg new file mode 100644 index 0000000..ba2be6f --- /dev/null +++ b/fonts/h5p-core-26.svg @@ -0,0 +1,112 @@ + + + + + + +{ + "fontFamily": "h5p-core-26", + "description": "Font generated by IcoMoon.", + "majorVersion": 1, + "minorVersion": 1, + "copyright": "H5P", + "fontURL": "", + "version": "Version 1.1", + "fontId": "h5p-core-26", + "psName": "h5p-core-26", + "subFamily": "Regular", + "fullName": "h5p-core-26" +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/fonts/h5p-core-26.ttf b/fonts/h5p-core-26.ttf new file mode 100644 index 0000000000000000000000000000000000000000..3c08638677a9df82d03fd108d5f4b1277cb13971 GIT binary patch literal 24808 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 M-t{r~^~ literal 0 HcmV?d00001 diff --git a/fonts/h5p-core-26.woff b/fonts/h5p-core-26.woff new file mode 100644 index 0000000000000000000000000000000000000000..eb6df51d8f85fa20b90d1054488ffd562ab750dd GIT binary patch literal 24884 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 r2Bxh;Lgf!O>kzQ(G)W^RA_{9~V_P_0 z%WY9wI?O2-QJ|i1q>1N=t>1P(>9d6e+4OA}9~gr%Jd|BZT0geL?mt-<_Re zI||~C=HBmo=iGDeoO|xv`ObRTj*|$-TU=?Uc3mAKiLZN93hBD$^1j zL3@p+Vc?}x)TCKR3)G-xFgDC5OsH>N?vJPUm}ApLOu*RzSy|Z zJobaoX~+{8Z(#@e z?e@#Wu=4HVkQ~*cmdTFY|L5M3|0#V$5llM6gNdY5F?zy0z|~5w$|HOrl`PBuP$QnL zn|=G)rSf{Ps57IHg3Qu}>e}C@MO1TCXUMjeBo4RNrKgC-K9Ml{OQ|6ablmr|(eok) z29r*K!if}4f1z%OFVVJ@W(NKd0ihND6A6Fml$(W6nFSB&U4odNY-qmQ}I zcvp`q%7hW+*P%2n=uz{NsD7cNyC7dy6xiH`I;!7x1)L(DOwsmV`FK8iyH^sBzw!hazvQ>iJ+vXY=F(y`-Ph5&Po+(lJ$)rMEp{ zXoKd|L-6PHQjpEx1cT6pHKZPLqrHyt*0EcO52&oD99Fr?4w^Ob%<`&L@hSxQ94ZU# zD6BZ{_7NBiBtnTmF_0)rue@o#!fS8xniS$S)0U9AhuiD&6O1`P!}N6`y)05f?VczWCfwU^3qhJx zrplF^ulY2zp zLfpIP1rc}b1|*v*HeJ%`v%`RWS1eSlWW#65n}@YQ-5Au&$L1e9=!oX?Y5X%SX@KUR z3rTu!Nb`DO!+DR-=Q*Mc8alc(Y)i|57$1KEd);NyF@r!Nupjvz3K%`bga~~pC4X;g zQ;uzIX2-^|atyWnk|37HvOC-^KRz50#LxIZCWVo$!qtD>Y(F+Pr#ASVDHCb8+u7D8 z$4+kWFQM3#m-vUX!bmCjk?1@(w?32I=1b5#2IBc1orHkBoI*@d z;U^Ln+gA}=S#c&iY^qYNR7bd4?y!~;X2Q^Fu)AyvVOGvNi2M6v2M;!Cwc*jFbTSn3 zI-Q~Zx%&9(@h{K!8;a8x3MJA@qr*pQGY1d$_j$ctE?18pi`5UMGr21lF8J=VfB_aR!nEJ&0;B6pN|a;#OCX{Qn8uMri)|REwv|H&t$5_O0`w1 zmNSRa^;lF7xllrSG*(ZiGufG0yW#I4FyaV`mHtxcI zZN|n<@T)d + + + + + +{ + "fontFamily": "h5p-hub", + "description": "Font generated by IcoMoon.", + "majorVersion": 1, + "minorVersion": 3, + "version": "Version 1.3", + "fontId": "h5p-hub", + "psName": "h5p-hub", + "subFamily": "Regular", + "fullName": "h5p-hub" +} + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/fonts/h5p-hub-publish.ttf b/fonts/h5p-hub-publish.ttf new file mode 100644 index 0000000000000000000000000000000000000000..d1d40dd32e0b6453d9ba6d43b5e56cbc2dc66d29 GIT binary patch literal 2548 zcmai0U2Gd!6+UOi@nk&ypK->Coz!-=Zr!y0|7(|IBZ5;3$)?+OE4893PUitJ@hr)r z0@s>*zwexL&pmVQxpPfSL>k>DnesDdbHzZ|?T6%-c)mDyt+`^J|HHS5I1YYpzIlBG zV-Q@7z4J@AuJ(`o<{9`+qMm;&w3=6<-+#7Bq%1*SU4TG&B0mNHG58A$*Vb-UZCm9X z@bRVgT+?$;6|Q>GrLHw^u8={O!Hrn6T9c%=$232OLw@4^ctn)|t1NkRZ0I8-AaXO{sje_DfOruyZ#q0aojJW&EAuc5a&O_W+ z6sf2bqZBz%01fIke^}AAsVGG5a|_B5~2qD96=fAq9}^hN(gDj=5wg4j)ZLW0lQ|3)lu>G zP@|r5$kcyx@Ltf{>kZ~!8p|<|7A#LT$~+a+dbD8mkgY zz}V#t78~-!tQHJvv)WXtIHm2rA&4}s%v7o`_ga@FS@2y;JzJ}vQSS?KUwfredByv) z^0e}<;G4cvx!h-cmRAt|yE0ww)*jK9k@p^YLF65$0mY_@Lzi*~oHXFvm5Non*zlV2 z)=}TEZVdaZr`GSf=$J1M@bM3PDFb5upN{ZB%)AHAMw&eKER&HV6PhzBjA$Ks7lCYzfpiChs+ZQgn3 z*AFfSKJ^i4F0sS(-lODq_C{y7ap{RYvm55w_Y^K2(a`VR6t;wdT}_vWX@VmexPB;x zC*0+>{OCUH*kLWvJh**_=yUX4dY_|wg3s_X$&l*O73nL|KcN?^2I-Q06WWz2CVis$ z>2)VICIy;qoD%TIavAumj@$+OD+l-ByEf-wH{|OM_Rs)D#2xBVA@M`g#S-w(9V`Ri zb+8NgT?hA|(w80VhWx&RJyfRLLS^OH!i`y4pbD+fF^o58cCx*^mY8oXw^o~Ltt*My zTZvP1?df)VIZKn&hO;$F&^)z(TC_?{@D^QxY?f}JKZRFl(=;Aon?2uJy}sC9P86~w wI&V+7PK&lGftxH#rRT=*T;ZA4{EemNDxHCwc|^K|wO5~OiL8r%D*vPX3z1Evm;e9( literal 0 HcmV?d00001 diff --git a/fonts/h5p-hub-publish.woff b/fonts/h5p-hub-publish.woff new file mode 100644 index 0000000000000000000000000000000000000000..c0535345a5132286a480cac49ac155838ccb2c1f GIT binary patch literal 2624 zcmai0U2Ggz6+UNXz2n*4*}s|bti5YzcipVBak6Xge^P8L%sLI&b(*A+5)p;9v#~7_ zujM!*5j^w(k%vh92_YPWh~Nb^N=sECRTWj7v`DDJh@d<`pDN)>jS!*_?F+JJ`R?o# zn<~IvoqNCYoipd&IrrST`}NtWDPltNO^{!V>c`M!fj--2Pvr|l+ztM#LPAk*aQ;eT z1>7R^(?YB>fBL~fX=^g&<=hxgpFUn) z1PSgV=+6jI9?FjvudH217z6r*kP7kj%dL6%b&EOELVUMXy3)9gdAs3DNkG#mT+Zp+9RAd$U-p1j*n!po8 zPyF&mdxIuq2pEQZ+L8`%W&ujTCU641@Jf(}Y8ZXUl!PBs@`=B_({6(!U~(|G|7v;M zCmaJhCWcqYiPGUDqUsT6>fQPOKlhsa59xi1Az+RNQ)#ba^jJK=)yhbf$9X7|F3W#c zV}b3L`u4L=<&9`jXT~5!nWatDx4%z|srH1<&|ND@Y_&I}C&Zwo&d_}@wm=wM*M5ui2A0{ z$J}SUsmB#%+KBTnU^LF_ar?u#e!gQnFJDp=_}qdyuHW)SydpUC;|KOgxZm&h zGo$Md^B*7daxag<%J%{q-w!AKd=GwLV*F4G1olNvhxY}v!2Q@%Zy^@rSNsF0C8j8S z8Jk7h2-8<=lHoOm8mSy9Ls2I`@8(%%CTc*c2HsR3kAM6S%BsZgolqDIS6M@AY7=+lXL!X*gxl=E*7T!JFf~w zno(xUmFK(d3z97K9a}wBt({cw2<49dg>w0Y!0V+MYW5@h4;^$^3xzcPnU*#{ z^UsAQy)~=_gYeR%cNrkkyKfMYOJ;jtreJLY< zXM0OdY;WZ!C-ZUwz5Ki&Rwwhj+@3fg>Oq{(#6Trks8$i`-(hwh*;})l{MxLIvfCSM zdy5k%Hu+aD?5RuK8LTi$3UMSl$Ib0eWWW8Ba}u6DXWxFwz6}Wf?)E0~`4*jkg0q}K zPSN2bVu|Cch@-4{(;YTbsaC4vTrGE4#|Ss!=nObru7_|dk9vsv`x6HaG-|c6iIr^H zG=pBR*}qtyT0i#1rG7*4hDh2Emo?n zTD6=zn5`$`y6HnR^?0J5&F1p+MUgAw>CKzJd*|+j(C0oOzensay>~zL!`;!{ZCrq2 z&zy$moO=qFj%et2ZwiN@aL3Y7#A8B7GI0G+91`v54u5D5cKw|DUfgB|PWqSVNAy0& z_$Z&`$C4q{q>IuwrGFxzm^Do2otx09Oz8jFg7k{JHYNq8&N?OFPk9;mTQ2Vbe%r-e z_^!>n*b9E$#XjmIQ{15*6-*G84wis_?P3}DmWw^W@4C1PmA>p^FZeqy_ECxQi{+KW zi`V98k;=3}hcRBGxvAFjT5_Se++1y}H7_RTZX}P-w`N+c3&GYXNek2jYSJn- zpf~9vxH-Ck{y1KtMKciLn>*87y}Hy|PLAe^bjEq$DlIvtByO@C6`#6>r;;a|3)e0; ZR_P?dEMTRVG56|IJ&|?sPvw8Ke*s)FssR81 literal 0 HcmV?d00001 diff --git a/h5p-metadata.class.php b/h5p-metadata.class.php index 572cfd0..5b045aa 100644 --- a/h5p-metadata.class.php +++ b/h5p-metadata.class.php @@ -9,6 +9,10 @@ abstract class H5PMetadata { 'type' => 'text', 'maxLength' => 255 ), + 'a11yTitle' => array( + 'type' => 'text', + 'maxLength' => 255, + ), 'authors' => array( 'type' => 'json' ), @@ -57,6 +61,7 @@ abstract class H5PMetadata { // Note: deliberatly creating JSON string "manually" to improve performance return '{"title":' . (isset($content->title) ? json_encode($content->title) : 'null') . + ',"a11yTitle":' . (isset($content->a11y_title) ? $content->a11y_title : 'null') . ',"authors":' . (isset($content->authors) ? $content->authors : 'null') . ',"source":' . (isset($content->source) ? '"' . $content->source . '"' : 'null') . ',"license":' . (isset($content->license) ? '"' . $content->license . '"' : 'null') . diff --git a/h5p.classes.php b/h5p.classes.php index a610431..96252fa 100644 --- a/h5p.classes.php +++ b/h5p.classes.php @@ -623,6 +623,44 @@ interface H5PFrameworkInterface { * @return boolean */ public function libraryHasUpgrade($library); + + /** + * Replace content hub metadata cache + * + * @param JsonSerializable $metadata Metadata as received from content hub + * @param string $lang Language in ISO 639-1 + * + * @return mixed + */ + public function replaceContentHubMetadataCache($metadata, $lang); + + /** + * Get content hub metadata cache from db + * + * @param string $lang Language code in ISO 639-1 + * + * @return JsonSerializable Json string + */ + public function getContentHubMetadataCache($lang = 'en'); + + /** + * Get time of last content hub metadata check + * + * @param string $lang Language code iin ISO 639-1 format + * + * @return string|null Time in RFC7231 format + */ + public function getContentHubMetadataChecked($lang = 'en'); + + /** + * Set time of last content hub metadata check + * + * @param int|null $time Time in RFC7231 format + * @param string $lang Language code iin ISO 639-1 format + * + * @return bool True if successful + */ + public function setContentHubMetadataChecked($time, $lang = 'en'); } /** @@ -3297,6 +3335,72 @@ class H5PCore { return $data; } + /** + * Update content hub metadata cache + */ + public function updateContentHubMetadataCache($lang = 'en') { + $url = H5PHubEndpoints::createURL(H5PHubEndpoints::METADATA); + $lastModified = $this->h5pF->getContentHubMetadataChecked($lang); + + $headers = array(); + if (!empty($lastModified)) { + $headers['If-Modified-Since'] = $lastModified; + } + $data = $this->h5pF->fetchExternalData("{$url}?lang={$lang}", NULL, TRUE, NULL, TRUE, $headers, NULL, 'GET'); + $lastChecked = new DateTime('now', new DateTimeZone('GMT')); + + if ($data['status'] !== 200 && $data['status'] !== 304) { + // If this was not a success, set the error message and return + $this->h5pF->setErrorMessage( + $this->h5pF->t('No metadata was received from the H5P Hub. Please try again later.') + ); + return null; + } + + // Update timestamp + $this->h5pF->setContentHubMetadataChecked($lastChecked->getTimestamp(), $lang); + + // Not modified + if ($data['status'] === 304) { + return null; + } + $this->h5pF->replaceContentHubMetadataCache($data['data'], $lang); + // TODO: If 200 should we have checked if it decodes? Or 'success'? Not sure if necessary though + return $data['data']; + } + + /** + * Get updated content hub metadata cache + * + * @param string $lang Language as ISO 639-1 code + * + * @return JsonSerializable|string + */ + public function getUpdatedContentHubMetadataCache($lang = 'en') { + $lastUpdate = $this->h5pF->getContentHubMetadataChecked($lang); + if (!$lastUpdate) { + return $this->updateContentHubMetadataCache($lang); + } + + $lastUpdate = new DateTime($lastUpdate); + $expirationTime = $lastUpdate->getTimestamp() + (60 * 60 * 24); // Check once per day + if (time() > $expirationTime) { + $update = $this->updateContentHubMetadataCache($lang); + if (!empty($update)) { + return $update; + } + } + + $storedCache = $this->h5pF->getContentHubMetadataCache($lang); + if (!$storedCache) { + // We don't have the value stored for some reason, reset last update and re-fetch + $this->h5pF->setContentHubMetadataChecked(null, $lang); + return $this->updateContentHubMetadataCache($lang); + } + + return $storedCache; + } + /** * Check if the current server setup is valid and set error messages * @@ -3505,8 +3609,241 @@ class H5PCore { 'offlineDialogRetryMessage' => $this->h5pF->t('Retrying in :num....'), 'offlineDialogRetryButtonLabel' => $this->h5pF->t('Retry now'), 'offlineSuccessfulSubmit' => $this->h5pF->t('Successfully submitted results.'), + 'mainTitle' => $this->h5pF->t('Sharing :title'), + 'cancel' => $this->h5pF->t('Cancel'), + 'back' => $this->h5pF->t('Back'), + 'next' => $this->h5pF->t('Next'), + 'reviewInfo' => $this->h5pF->t('Review info'), + 'share' => $this->h5pF->t('Share'), + 'close' => $this->h5pF->t('Close'), + 'registerOnHub' => $this->h5pF->t('Register on the Hub'), + 'requiredInfo' => $this->h5pF->t('Required Info'), + 'optionalInfo' => $this->h5pF->t('Optional Info'), + 'reviewAndShare' => $this->h5pF->t('Review & Share'), + 'shared' => $this->h5pF->t('Shared'), + 'currentStep' => $this->h5pF->t('Step :step of :total'), + 'sharingNote' => $this->h5pF->t('All content details can be edited after sharing'), + 'licenseDescription' => $this->h5pF->t('Select a license for your content'), + 'licenseVersion' => $this->h5pF->t('License Version'), + 'licenseVersionDescription' => $this->h5pF->t('Select a license version'), + 'disciplineLabel' => $this->h5pF->t('Disciplines'), + 'disciplineDescription' => $this->h5pF->t('You can select multiple disciplines'), + 'discipline' => array( + 'searchPlaceholder' => $this->h5pF->t('Select one or more disciplines'), + 'in' => $this->h5pF->t('in'), + 'dropdownButton' => $this->h5pF->t('Dropdown button'), + ), + 'removeChip' => $this->h5pF->t('Remove :chip from the list'), + 'keywordsPlaceholder' => $this->h5pF->t('Add keywords'), + 'keywords' => $this->h5pF->t('Keywords'), + 'keywordsDescription' => $this->h5pF->t('You can add multiple keywords. Press "Enter" to confirm each keyword'), + 'altText' => $this->h5pF->t('Alt text'), + 'reviewMessage' => $this->h5pF->t('Please review the info below before you share'), + 'subContentWarning' => $this->h5pF->t('Sub-content (images, questions etc.) will be shared under :license unless otherwise specified in the authoring tool'), + 'title' => $this->h5pF->t('Title'), + 'license' => $this->h5pF->t('License'), + 'disciplines' => $this->h5pF->t('Disciplines'), + 'shortDescription' => $this->h5pF->t('Short description'), + 'longDescription' => $this->h5pF->t('Long description'), + 'icon' => $this->h5pF->t('Icon'), + 'screenshots' => $this->h5pF->t('Screenshots'), + 'helpChoosingLicense' => $this->h5pF->t('Help me choose a license'), + 'shareFailed' => $this->h5pF->t('Share failed.'), + 'shareTryAgain' => $this->h5pF->t('Something went wrong, please try to share agian.'), + 'pleaseWait' => $this->h5pF->t('Please wait...'), + 'language' => $this->h5pF->t('Language'), + 'level' => $this->h5pF->t('Level'), + 'shortDescriptionPlaceholder' => $this->h5pF->t('Short description of your content'), + 'longDescriptionPlaceholder' => $this->h5pF->t('Long description of your content'), + 'description' => $this->h5pF->t('Description'), + 'iconDescription' => $this->h5pF->t('640x480px. If not selected content will use category icon'), + 'screenshotsDescription' => $this->h5pF->t('Add up to five screenshots of your content'), + 'submitted' => $this->h5pF->t('Submitted!'), + 'isNowSubmitted' => $this->h5pF->t('Is now submitted to H5P Hub'), + 'contentAvailable' => $this->h5pF->t('Your content will soon be available for download'), + 'contentLicenseTitle' => $this->h5pF->t('Content License Info'), + 'licenseDialogDescription' => $this->h5pF->t('Click on a specific license to get info about proper usage'), + 'publisherFieldTitle' => $this->h5pF->t('Publisher'), + 'publisherFieldDescription' => $this->h5pF->t('This will display as the "Publisher name" on shared content'), + 'emailAddress' => $this->h5pF->t('Email Address'), + 'publisherDescription' => $this->h5pF->t('Publisher description'), + 'publisherDescriptionText' => $this->h5pF->t('This will be displayed under "Publisher info" on shared content'), + 'contactPerson' => $this->h5pF->t('Contact Person'), + 'phone' => $this->h5pF->t('Phone'), + 'address' => $this->h5pF->t('Address'), + 'city' => $this->h5pF->t('City'), + 'zip' => $this->h5pF->t('Zip'), + 'country' => $this->h5pF->t('Country'), + 'logoUploadText' => $this->h5pF->t('Organization logo or avatar'), + 'acceptTerms' => $this->h5pF->t('I accept the terms of the license agreement'), + 'successfullyRegistred' => $this->h5pF->t('You have successfully registered an account on the H5P Hub'), + 'successfullyRegistredDescription' => $this->h5pF->t('You account details can be changed'), + 'accountDetailsLinkText' => $this->h5pF->t('here'), + 'registrationTitle' => $this->h5pF->t('Hub Registration and End User License Agreement (EULA)'), + 'registrationFailed' => $this->h5pF->t('An error occured'), + 'registrationFailedDescription' => $this->h5pF->t('We were not able to create an account at this point. Something went wrong. Try again later.'), + 'maxLength' => $this->h5pF->t(':length is the maximum number of characters'), + 'keywordExists' => $this->h5pF->t('Keyword already exists!'), + 'licenseDetails' => $this->h5pF->t('License details'), ); } + + /** + * Publish content on the H5P Hub. + * + * @param array $data Data from content publishing process + * @param array $files Files to upload with the content publish + * @return stdClass + */ + public function hubPublishContent($data, $files) { + $headers = array( + 'Authorization' => $this->hubGetAuthorizationHeader(), + 'Accept' => 'application/json', + ); + + $response = $this->h5pF->fetchExternalData( + H5PHubEndpoints::createURL(H5PHubEndpoints::CONTENT), + $data, TRUE, NULL, TRUE, $headers, $files + ); + + if (empty($response['data'])) { + throw new Exception($this->h5pF->t('Unable to authorize with the H5P Hub. Please check your Hub registration and connection.')); + } + + $result = json_decode($response['data']); + if (isset($result->success) && $result->success === TRUE) { + return $result; + } + elseif (!empty($result->errors)) { + // Relay any error messages + $e = new Exception($this->h5pF->t('Validation failed.')); + $e->errors = $result->errors; + throw $e; + } + } + + /** + * Creates the authorization header needed to access the private parts of + * the H5P Hub. + * + * @return string + */ + public function hubGetAuthorizationHeader() { + $site_uuid = $this->h5pF->getOption('site_uuid', ''); + $hub_secret = $this->h5pF->getOption('hub_secret', ''); + if (empty($site_uuid)) { + throw new Exception($this->h5pF->t('Missing Site UUID. Please check your Hub registration.')); + } + if (empty($hub_secret)) { + throw new Exception($this->h5pF->t('Missing Hub Secret. Please check your Hub registration.')); + } + return 'Basic ' . base64_encode("$site_uuid:$hub_secret"); + } + + /** + * Unpublish content from content hub + * + * @param integer $hubId Content hub id + * @param string $token CSRF token + * + * @return bool True if successful + */ + public function hubUnpublishContent($hubId, $token) { + if (!self::validToken('content_hub_token', $token)) { + $msg = $this->h5pF->t('Could not unpublish content because token was invalid. Please try again.'); + $this->h5pF->setErrorMessage($msg); + + return false; + } + + $headers = array( + 'Authorization' => $this->hubGetAuthorizationHeader(), + 'Accept' => 'application/json', + ); + + $url = H5PHubEndpoints::createURL(H5PHubEndpoints::CONTENT); + $response = $this->h5pF->fetchExternalData("{$url}/{$hubId}", array( + 'published' => '0', + ), true, null, true, $headers, array(), 'PUT'); + + // Remove shared status if successful + if (!empty($response) && $response['status'] === 200) { + $msg = $this->h5pF->t('Content successfully unpublished'); + $this->h5pF->setInfoMessage($msg); + + return true; + } + $msg = $this->h5pF->t('Content unpublish failed'); + $this->h5pF->setErrorMessage($msg); + + return false; + } + + /** + * Sync content with content hub + * + * @param integer $hubId Content hub id + * @param string $token CSRF token + * @param string $exportPath Export path where .h5p for content can be found + * + * @return bool + */ + public function hubSyncContent($hubId, $token, $exportPath) { + if (!self::validToken('content_hub_token', $token)) { + $msg = $this->h5pF->t('Could not sync content because token was invalid. Please try again.'); + $this->h5pF->setErrorMessage($msg); + + return false; + } + + $headers = array( + 'Authorization' => $this->hubGetAuthorizationHeader(), + 'Accept' => 'application/json', + ); + + $url = H5PHubEndpoints::createURL(H5PHubEndpoints::CONTENT); + $response = $this->h5pF->fetchExternalData("{$url}/{$hubId}", array( + 'download_url' => $exportPath, + ), true, null, true, $headers, array(), 'PUT'); + + if (!empty($response) && $response['status'] === 200) { + $msg = $this->h5pF->t('Content sync queued'); + $this->h5pF->setInfoMessage($msg); + return true; + } + + $msg = $this->h5pF->t('Content sync failed'); + $this->h5pF->setErrorMessage($msg); + return false; + } + + /** + * Fetch account info for our site from the content hub + * + * @return array|bool|string False if account is not setup, otherwise data + */ + public function hubAccountInfo() { + $siteUuid = $this->h5pF->getOption('site_uuid', null); + $secret = $this->h5pF->getOption('hub_secret', null); + if (empty($siteUuid) || empty($secret)) { + return false; + } + + $headers = array( + 'Authorization' => $this->hubGetAuthorizationHeader(), + 'Accept' => 'application/json', + ); + + $url = H5PHubEndpoints::createURL(H5PHubEndpoints::REGISTER); + $accountInfo = $this->h5pF->fetchExternalData("{$url}/{$siteUuid}", + null, true, null, true, $headers, array(), 'GET'); + + if ($accountInfo['status'] !== 200) { + return false; + } + + return json_decode($accountInfo['data'])->data; + } } /** @@ -4519,6 +4856,12 @@ class H5PContentValidator { 'label' => $this->h5pF->t('Title'), 'placeholder' => 'La Gioconda' ), + (object) array( + 'name' => 'a11yTitle', + 'type' => 'text', + 'label' => $this->h5pF->t('Assistive Technologies label'), + 'optional' => TRUE, + ), (object) array( 'name' => 'license', 'type' => 'select', diff --git a/js/h5p-hub-registration.js b/js/h5p-hub-registration.js new file mode 100644 index 0000000..c77a78e --- /dev/null +++ b/js/h5p-hub-registration.js @@ -0,0 +1,37 @@ +!function(e){var t={};function n(r){if(t[r])return t[r].exports;var i=t[r]={i:r,l:!1,exports:{}};return e[r].call(i.exports,i,i.exports,n),i.l=!0,i.exports}n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var i in e)n.d(r,i,function(t){return e[t]}.bind(null,i));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=56)}([function(e,t,n){"use strict";e.exports=n(19)},function(e,t,n){e.exports=n(28)()},function(e,t,n){"use strict";var r=n(8),i=Object.prototype.toString;function o(e){return"[object Array]"===i.call(e)}function a(e){return void 0===e}function l(e){return null!==e&&"object"==typeof e}function u(e){return"[object Function]"===i.call(e)}function c(e,t){if(null!=e)if("object"!=typeof e&&(e=[e]),o(e))for(var n=0,r=e.length;n1)for(var n=1;n=200&&e<300}};u.headers={common:{Accept:"application/json, text/plain, */*"}},r.forEach(["delete","get","head"],(function(e){u.headers[e]={}})),r.forEach(["post","put","patch"],(function(e){u.headers[e]=r.merge(o)})),e.exports=u}).call(this,n(6))},function(e,t,n){"use strict";var r=n(2),i=n(38),o=n(9),a=n(40),l=n(43),u=n(44),c=n(13);e.exports=function(e){return new Promise((function(t,s){var f=e.data,d=e.headers;r.isFormData(f)&&delete d["Content-Type"];var p=new XMLHttpRequest;if(e.auth){var m=e.auth.username||"",h=e.auth.password||"";d.Authorization="Basic "+btoa(m+":"+h)}var v=a(e.baseURL,e.url);if(p.open(e.method.toUpperCase(),o(v,e.params,e.paramsSerializer),!0),p.timeout=e.timeout,p.onreadystatechange=function(){if(p&&4===p.readyState&&(0!==p.status||p.responseURL&&0===p.responseURL.indexOf("file:"))){var n="getAllResponseHeaders"in p?l(p.getAllResponseHeaders()):null,r={data:e.responseType&&"text"!==e.responseType?p.response:p.responseText,status:p.status,statusText:p.statusText,headers:n,config:e,request:p};i(t,s,r),p=null}},p.onabort=function(){p&&(s(c("Request aborted",e,"ECONNABORTED",p)),p=null)},p.onerror=function(){s(c("Network Error",e,null,p)),p=null},p.ontimeout=function(){var t="timeout of "+e.timeout+"ms exceeded";e.timeoutErrorMessage&&(t=e.timeoutErrorMessage),s(c(t,e,"ECONNABORTED",p)),p=null},r.isStandardBrowserEnv()){var g=n(45),y=(e.withCredentials||u(v))&&e.xsrfCookieName?g.read(e.xsrfCookieName):void 0;y&&(d[e.xsrfHeaderName]=y)}if("setRequestHeader"in p&&r.forEach(d,(function(e,t){void 0===f&&"content-type"===t.toLowerCase()?delete d[t]:p.setRequestHeader(t,e)})),r.isUndefined(e.withCredentials)||(p.withCredentials=!!e.withCredentials),e.responseType)try{p.responseType=e.responseType}catch(t){if("json"!==e.responseType)throw t}"function"==typeof e.onDownloadProgress&&p.addEventListener("progress",e.onDownloadProgress),"function"==typeof e.onUploadProgress&&p.upload&&p.upload.addEventListener("progress",e.onUploadProgress),e.cancelToken&&e.cancelToken.promise.then((function(e){p&&(p.abort(),s(e),p=null)})),void 0===f&&(f=null),p.send(f)}))}},function(e,t,n){"use strict";var r=n(39);e.exports=function(e,t,n,i,o){var a=new Error(e);return r(a,t,n,i,o)}},function(e,t,n){"use strict";var r=n(2);e.exports=function(e,t){t=t||{};var n={},i=["url","method","params","data"],o=["headers","auth","proxy"],a=["baseURL","url","transformRequest","transformResponse","paramsSerializer","timeout","withCredentials","adapter","responseType","xsrfCookieName","xsrfHeaderName","onUploadProgress","onDownloadProgress","maxContentLength","validateStatus","maxRedirects","httpAgent","httpsAgent","cancelToken","socketPath"];r.forEach(i,(function(e){void 0!==t[e]&&(n[e]=t[e])})),r.forEach(o,(function(i){r.isObject(t[i])?n[i]=r.deepMerge(e[i],t[i]):void 0!==t[i]?n[i]=t[i]:r.isObject(e[i])?n[i]=r.deepMerge(e[i]):void 0!==e[i]&&(n[i]=e[i])})),r.forEach(a,(function(r){void 0!==t[r]?n[r]=t[r]:void 0!==e[r]&&(n[r]=e[r])}));var l=i.concat(o).concat(a),u=Object.keys(t).filter((function(e){return-1===l.indexOf(e)}));return r.forEach(u,(function(r){void 0!==t[r]?n[r]=t[r]:void 0!==e[r]&&(n[r]=e[r])})),n}},function(e,t,n){"use strict";function r(e){this.message=e}r.prototype.toString=function(){return"Cancel"+(this.message?": "+this.message:"")},r.prototype.__CANCEL__=!0,e.exports=r},function(e,t,n){"use strict";!function e(){if("undefined"!=typeof __REACT_DEVTOOLS_GLOBAL_HOOK__&&"function"==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE){0;try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(e)}catch(e){console.error(e)}}}(),e.exports=n(20)},function(e,t,n){(function(t,n){ +/*! + * @overview es6-promise - a tiny implementation of Promises/A+. + * @copyright Copyright (c) 2014 Yehuda Katz, Tom Dale, Stefan Penner and contributors (Conversion to ES6 API by Jake Archibald) + * @license Licensed under MIT license + * See https://raw.githubusercontent.com/stefanpenner/es6-promise/master/LICENSE + * @version v4.2.8+1e68dce6 + */var r;r=function(){"use strict";function e(e){return"function"==typeof e}var r=Array.isArray?Array.isArray:function(e){return"[object Array]"===Object.prototype.toString.call(e)},i=0,o=void 0,a=void 0,l=function(e,t){m[i]=e,m[i+1]=t,2===(i+=2)&&(a?a(h):w())},u="undefined"!=typeof window?window:void 0,c=u||{},s=c.MutationObserver||c.WebKitMutationObserver,f="undefined"==typeof self&&void 0!==t&&"[object process]"==={}.toString.call(t),d="undefined"!=typeof Uint8ClampedArray&&"undefined"!=typeof importScripts&&"undefined"!=typeof MessageChannel;function p(){var e=setTimeout;return function(){return e(h,1)}}var m=new Array(1e3);function h(){for(var e=0;eO.length&&O.push(e)}function I(e,t,n){return null==e?0:function e(t,n,r,i){var l=typeof t;"undefined"!==l&&"boolean"!==l||(t=null);var u=!1;if(null===t)u=!0;else switch(l){case"string":case"number":u=!0;break;case"object":switch(t.$$typeof){case o:case a:u=!0}}if(u)return r(i,t,""===n?"."+D(t,0):n),1;if(u=0,n=""===n?".":n+":",Array.isArray(t))for(var c=0;c