From ccb900b1580c786dd32f4880e86f357e8b460ebd Mon Sep 17 00:00:00 2001 From: Markus Koch Date: Fri, 27 Jan 2017 20:29:27 +0100 Subject: [PATCH] Initial commit --- .gitignore | 8 ++ README.MD | 18 +++ _index.html | 44 +++++++ b/2017/00-template.php | 55 ++++++++ b/img/2017/fft.png | Bin 0 -> 16576 bytes b/pimg/keep | 0 blog.php | 263 ++++++++++++++++++++++++++++++++++++++ control.php | 4 + img/cc-byncsa.png | Bin 0 -> 697 bytes index.php | 96 ++++++++++++++ p/00-template.php | 20 +++ page.php | 13 ++ shared.php | 138 ++++++++++++++++++++ style.css | 277 +++++++++++++++++++++++++++++++++++++++++ userstyle.css | 0 15 files changed, 936 insertions(+) create mode 100644 .gitignore create mode 100644 README.MD create mode 100644 _index.html create mode 100644 b/2017/00-template.php create mode 100644 b/img/2017/fft.png create mode 100644 b/pimg/keep create mode 100644 blog.php create mode 100644 control.php create mode 100644 img/cc-byncsa.png create mode 100644 index.php create mode 100644 p/00-template.php create mode 100644 page.php create mode 100644 shared.php create mode 100644 style.css create mode 100644 userstyle.css diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..72bbf97 --- /dev/null +++ b/.gitignore @@ -0,0 +1,8 @@ +downloads +b/*/*.* +!b/2017/00-template.php +!b/img/2017/fft.png +!b/pimg/keep +s/* +p/* +!p/00-template.php diff --git a/README.MD b/README.MD new file mode 100644 index 0000000..3ab67cd --- /dev/null +++ b/README.MD @@ -0,0 +1,18 @@ +[Simpub CMS] - A Simple CMS for Nerds +===================================== + +Directories and Files +--------------------- +* index.php: Main page, assembles layout and loads sub pages +* shared.php: Shared functions and global settings +* blog.php: Blog core (include from page in /p/ to use) +* page.php: Page core (include from page in /p/ to use) +* control.php: Admin interface +* style.css: Main style file +* userstyle.css: User-defined styles used on content pages + +* /p/: User content (use 404.php as error handler) +* /b/: User blog posts. Create subdirectory with year, then drop .php blog posts into there +* /b/img: Again, create subfolder with year, drop images in there +* /b/pimg: Must be writable by www-data, will contain auto-generated thumbnails +* /s/: Resources for pages diff --git a/_index.html b/_index.html new file mode 100644 index 0000000..5c5a9f4 --- /dev/null +++ b/_index.html @@ -0,0 +1,44 @@ + + + Error 500 - Down for maintenance + + + + + + + + + +
+ +
+

+ + + + +
500Down for maintenance!
+

+ +

+ The site is currently down for maintenance. + Please try again later. +

+
+
+ +
+ + diff --git a/b/2017/00-template.php b/b/2017/00-template.php new file mode 100644 index 0000000..c1c296e --- /dev/null +++ b/b/2017/00-template.php @@ -0,0 +1,55 @@ + __FILE__, + 'title' => 'Title', + 'description' => 'Description', + 'author' => 'Markus', + 'tags' => 'video,tags', + 'status' => 'unlisted', // released, private, unlisted + 'ctime' => strtotime("2017-01-24 20:20") + ); + if (!isset($CMS_ACTIVE) or !renderPost()) return; +?> + +

+" (take url) + // Link will normally link to self + includeGraphics("Random FFT image", "2017/fft.png", $preview="", $style="width:640px;", $link="http://notsyncing.net/"); +?> +

+ + +

Hidden section

+

+ This will only show when opening the post, but not on the overview page. +

+ + +

Protected section

+ +

+ This will only show after entering the correct password. +

+ + +

Some provided styles

+

+

+ $ some formatted code
+ $ foobar +
+

+

+ Inline $code is also possible. +

diff --git a/b/img/2017/fft.png b/b/img/2017/fft.png new file mode 100644 index 0000000000000000000000000000000000000000..949881aa78ee3e1223ce87e4766a74552c4b4af3 GIT binary patch literal 16576 zcmeAS@N?(olHy`uVBq!ia0y~yU~*<)U`*v;V_;x-q4GwTfq{Xg*vT`5gM)*kh9jke zfq_A?#5JNMI6tkVJh3R1Aw4fYH&wSdxhOR?uQ(&W?22U5qkcv5P@79+H zr|z@=P+q-}<4~7M)$CLK0lRY>*Buh;cIbM0G4^AI=I&6(h`X)cdVd|av)^88x^z-p zovxHl9_y`D<&G=#y2Ur#y}Q`Kd*kU{2W-V->O`tn=_;LFTC!=n=#HQzKmR>6FP{9& z-FW5_U!(WeEiFwx+kBp>ZankhBzr;PbY(8`eJyDUmdN?eXj3Je^R=P9nf`s&NAZMm~gzYK~iEiK)YY_RYB z`q0&3ttG!D=id%L`Eh6MVe2}JocL4aDXu-B}G9^ zjcu};uTxx{oL>AsooUf)!=_B1u54x|_Wf?TeAxOp-qlxsM@z2^(fYVFZ1uz$GdT9f z^`ATEx6@Z$Nl9tae4gBUdn9k(yqS@id2nO$@da127G8gS^wZnh+aG^;c-W%kg@BZ_ zbm5B&if``h48CN<;@F_T@#57hr{G{=6RFs zhT>;u90LOdMCK_WFnZ^}mD}7A#-Rt{uMa$UNI>gOn2jPo6$Km|@bT zyeCv^>W}TcxjqvWI09CN_%SbJIFPh4;meDQ|NdmSxVVU@Jv%q|cm2;+1&*-#y?QY_ z5^8@woxaxo-^c!=nab{cTefZ6*7e^0_Z#EabIb2(?$g)P+h+IY!{KX}m-|Qi&$UYR z_4VD#Byjre|9v$-H*H}e72PHoG*9pg8B(YkehWjx2e-(3~Dnn}w3 z%60!0$De=WegEUmzK62*GTYYI);-+*o9AX#_LVGCyFVYC3x93RzW!nF`&$2+`sZ`Y zAHBM|`qA&ZyUQ1E+a@N}%f_&w?r+tL607MObKQEST0u_zmt`d=D5yDOiJ|ki=9#~R zSQuqxWg|AFaDMvy`RL2?JB953KK9plyk8%)vq@0dt>gXKG~+E%Yk%08nO#fGx&3(V{`T!#x!ViERtE+IG(0}u@0|&9%|!1_>(x%5Jn5L7t(|voPiMEd ze$v@lrhLnHK080Zzx4IBhkt&4wy6JSb8T&Od;0v^FrD+KPB~>}YMx0mK9gq5!`6KK zX{3%=NLZMXrlx1!<<5?djwkBQ#m~+hytLHYFz=3q&A%Uye|)>0zcKZ+*v3EN`+u;e zouAkHV8D_HL%+x8=`+f`SU3oskR) z4Lz9)cI+Sat!Zg#O2)>Qb1Pk3SbE%)d)yYE{&65`znb{{yoY**HhJ?>76VA%Y${jU7H(h`F zcVoRsd(>LDq$H&;Rkl{v)=$mmc62mx9Ot~4FmW!{ytY^Gdz%7>01IPmY-~nWR+HP} zi89R{9UUh`Z=P4Xy*+>a;oo=e#O(R^>vi1p?_a(oJUun_#^!YXHXg~QJ$r1npYH1E zaVaS=>FVk-D177s&(=40*ZsA+SM^$V$+Bftv2lTcjoY@FnV6d&&f2PEZhk%Y&%Jwb zCFSLdSFPeYdGh4H98lnDhO~fk7t5wt#${ovKR#@iPde1X88_8`wi)l%ty?`jJQx_Z zY}w+l{Bo!N>hC3~Gr?JP#p>0?TAL$uBy6j;{NV=$Rbu+PJ3EusF**vYxwns@LqGhf ztgP&{M~{+T_edJ=(cAy`+wHY;=gxif``kId_8+y=zurur9~ocqkTp9iYZc+_xGyJu z^16#JpZcv>KR=*fp6~bi+B(HdhOM~@n`d}_H7t7K@#NXFN0p@#TuMj+rESMEHL}YcI5*e2HfzpbGE>_$II>iYS#U}eLv~rqoYZ4 zH>aO}q;CI{Q%Onb!}R@sSb2GQEeapCta0ONVsI4ra8x`#;p8OMiuZfJZ^*f66ln-5 zK^QtuUU*;k-TKTtTj|4XyoXl=F5ZxIl#AiO^7(aI*DBv`z5d~>`Tc~uyGkYO>uj!M znVRL@c_9KS`w#X=8Vd*uH_tRqPrAM?_OD+3j}H$cc9m#0ysw%MDi)r6syuT6RB~U7 z&SzwpSM$lU@Yh6TcLoMmS62z^G95L)IUSE4CB^J6^Ifw!`8eO2h>c89YsJ+4<{Y@U zw|Zm#{e5-QEC2o~-ShX`ZH5NT;AKB>lV{JlwbE*n&H5j$jt@s?pVs$R*4iA7BVz! z+h*o7-|lW=-KHi`YI(QrJyCBK7IOsI+w+9!>%gE zf{L%Y?_a#wFm1||2*wEcsuzldyWAFUWZF#e6*LoYzZAd)4hG9+G=EynM zZr*&kWzD|#*4EZ*Ute3hnQ4RFj|a_3vfsS z|Hg*INB18e?`LPI`T2DEqb=OxdKF#|7#N(}`HmK!w`FIrD18;O|0^iYe<^34xv=@X zUAO)JpXYx(o1OpR`~Ls2HgCUPaOUqU<>KOEV94M1Q*B-B?l$xLHNp%Z&KRHXD9s6P znmTpr!%IuOca*#oI(6#Quh@UR(&ihIkMl7c`1}37KB%S?S@Nq|LR;3<@x8E(3PD)AwrLHH>pLdt0otx7+YnIduAGJNdUajuv>^#`5zfU8s zl8xcK{ePRhySrLny~7YWqaY;(XxjB|IjMM%0f8Dfc(}by0pKd(&=xDd>JAW1iZZVyLiubR+K(adP)yEc~ z^vMRUhm?X$@a1RZDh*zNfvT%*$MZpz87qkG;Kdn(9XKfTI~w&dTp zv-x;Lc*o~+)`m$(I6%d<{r}JQM?dx3{o;6ief{yf<@bAczuzal|KHd3fzi?0)4qTC zvS7y!iNeA{4<8?w)YPTFkGZ)iSy@TBy1H6aep+&8nXq7B$Agz9TuT)H@sxpb=hth| z9=^V%(dtS{OuD+dkA8P`ac$YUb>YsPl3}YwckbMo_x$bKx31;o=Brk%nlNY1oAaPb zVWN{OM^nOAcZJ)c30YgEf~oTesHu+kTx=dSyl6wcYRc-QHF7)a$kF z_dCkd?$`Z(d+ppgzmK))>C2t}>^uGI&F1rK^!I#dGBq^~)hSQCy)9R7xp!cAxVkml zWS9K7eS7-efOz|ba`rOc;(z~fx|C^T*j$wS zVIL8ceipuu@lNU%Phgj>^w!dU1O?OtY_nnh8&D-n{wZ&6^`rwZk{0 zpO?$IwS{y4udC~id|IoaC?Oav0>$1_C_oh=OO=>buKeu4jDlbq<&S>~}T$@$-X87b(XhZVn zBG>K>85fndKMf2FG??jQFw^JJmOp=LKED6wcUDkvV*VT9$%oRO%P(^AI(WQLKu{1; z0V~bh2W?t1H*t!yYJ;*X*Wo2CCj>$5NTvfSom09Y%}8*DW=(w0KhYSZ$Yn`}<4m5) zsvuiIK~}!%K99~OBS|GCrT@u`oS)3PKS|M1py2=C@77;mnV6U)+}l&R^A(}~=4B=gra z-RKQ9KZ`)^o5%h3$0jH`PnbSkU2_|1d$Tca{dbT79Uce&Oyb$PZQG)a8wD*bE&Wpe zf0X~<=q_I?0_vGu$ud24`t-+>>hn9E+S=M`=;^t|#K;H<3kOC3==KDWR? zLBDx6FZ-7X3u+#6_;!XREAmb3B8Q28uT(Kq{Cqk+Fes>Lp>zAU=c4K+?%jd0vAvIv_jg~8ikECW^sJ=4a$ElWzMdYQ_jWU+zkdA+?%9L;Dai*Owg39X z`Sr)0eazDP-)k=W@o05MZEDNyU$y-!gQkD|s@yKSZT)_~!kf25vtHZZdDMRRU$%dc z(UVojpTD`ex#Cf$y3De#Z)I=oF4qrR7t<+gUG|{e{?9_^*j~5hzCON<=_~f`y_+n3 zCCikHi|fcQ7ndiJ$8QN#s#Tu}xX-dOUujF~X|a&-@Z|UR_IC95m(Q}-*5+Qibm^l5 znau|u6jq9LvtGS=mG5z1M~6m*q2%HO@ei~0rcIstaP|6qhk7K9W!_1ayuD@0;Ei181-h1=Byr3ZC)~MbqS3*ET zC~9hMaf>@UIy^r9xn>N@Q=mQ%pZ?06&!wfM3slow87GL#r6F{ShLN}*Ro9eq`wP`imL9r zo?-Ih#S4MzHc(@Fo8#KB#S0cVtnmkR>e}BJIe;0H*E@tisIUQlV|fy9$2QCI(4dtm)E4*B}$7n96os2u%*1SF*H}eERfhQYCuU(On(1@<=#l=E*mY-SV=!O2^n(c;?KRd9U4FT@R)h z9ZWImy!`3&=ex(0l@>K_H2gZ@bfNRQSAwlZc732h1LTp6MFs~ihq~-b1gCn)*vFnj z^VGS*k#ZBXCgWnZX?1;K4Xc}`^4yf$`H=e`r~p)o|1pQ>?TwAhCr_UA<2-Y;TYTc& zxxJo~)f^XJOt`ef^TfGxZt3aEpQPTfpX{?VNYTnlir?k~!!-T)zIX5P;vrq-Pnwdy z9yIfBNIcB8=l{RoeyRU|t^eP3cX#>Y@cq9;_x*UpEg~+S{QceC3$MT0nFk55a5OdO z@B6{zJx%9e_4~c;si&v?l<5aG3fzi}N?u%0-1Fm6_m98t>-#x{)hwpg|9ZKcp&@;K ztr)1M_~++mMuz&|x9`im+WYyO^$f#gwxpyagW_jCZ*FZ}eLt07-cH7Qx*jWojCGk$ z*5%HQLqhGG0wsOY6jm*%|UY+_*eG5`Nh`INM@M_*oEPMW)9iAv3fgX|KfSt1Mx*VaT@ zl)sbdle6vGvBQGFAv#)mng9HE0;~5QyaKMr60fcb^-C32^Kq!I-hCWYqq!B!bg9SkN1`Cj)_jrzq6w;_x84f2?h@ivdfE{b~m%(VbI9&6JMTtf1j+|;=ohK zi-Y3h`+ItLA`K<(m%A+v{ATt=1v+5*HNGa^Z}L&`c-Pn3%D>j8*T+oVG-tiMrHnaAx|vLW%32|9n3G_}bd&73bIDkRqv`PJ*qwKNz(*t-+#Tz#|+S=H*msVF-U%Yy?)pxd;qNU|cdGORkYqtQ)!B_nb zwzjqw)!%e@*qE33&F$KneckG6;K~rc<)@eV&ThMPD@sL0g@GX|Dr&*ymq)7Rt6CpRAU-Ep~KwZ@*!D1vE;z57D{m@Zh_d+=i_p`dsx7y$7`>e`7>I zWMt=(B`WYiVB4QhCP!?`k=zocE2bCI@#IO$l>^ziq0kKa}qq9uws=ssHyI_RD(>%aW^qD6}mjAkYn%{-F%^XJdFv)-VZ^ZJ7O z>7dbz3MBy`YS#OcSDDy9F>!3wdklLGaIpb^86#HpZxOhM11CHjvLBZBmR$M=B%9jq_-#E?m3T_Uu`jiJ94=g$ob9Evh0Vl`}D5wB7iYU&4~+t+1u}Z^t1GHDjcP+DmIQ z4U}ZBtLB`Vnp*MoYPg`F;6tNjH*?y;R*T+0e(adl)s69Cpn;Lqs|)}9C@hS6t*v}y zKlkj*j10H8=exVPwYB&^U$bvt9B8_1?!}Cjiy1r-f55{E^KXYo)zrs_$;a1ReR$(# ze!P8=gtD|8U&Nmuk5(sct##I|vv{-rn~JLQy%<(8Ny*L?D>Od-y}3F4;}Kzhiz^%7 z%U(imogE8beN{t4L*O-Ny#AzO^_dBA>)pM*xvQ$GF5J4+_4M@gK6lXkAwKKo|! zD)c;oG^zj{a<4P`@?^4q(#=h&7qYfS>?ly2G{_f6#{xf@PNoj1F@B3_(`0;<0N$XCz_sMkj z_3@qjsH~*4AZ+!-S+lx6eJVO~RpO5|ZQ|?88ig)We&$c~RFJEppzh84%vGe82mj_Qx)!vwXUXDl7 zh^4Z!GVggmyr?%Qd~~ES!w6K=Tkh|X?CS47KEp71!R40$!NJYZ+w*p=*`9q}@60Sy zZmC|kIaqow$*(1EZOIg#G3nT0P(--Wo`!B@&BW6_X!xGnM5mzRE@(^FFyZrLJ|wplW5vm{&d z!N;F;#JIJzwI@!QqOu)4sr+g3LiPDILZ_$cHixY~dZ?9q;+#1>pFS0}Tg^7hJ)~d% z(|h`7aWOHc)mNRCUslxB<$d|`T!6f|-8zZT}*v%sq@=e)eKl9G~?#-zy$ zlaKd3>{Oq3VDI;P-RyD|4A$lEN>**I{+_pF$r6Xf7Zp@hS>Nyfzt6vSbG^fAucb~U zB_?te4;VpRz`J+vPD=WCT}&|W$HR?t|2PI2m3(^>`R9qcy`zf@%fC<4_b*tukWt-l zPQi*|$golJw>LLI&6l9yU{Jqlv3vioJ06Y#3LH$JUXM=XCYJYmzspV2jeb^a1ImEX zo+mG4uix92zwam8>uYNd|M>WLVc6=8g^%6Zt!A6&voSn*^5ns~-S3?I{P@;{X=`a~ z%VO>2JcadgKE(2if{KBdNs|^TyZ13LfF_E|-bDD!u@F3Z^yrSVx3eOie|dSCp}{cu zn8ly$*?bJvWp562iE1ynnpODd2o-MVA9wq|e4xTy5!nfZQ3P)qp1 zv0mvH@7}q&xUf`JR~LT2Tb}&l!onAC-mox$ii+pw<{rMd*j-RuoSh*fJNxjLmzR&G z?#yzI$L#V zUb0JnU)Qy8w;!ha_BtH@|7+smb^T}SlJ3{7JYJUH^5}cI0!rV9n?cQg-kVMDHY6TC zvVZcVNem3}bw5=Z9;{x!uV@Az!{g)qe&7G!w>Emal9CeB>FN67uWzhl(bm>JywrPo!OKgk zQ>IS+y8Dl`d0xWtK3Rr_-|zRwdtGMyP-7z~C}=r(3eVX&mcpi{rZ@Ihn?HK=2sElH z9$zDOg|US~bY`_c?Wh7+ewIfaEy zJ8pH}=5vp8{zUC=as6YUDYIp|5gQIX-1``L*TD5CKVt2dFv!wOu=}LnG$Hafyo$xKE{MOsIIE zsHCJ+UFX^6H{Y&z`MfHwHy3N}q%c;5cM47a!*XzIQ2)fLT}FBjb{YJO~p z*jM>E4K&ESbSdlcKH285)va;sr*Gi_7Zkg8?YeN~3QMn>vLzcRCu>iVzjEt(8?SUg zKtRLt`E^nZ23c1$u3Wj&@$~n%x5X>w&z{|VJ-$A+=Kkf&%~Q3*lg`hxl`u--`1I-1 z9X)L$BcY2IFKTFM9Xiq}oVs=P^3xq19ULE=&tEt$U*EHCogQdCOJQN*iL+;qPSp;N zxwaRvj->0d7DlUf6H2Q#5;VcWCR#s5khPt|QD99G)1Bh;wkJ-VI`r!5YDNbAykX-f|gkjq2sM|05u*=EK0?gR#oQQGliWXN(|bhwdVBhi*a!Aw z-_K;29Lg|Z)2Rb5J~{vP_0DvSeLq&+PM%@UV)gHOzs#`{ZSBlr_d|cj${w#3<+?xr zU=L`Cimm7JlR3;Y-%g%_kBVyj<$)MrMJ9{dH#r5Nk z%reaeb%XKEuGQojpT8_DC^)hAO-jbaMXndJw$89DR$JyjzfaM*E#d4e)1;qsEQ>dk zybS7*Hs|ZN|7Wr9@3-ijo10v9^mTMv!dAEXEq9KJlDc$x?rzJs7_)0^yr9VEzd8LH zvxBE6r8(`)&^gNs~TT;ApQ*gm;l=)6Rxt6GK~l*Db3DseW6z@$*=zveDgclnEFj!4uZ!>;PU`m7WlM*#(kKwLey9_cfsT?_aRMFgAJbYcu$6b3CEn>>e&CSTmb4yNEmXeaX zqqlndcJbKQ*c*`cG-%mb#({!80)Zd81XvDgsUNWYey4fO8l5$9d!-mYT=LdWd~so6 z#p7P{JzDcI2LGECI2df=FY^GjoPrtrci}o@w?qjJ06a<%PHI zXKSdcvZkM#;}{w`6|{0eQ1ImbEpiNAUS0t~L63qfQD)2H|J?pJB&Ho*UoJ_g;p)z_{MzuJ)f+cNZ6teJSeB^Xvav zfy9zDgF0ocx&5V!V)y@> zLV`d0-=w^F+;8s|9xkrtJF8{K4hzr%l~Yr-^Ip5VxGY$@)U_raV;T;;mLxn}+${H2 z%abQ5JAJ=%{uc(V_tqC|QiyoUvg7%@>IqY)wq9Kwⅆ3^-`5b)=DIQ&qp=}1$A}y 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 = substr($blogentry->file, strlen(POSTS_ROOT), -4); + if (!(($posts = apcu_fetch('posts')) && isset($posts[$blogentry->file]) && $blogentry=$posts[$blogentry->file])) { + //echo "[DBG] Regenerate meta info block..."; + if (!isset($blogentry->file)) + $blogentry->file = ""; + if (!isset($blogentry->title)) + $blogentry->title = "Untitled"; + if (!isset($blogentry->description)) + $blogentry->description = $blogentry->title; + if (!isset($blogentry->author)) + $blogentry->author = "Anonymous"; + if (!isset($blogentry->status)) + $blogentry->status = "private"; + if (!isset($blogentry->ctime)) + $blogentry->ctime = time(); + if (!isset($blogentry->tags)) + $blogentry->tags = "untagged"; + + $blogentry->tags = explode(',', $blogentry->tags); + sort($blogentry->tags); + $blogentry->permalink = "?p=blog&b=" . str_replace("/", POSTS_DIR_SEP, $blogentry->file); + $blogentry->isPublic = ($blogentry->status == "released"); + } + $renderIt = $CMS_INDEXING || ($blogentry->status == "released") || ($blogentry->status == "unlisted"); + + if ($renderIt) { + if (isset($postUrl) && !$CMS_INDEXING) { // Set meta information + $pageTitle = $blogentry->title; + $htmlHead .= ' + tags) . '"> + '; + } + echo ""; + //echo '

permalink\">$blogentry->title

' . date("l, F jS Y, H:i", $blogentry->ctime) . "
"; + echo '' . $blogentry->author . ' | ' . date("l, F jS Y, H:i", $blogentry->ctime) . ""; + } + + return $renderIt; + } + + function renderFooter() { + global $counters; + global $meta; + $i = 1; + if ($counters['sources'] > 1) { + echo '

Sources:
'; + foreach ($meta['sources'] as $v) { + echo '    [' . $i++ . ']:
' . $v . '
'; + } + echo '


'; + } + + global $blogentry; + echo '

Tags: '; + foreach ($blogentry->tags as $v) { + echo '' . $v . ' '; + } + echo "

"; + + + } + + function extended() { + global $CMS_SINGLE_POST; + global $blogentry; + $renderExt = isset($CMS_SINGLE_POST) && $CMS_SINGLE_POST; + if ($renderExt) { + echo ''; + } + else { + echo '

→ Click here to continue reading ←

'; + } + return $renderExt; + } + + function password($pw) { + global $userPassword; + if ("$userPassword" == "$pw") { + echo ''; + return true; + } + else { + echo "

"; + if ($userPassword == "") + echo "This section is protected. To view it, enter the correct password."; + else + echo "The password you entered is incorrect! Please try again."; +?> +

+ +
+

+ $object){ + ob_start(); // These ob_lines will prevent output of actual HTML (the function already does this?!) + require "$file"; + $blogentry->includeFile = $file; + //echo "
"; + ob_end_clean(); // Enable output, drop cached + //array_push($posts, $blogentry); + $posts[$blogentry->file] = $blogentry; + } + + # Create list of columns relevant for sorting + $sort = array(); + foreach($posts as $k=>$v) { + $sort['ctime'][$k] = $v->ctime;; + // $sort['author'][$k] = $v->author; + } + + // Now sort the entries + // Multiple keys: array_multisort($sort['author'], SORT_ASC, $sort['title'], SORT_ASC,$posts); + array_multisort($sort['ctime'], SORT_DESC, $posts); + } + // Store to cache + apcu_store('posts', $posts, CACHE_POSTS_TTL); + $CMS_INDEXING = false; + } + + + echo ""; + if (isset($postUrl)) { // Display post + $CMS_SINGLE_POST = true; + echo '
'; + // Header is rendered in renderPost() + require $postUrl; // This will render the body + //if ($blogentry->isPublic) { // Render the blog footer + //echo "

Written by $blogentry->author

"; + renderFooter(); + //} + echo '
'; + } + else { + //echo "

Blog posts

"; + if (isset($tagSearch)) { + echo "

Archive for '$tagSearch'

"; + $pageTitle = "Archive for '$tagSearch'"; + } + $i = 0; + $morePosts = false; + foreach($posts as $k=>$v) { + if ($v->isPublic) { + if (!isset($tagSearch) || in_array($tagSearch, $v->tags)) { + if ($i++ >= $postsSkip) { + //echo "permalink\">$v->title by $v->author
"; + echo '
'; + require $v->includeFile; + renderFooter(); + echo "
"; + echo '
'; + if (($i % POSTS_PAGE_SIZE) == 0) { + $morePosts = true; + break; + } + } + } + } + } + if ($morePosts || $postsSkip > 0) + echo "

"; + if ($morePosts) + echo ''; + if ($postsSkip > 0) + echo ''; + if ($morePosts || $postsSkip > 0) + echo "
<< Older postsNewer posts >>

"; + } + echo "
"; +?> diff --git a/control.php b/control.php new file mode 100644 index 0000000..f0df4ac --- /dev/null +++ b/control.php @@ -0,0 +1,4 @@ + +Purged cache. diff --git a/img/cc-byncsa.png b/img/cc-byncsa.png new file mode 100644 index 0000000000000000000000000000000000000000..ed028fed9d6154b10bf73872ea925a9603a352ae GIT binary patch literal 697 zcmeAS@N?(olHy`uVBq!ia0y~yUC#5QQ<|d}62BjvZR2H60wP9dj^7eFb45_%4lpvAV zAlUK$|9|_S8g3Q={`EJvNJS={U$@tI`MEbQUTEm+AHVYK)vKykS5|I&7goqws1P0( zcJS)SuaDdNo9}FQ$Y=U{x<&Kjr=zEzc29r&Nmt;_y}h^3oXIKrFT(Nt@NxcD)>dcL zNgFFFeohiSbm-8I8g9k|4|Y^Oe%7{Cy75i_e7lMt6&1fL_(S>QcU5TG+RC1=sQ$KQ z( z2;ud465+++=GMXefXBn_(9^0jI_%dwwEdkJ3}0=m{_%RczC%zzfPlnOhknNzKA!^) z+a^sC3b4`D)ip5@2|MCE_uuE|{BB}yYYy^%mph_apcnN-ft@SuK;l)V!2W3_9({>< za&iisUvw|zJIFI7iw5a1?{u(dKB}#ym3DSktC;$mH!}bK|2Zyv_(nEI#FGc#jW_XM z+_E6DF;gLt|Mkn)pFVwZ`or0C!?yYxLodTGnG  ' . $item['label'] . '   '; + // The   in the line above can be removed when using a fixed width style in the .css file. + } + } + + if ($page==HOME_PAGE && !strstr($_SERVER['REQUEST_URI'], "&")) // TODO: The second clause is pretty cheap... + $homesel = 'class="selectedMenu"'; + else + $homesel = ""; + + ob_start(function($output) { + global $pageTitle; + global $htmlHead; + $output = ' + + + ' . $pageTitle . ($pageTitle == "" ? "" : " - ") . PAGE_NAME . ' + + + ' . $htmlHead . ' + + + ' . $output; + return $output; + }); +?> + + + + +
+ +
+ +
+
+ +
+ + + + diff --git a/p/00-template.php b/p/00-template.php new file mode 100644 index 0000000..9374fe9 --- /dev/null +++ b/p/00-template.php @@ -0,0 +1,20 @@ + + +

Subpage template

+

+ This is a subpage. The following code demonstrates the features of page.php. +

+ + diff --git a/page.php b/page.php new file mode 100644 index 0000000..25810f0 --- /dev/null +++ b/page.php @@ -0,0 +1,13 @@ +
$name"; + } + function addEntry($title, $preview, $link, $description) { + //echo ''; + echo ''; + } + function endEntry() { + echo '

' . $title . '

' . $title . '

 


' . $description . '
 

'; + } +?> diff --git a/shared.php b/shared.php new file mode 100644 index 0000000..1e7fa56 --- /dev/null +++ b/shared.php @@ -0,0 +1,138 @@ + "Page A", "link" => "?p=00-template", "highlight" => "related-subpages,00-template"), + array("label" => "Page B", "link" => "?p=404", "highlight" => "404"), + array("label" => "Repository", "link" => "https://git.notsyncing.net:8080", "highlight" => ""), + array("label" => "Contact", "link" => "?p=00-template", "highlight" => "") + ); + + $blogDirs = array("2017"); + + + /* + * This function will include an image as figure. + * returns : Number of the figure for later referencing. + * $title : Image title, will be prefixed with Figure n. + * $path : If $path starts with http or / it will be + * treated as an absolute path and no downscaled preview will be rendered. + * Other paths will be prefixed with /b/img. + * $preview : When set to "", no preview will be generated. Otherwise the specified + * path will be used. + * $link : Link to follow when clicking the image. Default is the full resolution image. + */ + $counters['figure'] = 1; + function includeGraphics($title, $path, $preview="+", $style="", $link="+") { + global $blogentry; + global $counters; + + $title = "Figure " . $counters['figure'] . ". $title"; + + // TODO: External image + if (substr($path, 0, 4) == "http" || $path[0] == "/") { + $preview=""; + $spath=$path; + } + else { + $spath = POSTS_BASE . "img/" . $path; + $fpath = $_SERVER['DOCUMENT_ROOT'] . $spath; + } + + if ($preview == "+") { + $previewPath = POSTS_BASE . "pimg/" . str_replace("/", "_", $path); + $fpreviewPath = $_SERVER['DOCUMENT_ROOT'] . $previewPath; + if (!file_exists($fpreviewPath)) { + preg_match("/^[A-Za-z_\.\-0-9\/]*$/", $fpath, $matches); // SANITIZED! + if (!$matches) { + echo "

SERVER ERROR: Image not valid!

"; + return ; + } + $page=substr($page,0,12); // SECURITY: Max 12 chars + exec("gm convert '$fpath' -resize 640 '$fpreviewPath';"); + } + } + elseif ($preview == "") { + $previewPath = $spath; + } + else { + $previewPath = $preview; + } + + if ($link == "+") + $link = $spath; + + echo '
+ + + +
' . $title . '
+
'; + + return $counters['figure']++; + } + + + /* + * This function will include a video. + * returns : Number of the video for later referencing. + * $url : URL of the video. Autodetects YouTube. Otherwise HTML5 video. + * $title : Display "Video n. $title" below the video. + * $width : Width of the player + */ + $counters['video'] = 1; + function includeVideo($url, $title="", $width=640) { + global $counters; + // TODO: HTML5 video + echo '
'; + echo ''; + echo '
'; + if ($title != "") { + echo 'Video ' . $counters['video'] . ". $title"; + } + return $counters['video']++; + } + + + /* + * This function will add a reference + * returns : Number of the source for later referencing + * $url : URL of the source, if its a number it will not create a new entry. + */ + $meta['sources'] = array(); + $counters['sources'] = 1; + function addSource($url) { + global $counters; + global $meta; + if (is_numeric($url)) { + echo "[" . $url . "]"; + return $url; + } + else { + // Check whether source already exists + $i = 1; + foreach ($meta['sources'] as $v) { + if ($v == $url) { + echo "[" . $i . "]"; + return $i; + } + $i++; + } + // If not found, then add + $meta['sources'][$counters['sources']] = $url; + echo "[" . $counters['sources'] . "]"; + return $counters['sources']++; + } + } +?> diff --git a/style.css b/style.css new file mode 100644 index 0000000..2306cca --- /dev/null +++ b/style.css @@ -0,0 +1,277 @@ +/* ------------- General ------------- */ +body { + padding:0px; + margin:0px; + font-family: sans-serif; + min-width:724px; + background-color: black; + color: white; +} + +/* ------------- Nav bar ------------- */ +nav { + width:100%; + height:50px; + background-color:#151515; + box-shadow: 0px 0px 4px white; + border-bottom: 1px solid #222222; +} +nav ul { + list-style: none; + margin: 0; + padding: 0; + text-align: center; +} +nav li { + display: inline-block; + margin: 0 10px; + margin-top: 4px; + transition: all 0.3s; +} +nav a { + padding-top:12px; + padding-bottom:9px; + text-decoration: none; + display: block; + color: #285064; +} +nav ul a { + /*FIXEDWITH width: 80px;*/ + padding-top:12px; + padding-bottom:14px; + text-decoration: none; + display: block; + color: #d6d6d6; /*#c21234*/ +} +nav a:hover { + color: #ffffff; + border-bottom: 2px solid #ff1234; + margin-bottom: -2px; +} +.selectedMenu { + border-bottom: 2px solid #d91234; + margin-bottom: -2px; +} +.pagetitle { + float: left; + width:auto; + font-family: monospace; + letter-spacing: -2px; + font-size: 20pt; + margin-top: -4px; + padding-bottom: 9px; +} +#navContainer { + max-width: 1280px; + padding:0px; + margin-left: auto; + margin-right: auto; +} + + +/* ------------- Content ------------- */ +#contentContainer { + margin: 10px; +} + +#content { + background-color: black; + max-width: 1280px; + padding:12px; + margin-left: auto; + margin-right: auto; + border-radius: 2px; + border: 1px solid #444444; + text-align:justify; +} + +#footer { + background-color: #333333; + max-width: 1280px; + padding:10px; + padding-left:12px; + padding-right:12px; + border-radius: 2px; + margin-left: auto; + margin-right: auto; + border: 1px solid #eeeeee; + text-align:center; + font-size: 10pt; + color: #eeeeee; + vertical-align: middle; +} + +#footer a { + color: #222222; + text-decoration: none; +} + +/* ------------- Elements ------------- */ +content { + font-size:11pt; +} +content img { + +} +content figure { + font-style: italic; + margin-left:16px; +} +content figcaption { + margin-left: 2px; +} +content .videoframe { + margin-left:16px; + box-shadow: 0px 0px 3px white; + border: 1 px solid #f3f3f3; +} +content vidcaption { + margin-left: 18px; + font-style: italic; +} +content a { + color:#aaaaaa; + text-decoration: none; +} +content pre { + background-color:#dddddd; + padding: 3px; + border-radius: 3px; +} + +/* ------------- Blog ------------- */ +blog .head { + font-size:10pt; + text-align:right; + vertical-align:top; +} +blog .author { + font-style: italic; +} +blog .date { + +} +blog .tags { + font-size: 10pt; + font-style: italic; +} +blog .tags a { + background-color:#222222; + color: white; + padding: 3px; + border-radius: 3px; +} +blog .sources { + font-size: 9pt; + text-align: left; +} +blog h2 { + margin-top:40px; +} +blog img { + width: 640px; + box-shadow: 0px 0px 3px white; + border: 1 px solid #f3f3f3; +} +blog .bloginfoheader { /* Stuff like Search results for 'xx' */ + background-color:gray; + color:#f5f5f5; + border-radius: 4px; + padding:2px; +} +blogheading h1 { + /*margin:0px;*/ +} +blogheading table { + padding:0px; + margin:0px; + margin-bottom:-18px; /* Cheap fix to correct some spacing */ + margin-left:-2px; + margin-top:-2px; + border: 0px; + width:100%; +} +blogheading td { + margin:0px; + padding:0px; +} +blogheading tr { + margin:0px; + padding:0px; +} +blogheading a { + color: inherit; + text-decoration: inherit; +} +.postSeparator { + border:0px; + margin-top: 20px; + /*border-bottom: 1px solid black; + box-shadow: 1px 1px 2px black;*/ +} +.blognav { + margin-top:30px; + margin-left:10px; + margin-right:10px; + width: calc(100% - 20px); +} +.blognav a { + background-color: #cccccc; + border-radius: 10px; + padding: 10px; + border: 1px solid black; + transition-duration: .3s; +} +.blognav a:hover { + background-color: #eeeeee; +} +.post { + background-color:#121212; /* #f2f2f2 */ + border-radius: 2px; + border: 1px solid #cccccc; + margin: -2px; + padding: 4px; +} +.sourceSeparator { + border:none; + border-bottom: 1px solid #bbbbbb; +} + +/* ------------- Entries ------------- */ +.pageDetailsHeading { + font-size:1.5em; + font-weight: bold; + margin: 0.3em; + margin-left: 0px; + cursor: pointer; +} +.listing { + width:100%; +} +.listing td { + padding-left: 10px; + padding-right: 10px; +} +.listing .previewImage { + padding-left: 20px; +} + +/* ------------- Generic elements ------------- */ +.code { + font-family: monospace; + background: #080808; + border: white dashed 1px; + padding: 3px; + word-wrap: break-word; + text-align: left; + /*white-space: pre-wrap;*/ + /*line-height: 1.8em;*/ +} +code { + font-family: monospace; + background: #080808; + border: white dashed 1px; + padding: 2px; + line-height: 1.8em; +} + diff --git a/userstyle.css b/userstyle.css new file mode 100644 index 0000000..e69de29