From bec23e6b70b0d9b613dc21f90753901293d598df Mon Sep 17 00:00:00 2001 From: Thibaut Date: Sat, 14 Dec 2013 22:52:15 +0000 Subject: [PATCH] Add PostgreSQL documentation --- assets/images/icons.png | Bin 12712 -> 13448 bytes assets/images/icons@2x.png | Bin 32897 -> 35249 bytes .../templates/pages/about_tmpl.coffee | 5 + .../templates/pages/news_tmpl.coffee | 5 +- assets/stylesheets/application.css.scss | 1 + assets/stylesheets/global/_icons.scss | 1 + assets/stylesheets/pages/_postgres.scss | 13 ++ lib/docs/filters/postgresql/clean_html.rb | 44 +++++ lib/docs/filters/postgresql/clean_nav.rb | 25 +++ lib/docs/filters/postgresql/entries.rb | 153 ++++++++++++++++++ lib/docs/scrapers/postgresql.rb | 55 +++++++ public/icons/docs/postgresql/16.png | Bin 0 -> 833 bytes public/icons/docs/postgresql/16@2x.png | Bin 0 -> 2442 bytes public/icons/docs/postgresql/SOURCE | 1 + 14 files changed, 302 insertions(+), 1 deletion(-) create mode 100644 assets/stylesheets/pages/_postgres.scss create mode 100644 lib/docs/filters/postgresql/clean_html.rb create mode 100644 lib/docs/filters/postgresql/clean_nav.rb create mode 100644 lib/docs/filters/postgresql/entries.rb create mode 100644 lib/docs/scrapers/postgresql.rb create mode 100644 public/icons/docs/postgresql/16.png create mode 100644 public/icons/docs/postgresql/16@2x.png create mode 100644 public/icons/docs/postgresql/SOURCE diff --git a/assets/images/icons.png b/assets/images/icons.png index 20187782fcf3e3f1fe75ed6d35aca794827371d7..2b84306a494e7913fb543144e019be8c78e7a0d6 100644 GIT binary patch delta 3705 zcmV-<4uNz%R4casV@{ zcAz(+Z=UEE;MVJPy8mu~f4^lUl${-`%>=0qlIzkDbt-0YiWbS zY5gJ?5zlx|sy zI2R{|$NgdT@(?xCe-LjY=iGT<6@6tUN~#@@e0|ZMG?0#?EP(e}1LfcMx2}HSwCg<; z7w|MERr0t#PlO#}(rl<^*WvC8dBq{@?0pz>@J_~S&>=-%m^oZfh zef7q}e-zb0=Q)rPFvvSlD#h9DJ8;6?14&c3216hxA<>S;e;nTxILg+*-k6%>G~Y32 zE?9k>?}BB8bKrUM^EjIItX`$h3tCj(4Z!|8uKfG{))n!G+`IkRT(kzQmo;zx6crzs z$&M%tWDb-2_A3uW_=rKW2-1NOgP6Ul3QV9t5qtQ9nGE4Drbb77(e9Df_$fXG1zubG z+$W#Hr#wB8e?}>sLZ@;`b`D6GG!5CGEkNOh#Yk8<=U)IFvz`4|c=B?{ah}P0&+(=+ zUw`Z3`9nLiHHPEPWIf!Sq{kHKs>z~<4M7aed7bed()q(sBpiXWx@xE}(7;_2Z9E#UhqI$K9;6uy#(Eo=GdoSJnF}#- zOg9b9J#u1e;vcOo$o_aCBXO9{BwJ5olE+VFe`s!G63nN_e6+{b{YPKU^6@F(6t1i+ zj5W{*-mk~6P8vSEE>%V8daT;u@_@$;##eMS@ay##3x`})%UA@bX4pK@yk^5oV5(0uTuCA8*#L-3>KmJOZV-4p44 zJ8^COlYKX9>w@c_{kFOBS?9`>g0dRPf622=we?Lt0My@$BUpH#nC?^1%EGhXmIb?S zj)DHy8MYe|Lf_~|m$tlNFIcs-#_5L8TFj#PMFa|uGKU4JB%Jhr6G5V4R zBZcL4W_rQ(9hA*z6^JmLZYWE}AR7X)4A=V;vM33Q=vQSJPr?ytmEV*fH{WDQr9<2oMV@ z0Gsz`V)6C^uyFIoq!qy|I8q?2J@%1;u_ZJfZvM#}+C_n8L!_f0PWH|2_(QkzAPpIjjK)roiVIa^Eh~Ya@FkWn5AXT0i37)O@HZ}Ar^G!=?j_5#$xF``w7g$MJ~8M z-w6-BR-r953D2@JfAH(v8TfgWHg1m{iJNBnI5SE|nkEuRlXTUZ^UqzWv~>^S09vlx zi_n~Nn7!r)Y}ucVeYqu=up)>Q0eh;E`*Vu1d{;PjNlGY<{qdlwWyjk$4gb>eSsc6* z1TPoUsN>QT6Trb+pTNO0XW^|rL^}8*8kRrBqa{GyN5Fm8e^PmPFRRN{81iBse+gR? zY0dZDuEJ+8Lo74W$( z{~TO41Y=u#e;(EZ9PR`lertfU{EGf>T*<`;eehB%Cu~eiw*D$E+2YH?$>wVgCRwgM z76*pCl zF~CI=F|rLc5ieFpG65~rQo$81Wn9q{AWvTdM|Jo}f1qLbI)_Q_zT~<<>^PhaI}f)0MbLH_yrROKbL7p3lO;GP3;XCl~H?{xsV_b!@qcof~P zf&+cWf9bQ7hOOx$0m0B=SSZ&C&Pj4t51+(Xma%szOJR|56Rf55q}j&*BnLhy!CR|LTVz%tCemm# ze~D`(5wIbLhNR`=L0#Q`-n$C>ZJ8@sc>g=DBqkBKCumv&G`JJI&k5Wo_+?1LM0Lk>lM5IbFj^L}?$nM}2hVYgp~$D=44$<{J4Lm;K4BXyWma$~Hv zDl*A|=Lz5$5&>iD9*)z#izXsj(~HXCXTNhi;jwY9f9 z-oE$Gn!uzC{C(>I*iv`4Tt!Z#q<;R#;f577+ zMVEi}7(qK_ph<4iMWva(^rEpymaV73u+WZ@$d$}BQ?ZQFTXx1shpUOny8Mn59e$sa znp-WwdGbaz|2`5vVP63hXd zxA7oa>D>9f0;F0Oh}!AEohby*l7q*o%A^)Gqqqk{{Z)t@Jen8#y9)Cudoe*Sjv0ofA2DuZdnL-g38L<(leh95+-`lfQDq9sdhac=@L~m$d;{vMmZ1Zr#h^z2o>F XB8{STe4=8s00000NkvXXu0mjf=MyFL delta 2964 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�!Z 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

BQM_KN3p*W`(Rvv^5x0oBkKyCF@8KJZ z)kCRxx(k)eUPfg;Tj>5Alfu_fGqxaJ*-CdO$6?mfLG{>Z@T>>$B-KN)>h&Y+WfA4{ zCgdFnP^iLR51K4}?$l?0Lj6%H#n2pu!;JI`Ph`z`!m=#ZI#qlXO zS>@PRD7NqTb9TJTVO(zHmC(s6Srlp$PRz^eKs0qsy7&_H^88JId7tR0>17WpO3cBhgt#71wf%txKoHruA!|8H!DoVL18LtnD0))h@{A2 zvuNoFXz2$GEnNW25HhF*fOou5A}gy#8R?oV8o5%fW&hjvP2Wx|-p8Qwbjq zmhOwLD4shApy`zG`H)GxQp65-yxej}0lX0aZz#YUh!U#z2CE)XR#&1-PXO3)h6K>i zChsdCv}hgdfR`l$E^3HCivL+@N>_#ZPF;#&G9VMPXU!0>UacdcImb1 z_MBxDtMF{ca51br-wD-ZaB)uxSGI5IYiHb@80h38kJi2LN2rhD<;RCi_ngsGy1!rD zhI^sGv>5j#1su6dyh7q{P+ZC_icQXDgJPKfX4L?okHHa-T(OI=^bvpIdx`&3*;q9? z-qgV%)ym51CdZ(^Ie>kA509%-K9Th;F*shFY90^J{A*V|5wEc7vC$YKtKKkHJz+Ee zAFEz3gX(294}ZjaJ{urZMgO1jZJ z$IsCifq6yDjb<$xj|_h*)X=H=`M4gAxYDQ%y0&lE=FzP?_w;Yf+otDer6=IyvwmZI z_fT$88BLlvk)}`ifXa%Cq;r`UF&hqCyxkDP%rpwHaA#Zn#}iiDdzVJl8$!p|X=>mqbh8;}zj-D-_HGBp3^YqZJt* z)Qw#)!^aS^Lh^j40GB`Kud`7R3d#VU0f=bx#wJ8SxIJ*&R*Fu_uV^{WkJ{pR*4qmM zDDUn+Xv(AsaNy+rVq>0qj(UI~C z3h8XxZQ2!+tWUt$IF?l-n- zl*tERQKMCLZFw#VZrF2C`26k*Lj$`n*t5IK$3eTj=I&|-)r&;D!UqUY%1{~Y^%~`L zzlwj|c~n2zgfcc&VMN zUBa5%1cx@Weaxp*Bt?`;1jvpY8k^*JF(Po5;lp)2---AJZP}I1n>l6%T)uw=Uhhb7 z^Tz#DVksf)k2;KZz@^A$!*% z(Z3FaIE0GB2Uh@}-ZJ=of;a-0a zakgr$`p=i~Hd+0efPo@j9C*BRGfMl4<`yIfa`0kqT|E8(+z1$e1`uXeH>1my|`h(EH5g_(ct@A7QN zb77e2d?$7}E~uN?PFJ_Yi5E+jQVj(_zb7JobX~S+!BgyT@Vnql07N*A2xqH4H9Mc$ zyw>U-tEaffiw9u-s0a}%SF7Gz%6KIQ&R1Vf(kl7V0ARYCaJs)3gwF#$rBk+R2N1tx zH8XF|JO`>}@Nmu3ux7TA46c9gueZ-CAo}C%kEWFzxtNKpaGjppu5iGe@!pT2p9WQ? zrEBzmY|tQ)6_ge5#RTxy@Kr`zX|;vQ_`Ej&)XD(*F@QQsbNAqTJU0jhe819SH4ANK zJr(M9K2(ZPsub@L&v$C4#$M0ky*n~YsyBN5DOQtrM~~xKm7dc!0Kk8Z(orn?cRr`U z*!1$yJt1sBRw(Al7Yo4tO`&=Z0H07jlo#L=q4I0h@k$P^$)6zSd~TOW{EK@Y5CT3v zQLTCoi`6Zxxm|x4iv8;5wqNXVwC$jJzDua#rB{PU{N~pIEGBh*&%*qvLGA7Y5bKK-~jycL7`y z9(PiD%gOlIMfDt(cChs*KFY;AAbhA*_20KdcX37SYwhk<(Xk|b+j1wzrkCY+yS01~ a;QJTeJ|`bGys5VU0000f4;h@$LPLB)304 z$M+o9b=?iMcf1+vvWo%4>OxtE{HkKdJQ={Z!Iwna-= z2@$s86THp9_r{$I1|Uz6NPjPY?7No%NKYzN;9fD9V=;Ir{T`#*Q2K~!I94CtZsyQA z&G#tPx{+A=cDnjYwDX!@g6Mx-(3>2z=dX$&WUvv4jpBk*T#K&a$@Ov3~K8H@}<*$$XyRWZn=>PavF3a*umkug$~+6 zhx<6Tn_Cxo-g15^r3{o0{5=@bDP=t(VuxyFNZ+@n?$N zgWZeWljC09EtqrRnfeWY96S9*WpgJEBPXKT9uSZnc~ zqxxFK`?OSwwu%)B610^zMrdmIHE9Th>xVk+w5F?Dd^KOk>cCe9R`@H${o8|qFnI76 z_rCZdmlo>x{3T-dV)tbCent4?o4gi3tT^A}+U!r(RSfA{R?){rddb}imE9e1chy&@ z-jR!|v!>!gKW~40Yo>#Jy2{AYQ9y={A`-M!5U#8CaHGB`ZKa-`5l1n}u)V=-ZOd;M z3{h5Yh_-Y?xTPyXJGvsn$s0TU-@?A>BLx*t8HVDINt1`8XyQ=pn&^+B3H~S?HxxTY zzk}UV#-e!YI24Q=jJ)B4k^lZXC>Z@Nc6{iMd{Xw1LCAmV?Td^q-pF?FZUK-5bE78k z{iP7Hdvh-dnd<@20r)R}3Jlo$y_Zw%2~%|(mB{0WF2^4;;P~VE9Dh=ss^6fcS{JCR&TldlBcQcb-dYn*ZKkGWFasf`ll!Bv z4laCf2Pc1iorMb@Y3<6V+I8WR=$hHJ2fyp%5&YMSKH~Sy8OQIM=Fjh+JAp5rK9b-4 z>2QAcjQ9D1iEs1Yh6M0+)%W19nkl+3JD8BHM;e6hBe}3!OxA?5#Z}I5^{P+~F zu6%~0CqGBuvYvZ3j6MukHy^uB+kEW8*DLy)dT)P4iv`<%gMy_*2E^YXc5m)iBI5~s zt?nN=RCs#ie^9KWib63bEjEy^KVYQDA2LzKH>B^|Yv6l{938;&WyciwZx=7Bj@MAD zP1aOIqC^dm+N#*3rH<7S4e3&SaosXwUFlpi?NJQAXd5>^w1bP3;KK&erj9O1vGX8# zBE^5+6G_%xkZkLY?R1{x!2C~fIx`A2boTnnq21W~`55e-H3oZTjmFmtKF0anWL(IP z$2aSyW8Z@DD4hB(w$oQ0K{Wv}GqbMy6#7abn(bYf%X``;F zZli%FRvBm}G5{kiT@XazZS3HTHFS-&bwg@rPXe$}oxMl|q9uLq;DrOT=iuS3oA`hE zx{mWf_l-pzEe>9K}Boz_PNk7wNSFn9=Bb4=!JHD}Afa=^RZZWa@JD zTL`|b1ReqS1VRF^$Up%l^xZyk!2`OAsF*Q9TK>L|^kf$!eCKS8<4(pnVy*uuSzn`i zqmGDQM*yzW74a(xzyOK(YX*N{Fs0nJ1mS7|FrkzC6X&z{LXwp$;@Wl=QgE7MH{tcp zQ4`7WDj*9f&$F{8Bwl#UqQ16&w+=5olTDcv~990L)>MIiaBZ-L*lVUyn`oeZKR{Phzk~o>rYFW?iMWIS6l%Ve7LEwBc10SwTyiH5 zayoA$w0A_l{}>z(3U7aauZ=BsjQI$44J}CQYEQihk+MWLy%Gyn5i_ojZ-&?dzMcCuRRd zZS@1>Po9FDQKNsT{<}dC?x%(&9A~q(;L@%l99cC71s@E;_76uP^R2!FppCR?{kPt1 ze9X%Mq}2OP>>(^Xb`5h0!dKBe(&vY+z;kCg9Cnn$k>pf#8TJJiPqzU0*!koDv^}$a z#pN_@4J7K(_=Mm~)fZgwc?e}rsIPz=a>~NCt#P9uSGs@K&P-aMD=$Eor>{(qDq$<7 z<}KO^$kvj_HZ3`6yq4m<Ma(n5TnJ_r;w{95qQZAKpBLjXCcgKMKvPF;rxa* zs7y)ZvlKagD}k4#Ezf6a$xG8T<)q1CIX+P=hd6(+Tz!;SUK%NuuM5*s#zrN@bqv6b zmd;2e_e*AthdnhOF5XD%?t?@(4;oB&LRcFM{E(3Jobw6M2;;GcD4a}7NBW?*5p3QL zL1t~R(a02Q4O(OG!U-r#UxV+%*P?XUEbN*(9Jw^Co@3gWf<>c34X8uCVLCSa1&$X^ z4Mcw!iMT&QL*`$lx<*05Fx5#sGZA3AeUZLWUxTeSLcf-RO~7GarO- zTwR>5GJ}mLNn=P6n(};*rUKS!DoIz77HNN})UVf2LM+G4VE`uDxwA0~!RL-tn$M+r zbw_H~?nrX;MvSdJ3dT)j=ruZ@^eN|Kar;sw!Yr(Dwe$!MEMI~3daV#)P2gG)+$L?2 zHn0ayrGAdXn?Ay!)l;x{-Urw{br|NEcWMBz)q5Lyn2ZhOpKU1HtMVkGD{!orD4^=hqfCS*c-Ivh034oM}r4IS0z5Z?hr%ah5 z1FNZ;0qynv9Nk+05P)3agwc^evI@`xqC5(&VhXCNdA5N5YlM7k=6?Y7pq zbNWZ%Q8muTM^}d{aC|JK+9Wako|u0_JYAy*z7Wy|u_D%pm9R`xg%4MupP`jF24E^n zy+Y?p&4;5W(mc8&g&<7s(iI7gZn$ys)QeMZeZ%{MD+94n&j>N}vr+cW2(@6N9b1HU zu%_1?5z@gD$HG3xiTIf)-7pFJS4_bEMdPucU1w=y{TDL*+4|3TR0Qm2tiXSwk`Y+8 zcLbJ_7M2V_@r5Wn9W_WQJA=;;HV@!za>(w5<*=8zU*RQoz1lwexWT_2K#tKtM;n$^vNTR!PMXMZBN>2^HZ)*n0Fsia7EG{qAoue` zoSh@~&tC`@{Il>icD=RK5hr>1Ak4f2BCYKZ-oXapl(rdwVI6JhwJoLMw#ffz7|v{6 zf^UMSpmhDm*gJa+<{CHFfTp8E)1R&XT91rG&t(e;yx~|>JW|m7UH*Ug@%sL!p8fl< z?g3UFyFidtHQRuE_VpFG?jYBb)qj+J9rMobX0_*=1z__a(d*a!a{_=Ail;+2WrgUA zutc4!4&g9AYAH)MDl0Jf9!7B7TMWQ;9i5Tl;Eg!*&e-?a zY@FYgi@Z@|kmT-#n`h24+Fsaru&6xnHA>g4N7jJBh#>ePDP>1k*&%}93u7V}L)uv( z*3|`NnE^N+Hxu84Or<(-L<4|EgTmFRzB}{m2*zksIEF_~WA1+^z_)PsdkEM&7C+y= z_!NMb?_8lKqa1U7rT&|+|8gUIG61V!pLc#GN6`Wx23?r<*@HMujt|sR!BTRpRpeeW z2*dRnAvBanije~1l*#$*?Qk({4az6Kjg$R4p=^jdPQB%VvqQV^1vaf8hLDqn5_mz( z^=Od2jw_rz5_*>iMUiepLEX6{X+GU#UCeRFu?@a)YJ)-x{YN1hTwMcvidfH}(^A1oQh>G!f|L}b z(RBX=j=O(OS9<}#4h{&QSzt1)f*f8FfSdGhD_y>VQs!0wQWbdKS6?%8%kz< zfoO8S*v?Lf>EuAK9S~(LfG8-$%mV5C>EB))hC_i<2*4qj-`0*CaMY&pX5*rstN(02 zU5&Yg?_+U^EdBlmTTZQM3LmK+S!Yk-i(je#=8=DT7gao||8`cuG5^9H`|JxHTL5eT z@Yb3|(!*{R{4VQONHW#JYF#BP5y=sZ1d&7$>nP=JQkKJkS(I+0Lb1PtF?JcKpu}7U z#U^4D8`IF)NQ@HF&Q_w@P)&t82H!dXK4q*T@Rn<cx0xH^e!*AeI`D7y>bx zK#U?NBMC&7mcuM;a6D!?4h2j>;fF&Snh?`b!TSXOKZuZt(r+}p7AzGSkHrKZNvQvh zT+Tz&;H5R#_&ufHLkzU%HJ|ha4WK>P09tY^x-vFQ!=1~2&oEngvK?A7!b;F@$OJ#qM zH49+vqes~C&QL^KbwYx37bLiP3T_zh%#T~pvmaaY~#`4m#7YWtk$E#%LfO2a&KPAFw8C*fiH`OW6mz>Vs7llgPNZntKxPU zEy{QJlMz3>7bfwQ}zNfA9 zC{R;b8b|;#@Rn+;VYQBm0AP^10-vd6+SmXOAuY&^^Ns-O~Nge{&yX9`ix|aUbN7cAoIWibJ20 zvt5SEj`HS2-?OE+Cvq;i2FHKx7e1B&@Q)nBH2?W;9>ZL+(a5{~eSgI7AcdILE5Y( zhXgH!npIjV{0efvWdz?Uf^V%ZxgjY?ONq}@SHX6XYB5Ja016uszM_A%;I)>ni1Fx( zt#1#c?Ne7|ur=?1_wS>4<}BR5T7~jmyM>{3vS&9Wx_TkO#U1f3%neB_E!#OD!QBmC zub4>9$OP=2ISPw95P&ZV@8khGT~qzayJhu7SAx$o%@6Nx?TzeX?#TVl9XX`@@0~Dd z?^@X9Ulp9Kd6mmV_1}Lb2H{Pc9p`LY0Biv8f|GIaIcHPcF5O>?>N|XGc^O}G?u4}F z!~yBOq72;2iN?7vC)Fpas_@ZbMMScdjfUm4`e<5GOAyJ`rHX0Of|!$%kV#4r%hd&H zsnjy(TdAWez_&(6nLt#crbem0SW5$YC8BH@fB^*H5)&J2pgMnWeFuB&{CHwR>Xpi1 zYd#9bPef7|5A2-y5e=`q5rAEh?CwpUc@c=71R_h#T?kG`Y#ZJm2LdLbWZoF;pECxF zI@-S&K#zDoH}5n*p1~&*bHd>{z8Ia`3!}G_a(mYF-?3(j_0H?P?YEcvy^0+3EBaY) zKi-L>cvAs<`4WFy^Pe{lWb;dLr#rVgyh~phdwsgp-HBg`>uYD?+LB4AnllPlX87a! ztfA7qE*)!Qm6fFNno4Ym4Fnz{NWo$SY!WH(o5Turp`;kGLTw7cND%UC$N`t@s9_z0 z?=gVXm=J&m^fhtBKr^-}fN4W%?&tR|)|%U)c)_A(>c4;IS3ycw1R&Ab1*x9iNbA-E zDP4V#+z4V4ftc8ZAQV7!N8yb3uxrj}?3_LV2j-5&5-W!n1L&3JH?@0qKQskU=7b(3 z&&+=4LJrBT<)r#Y-F%SZ-JL)r5r~P-p2+O)i=r<^pu6|89jO-!>4Bh zh~$Q;1R`_7oUwzE|H&|Hr{kPk#?o<3dcf2Yn->6RPLE#jO6&cDtp0nE7@Xc|zF)Qg z_{RZ^lc+t4*HuRf)n(awBI%FL#yIU_f|GxaMksSMmKK{yY7#WmrSW1F0#E^AA`amM zV0dE+-Y5V_^FGoFu`+?Fj4cFUj;1WGn{r!F|(N`fztv{+kCdcaH@_pD7P%K%L1 zJs8Ea7vtNIXe9Uyz~w_nUYdesgXlYzl_*`g5*5@n9}ZX{%n&nr_GA#!>mGs=ru%>P zLheUHv30@_WRH0VSwjb6b3Z@KF|v6cK(7oh%dY8t>X^%Q+x%j6CwZs)`o0bTTs8oI zr(^)i^qK&a>E!_Gs#YcufXQ@dD4w7xqScUZtqf7xK_7?P>+#vTTD1uxb;J=|ks^5k zz+eK9t@8$vHZb@a#awbb{f&Gb4HSP#G*M!ph0@kK*wI>x;8UbQv^djEn((4O_kJJrGAj@9DZ7_~(FdPwi{oEyHhL*Yw^eywm!8|EzzyW%NDa zo$8xl7}!Un1;9TJV49vt337Vbyn$+Qn>J!9jh!xT= zhY->x0&o*Kplo|p5W$%tRz*Jj{tk&4yA3q4*H8xsjV1WTR1c@j4RO$14;%E9Fjte4 zZZp-yBbSc-WdJU=cE(a#hFgC`bHG&|zPNYmzry^lzOGKF_4sEbZ4_TqBe>+r_;_UW z>Vd+E6OcDz7&6$oUv~7e7ePq%U>Yga(Tg2y5|rA>1EB=^484wcAr#Kx&PpC@J=Ad&-qRe!FdQC*dl zY5f@+fe_fuRF5*e38|s zH_|BerZ_bma7wmuM+$#kY11po1Bsp7r5ifB@UP*~9RGX(|L#X~WN2`$67)nT6AiTx zOiwHbYOO^}Y3g-p9GwYKQ-6@8slmsJlzD18_)rnY2WfEpMv+|oI!#4BNJo{A(ovJf zPzq0^S}#*ygd9UL3XQd}-&7Yz$@R)C3{hcagrDrpaJNeb-12|4LP1CUhpFxKT%G{v z$S<~X;+I%-=GS=j=BxkvUsV717d#+6WY;F5_tY`pX2&ck?K0h_Bbw)>2NulXsrKX3 zyn66S_8xqajXO{9@hNspo{yDg@5#s7xj$m}ovvZAhWoe2oA7X=Py?}7jFI-qXzEVG z%p?e*Ym$bv4%-9y8q+nwk1et$WBdmRAVa<1Qk8arNOHGHn z2hv@GJ@r9! z)Y2!)K+S(^la7X6l)k1#tiDF8jCML&r)aI0dr2@D{%TEAHlIC;GyH8mgimmZs87J2 zS$$UQF7{nsbhX#gows@{DY)yiDF1f%1-Uo7&d<5%HFryn=iKbK{|ahq`soj?8DMaM zbn1RzNiVJ?{x`#CVTo$r)q9itR+iNDSy2q%<-32-YiS{REG~f0!aQ{UYCF2k&w=;6 zt?-<^86IC|!F^Wx4=yv){HXn?_^>V7)?xR&_ei@vM(O!iw< zg5jGEAexS2PK`Z`o=bM1$D(|6U-$$*uQ}Q9Wbl2Ffi5%C;5sAa0>?q_&xY^sg0RB6 zP3wPiHf{Yc+O}PC*4BJ%nU%RY*AlNk`~r&;nDbTMtOkq!-md|r-3I4dkb|x=_-1Fp zGu&DU?9!tIC zd`;oo{5*XBmk6h+ai4LoIUe=boz7tUD z_vnJFpH4z0P5a9&O~AfCXJdYnuJhRMaV_!3qIbaVY~N*t=)0l_(_%~UZs0CZ)A4@- z_|oCp6uxQkaGVl5{dJ|?NB#9TALTfuzY4-rw)&#;*5-pLy>32h)AsJAPHl04;5uz% zj`Q7I@$<&jV8P$N2NqYSPsVB4_jF}HPr%+KWzlDEAMZ?EUrYS<=(VgcyXVrK)O6%C z=WB#-8@%UkX$l`XU+PovIZTa({l|X<;A^b;9t||u@@GSM&eqK4oNc>BXDv<2&bM!c zi|t$EG^N_IcCGNExq$%Kl_}$KGi)R7VP1pgZtLbbce5b(&ok=WW;TDo=ki$+ zoIWMz`y>_)Q(|EEQN$kt@L_-bu}y2fXCb`TOJq~sN6)!tfPVTPf$+4YrI?&*=vmvg zIRr}eC93Nxdb;D<;(7QbBL#PNZpWQ%n+4aa@E`OT#xer*c6K_-2m7I{ts%}>nc*Zs zcc_Cg3h4cMJvGF%5@SCBOtpU_Dhb3hw&wQ<#I5XpaCTPWTHU_&AO_&=B?)M|P-Z28K zm>}Fn5M~j8D+s_qT@`F0Adhx5Vd-1A&kuBuUG#gI#=0&4pA3ICtLwLVUlPFwHg4%1 z&}7iuIO`+#dk#J}>ytU3^E1vz@I4RUwT}qA38W8ztD}J{BUk@+_+)8Vzp~t%Q+>KS z)|>QuYQjV#9i$Kl1?Gl0N&uZH_obNmOn}uy#A&u^r&{`WQMmjA3 z5_~p&0|~yBjqp*&D-4Y&wKNbK|%r6)sfw3GhveYiK$qN5k&p$j1P7o)kU} zHzs8_xZZf6Y7D{mKEXEvxIDD%RcgLpalzzs7M#jc%X5DNBwzei2-69MWCDQ!kwn*R zX8Jg2VT>OMBAV^tbo<5zgw=Qs9dTpzaycB>qlR4da5_^4w zKF=ekmEDIypKh$f?st*^AYt#sxOxH}QO zl{kNADxofaAZE-AB8G|~{-`!*%{UOhy+3!~4?K6z-Q4kOE1u8x*>UjP!ymr({(Ro= z=Zj`zc^8B^!RsA4LG^&`)`K7vnF)ayjb&BQA%McbpfD`X@q7@Dw}y8(fCWXwt{5(w z7v+hY?{5^pV8k+b7Xa*c`1u|H?0GL6?sb0%qrMi(dUj;tOlTAu&dUG)}7)td|W zvH;%XFf)T@TK-~|6Lq>-kuuTV0QD$vCRKcfP_<(^rZkfE!IuBv;21F?xXrXTRc;!Xu za2Ju$@KC*ZP`%kM)oYxJP6vN{sY29Gv^vZIPq*g=-Rmm=5z)AXyL3d$>*q1{=};@c zISnW@3U?H7NiD`IyID3BU$d$3vfmws5&2Pu%{323w-J8_EdDV7S07|om%)-3b%Nrg&c0a9JzS_?@54{4e;imS@nOWkm?E1kSy?@ zq5#17)#HD7g;bA>#xqj&a!B>qXaGJ^y~!@sYnUit8v$Qzo4A}5pvYnf z`vgF3YvGfHU9Ylfd~`>hO5sYq7!WchWKb@u_Br}Yy$Z}4-WxqeG+qf*sG+I*^SB<4 z_?|M@D|3TA29EbW2hE6E0H8B&0e~el0G!>Y>T#%i)v0B>;~BM2vaegm7W(?vp2)89t6%0APUxa0TFdNq7yF5wG}Gy)>2T#R0xi zfG-lS5d{jWClG%+a)a)$`cd7^R07FO`vV`B)gz-Lm&$t|L0J`TqESmqM(t)c_J$i7 zB>tJ#d$F0}vCMFm>Cb{)mA1id1boe1$|ukD5rCwC7`ZCd<4}1at6q1!(v*ds4){p* z(xvK6kg69$sz>lqeaF>V(!3EW`t5nZ3R7THUAg;_bi>3^88al-c2+?EB;zCTc;z#)dA^nW6 zqbC~e=Ad>z;L}v;h`6^9RM0N?$d z!KW>2aPV+IQvg_MNDX;B`+B<3C}BJzk6H0`0GK~}3HN%ZWW-~m6}|i~sGeODDmQtC z%9DQpUlOjtj@bH!bh(ke2C&Bw4a3)q`Z7g%*kUrwg>sbv#J@_Q z1O+u<5HfuIRHSCs(14{-x06tTHO-4<&KFgUkn14@H6RcIJ~~mY3_y{(*}{xjFcf<&VTN~0Lk!~-z51`jm8oGS zs9qIR&s(UhX~0)3ZuH+DVl#vq`1Jb!7O5E`mIP53zY6f#pn7%a-vQip0Cx_r+r-6@ vOYn7sG63b67m!Csx#$T99coqd`cKxsZ)^pRO?Qe>00000NkvXXu0mjfM0b>0 diff --git a/assets/javascripts/templates/pages/about_tmpl.coffee b/assets/javascripts/templates/pages/about_tmpl.coffee index df890842..33d1e1c4 100644 --- a/assets/javascripts/templates/pages/about_tmpl.coffee +++ b/assets/javascripts/templates/pages/about_tmpl.coffee @@ -143,6 +143,11 @@ credits = [ '1997-2013 The PHP Documentation Group', 'CC BY', 'http://creativecommons.org/licenses/by/3.0/' + ], [ + 'PostgreSQL', + '1996-2013 The PostgreSQL Global Development Group
© 1994 The Regents of the University of California', + 'PostgreSQL', + 'http://www.postgresql.org/about/licence/' ], [ 'Python', '1990-2013 Python Software Foundation
Python is a trademark of the Python Software Foundation.', diff --git a/assets/javascripts/templates/pages/news_tmpl.coffee b/assets/javascripts/templates/pages/news_tmpl.coffee index 90266907..5f6b2fb5 100644 --- a/assets/javascripts/templates/pages/news_tmpl.coffee +++ b/assets/javascripts/templates/pages/news_tmpl.coffee @@ -24,7 +24,10 @@ newsItem = (date, news) -> result app.news = [ - [ 1386892800000, # December 13, 2013 + [ 1386979200000, # December 14, 2013 + """ New PostgreSQL documentation """ + ], [ + 1386892800000, # December 13, 2013 """ New Git and Redis documentations """ ], [ 1385424000000, # November 26, 2013 diff --git a/assets/stylesheets/application.css.scss b/assets/stylesheets/application.css.scss index 4a9ed2ee..e88e3890 100644 --- a/assets/stylesheets/application.css.scss +++ b/assets/stylesheets/application.css.scss @@ -37,6 +37,7 @@ 'pages/mdn', 'pages/node', 'pages/php', + 'pages/postgres', 'pages/rdoc', 'pages/redis', 'pages/rfc', diff --git a/assets/stylesheets/global/_icons.scss b/assets/stylesheets/global/_icons.scss index 3c8f7bb1..897d5224 100644 --- a/assets/stylesheets/global/_icons.scss +++ b/assets/stylesheets/global/_icons.scss @@ -44,3 +44,4 @@ ._icon-python:before { background-position: 0 -6rem; } ._icon-git:before { background-position: -1rem -6rem; } ._icon-redis:before { background-position: -2rem -6rem; } +._icon-postgresql:before { background-position: -3rem -6rem; } diff --git a/assets/stylesheets/pages/_postgres.scss b/assets/stylesheets/pages/_postgres.scss new file mode 100644 index 00000000..da8dc08a --- /dev/null +++ b/assets/stylesheets/pages/_postgres.scss @@ -0,0 +1,13 @@ +._postgres { + padding-left: 1rem; + + h1, h1 ~ p, h2 { margin-left: -1rem; } + h2 { @extend %block-heading; } + + .VARIABLELIST dt { @extend %block-label, %label-blue; } + + blockquote.NOTE, blockquote.IMPORTANT { @extend %note; } + blockquote.TIP { @extend %note, %note-green; } + + p > code { @extend %label; } +} diff --git a/lib/docs/filters/postgresql/clean_html.rb b/lib/docs/filters/postgresql/clean_html.rb new file mode 100644 index 00000000..8c9a9f45 --- /dev/null +++ b/lib/docs/filters/postgresql/clean_html.rb @@ -0,0 +1,44 @@ +module Docs + class Postgresql + class CleanHtmlFilter < Filter + def call + root_page? ? root : other + doc + end + + def root + doc.inner_html = ' ' + end + + def other + css('a[name]').each do |node| + node.parent['id'] = node['name'] + node.before(node.children).remove + end + + css('div.SECT1', 'pre > kbd', 'tt > code', 'h1 > tt').each do |node| + node.before(node.children).remove + end + + css('table').each do |node| + node.remove_attribute 'border' + node.remove_attribute 'width' + end + + css('td').each do |node| + node.remove_attribute 'align' + node.remove_attribute 'valign' + end + + css('tt').each do |node| + node.name = 'code' + end + + css('.REFSYNOPSISDIV > p').each do |node| + node.name = 'pre' + node.content = node.content + end + end + end + end +end diff --git a/lib/docs/filters/postgresql/clean_nav.rb b/lib/docs/filters/postgresql/clean_nav.rb new file mode 100644 index 00000000..0f6c7090 --- /dev/null +++ b/lib/docs/filters/postgresql/clean_nav.rb @@ -0,0 +1,25 @@ +module Docs + class Postgresql + class CleanNavFilter < Filter + def call + extract_up_path + extract_chapter + css('.NAVHEADER', '.NAVFOOTER').remove + doc + end + + def extract_up_path + if node = at_css('.NAVHEADER a[accesskey="U"]') + result[:pg_up_path] = node['href'] + end + end + + def extract_chapter + return unless text = at_css('.NAVHEADER td[align="center"]').content + return unless match = text.match(/\AChapter (\d+)\. (.+)\z/) + result[:pg_chapter] = match[1].to_i + result[:pg_chapter_name] = match[2] + end + end + end +end diff --git a/lib/docs/filters/postgresql/entries.rb b/lib/docs/filters/postgresql/entries.rb new file mode 100644 index 00000000..1436e5d4 --- /dev/null +++ b/lib/docs/filters/postgresql/entries.rb @@ -0,0 +1,153 @@ +module Docs + class Postgresql + class EntriesFilter < Docs::EntriesFilter + REPLACE_NAMES = { + 'Sorting Rows' => 'ORDER BY', + 'Select Lists' => 'SELECT Lists', + 'Data Type Formatting Functions' => 'Formatting Functions', + 'Enum Support Functions' => 'Enum Functions', + 'Row and Array Comparisons' => 'Array Comparisons', + 'Sequence Manipulation Functions' => 'Sequence Functions', + 'System Administration Functions' => 'Administration Functions', + 'System Information Functions' => 'Information Functions' } + + def get_name + name = at_css('h1').content + clean_heading_name(name) + + if %w(Overview Introduction).include?(name) + result[:pg_chapter_name] + else + name.sub! ' (Common Table Expressions)', '' + REPLACE_NAMES[name] || name + end + end + + def clean_heading_name(name) + name.sub! %r{\A[\d\.\s]+}, '' + name.sub! 'Using ', '' + name.sub! %r{\AThe }, '' + name + end + + def get_type + return if initial_page? + + if result[:pg_up_path] == 'sql-commands.html' + 'Commands' + elsif result[:pg_up_path].start_with? 'reference-' + 'Applications' + elsif type = result[:pg_chapter_name] + if type.start_with?('Func') && (match = name.match(/\A(?!Form|Seq|Set|Enum)(.+) Func/)) + "Functions: #{match[1]}" + else + type.sub 'SQL ', '' + end + end + end + + def additional_entries + return [] if skip_additional_entries? + return get_config_entries if config_page? + return get_heading_entries('h3[id]') if slug == 'functions-xml' + + if type == 'Data Types' + return get_custom_entries case slug + when 'rangetypes' then 'li > p > .TYPE:first-child' + when 'datatype-textsearch' then '.SECT2 > .TYPE' + else '.CALSTABLE td:first-child > .TYPE' end + end + + entries = get_heading_entries('h2[id]') + + if slug == 'queries-union' + entries.concat get_custom_entries('p > .LITERAL:first-child') + elsif slug == 'queries-table-expressions' + entries.concat get_heading_entries('h3[id]') + entries.concat get_custom_entries('dt > .LITERAL:first-child') + elsif slug == 'functions-logical' + entries.concat get_custom_entries('> table td:first-child > code') + elsif slug == 'functions-formatting' + entries.concat get_custom_entries('#FUNCTIONS-FORMATTING-TABLE td:first-child > code') + elsif slug == 'functions-admin' + entries.concat get_custom_entries('.TABLE td:first-child > code') + elsif slug == 'functions-string' + entries.concat get_custom_entries('> div[id^="FUNC"] td:first-child > code') + elsif type && type.start_with?('Functions') + entries.concat get_custom_entries('> .TABLE td:first-child > code:first-child') + entries.concat get_comparison_entries if slug == 'functions-comparison' + end + + entries + end + + def get_config_entries + css('.VARIABLELIST dt[id]').map do |node| + name = node.at_css('.VARNAME').content + ["Config: #{name}", node['id']] + end + end + + def get_heading_entries(selector) + css(selector).inject [] do |entries, node| + name = node.content + clean_heading_name(name) + + unless skip_heading?(name) + entries << ["#{additional_entry_prefix}: #{name}", node['id']] + end + + entries + end + end + + def get_custom_entries(selector) + css(selector).inject [] do |entries, node| + name = node.content + name.gsub! %r{\(.*?\)}m, '' + name.gsub! %r{\[.*?\]}m, '' + name.squeeze! ' ' + name.sub! %r{\([^\)]*\z}, '' # bug fix: json_populate_record + name = '||' if name.include? ' || ' + id = name.gsub(/[^a-z0-9\-_]/) { |char| char.ord } + id = id.parameterize + name.prepend "#{additional_entry_prefix}: " + + unless entries.any? { |entry| entry[0] == name } + node['id'] = id + entries << [name, id] + end + + entries + end + end + + def get_comparison_entries + %w(IS NULL BETWEEN DISTINCT\ FROM).map do |name| + ["#{self.name}: #{name}"] + end + end + + def additional_entry_prefix + type.dup.sub!('Functions: ', '') || self.name + end + + def skip_additional_entries? + slug == 'config-setting' || %w(Concurrency\ Control Localization).include?(type) + end + + def skip_heading?(name) + %w(Usage\ Patterns Portability Caveats Overview).include?(name) || + (type.start_with?('Functions') && slug != 'functions-xml' && name.split.first.upcase!) + end + + def include_default_entry? + !(initial_page? || at_css('.TOC') || config_page?) + end + + def config_page? + slug.start_with? 'runtime-config' + end + end + end +end diff --git a/lib/docs/scrapers/postgresql.rb b/lib/docs/scrapers/postgresql.rb new file mode 100644 index 00000000..909036fd --- /dev/null +++ b/lib/docs/scrapers/postgresql.rb @@ -0,0 +1,55 @@ +module Docs + class Postgresql < FileScraper + self.name = 'PostgreSQL' + self.type = 'postgres' + self.version = 'up to 9.3.2' + self.dir = '/Users/Thibaut/DevDocs/Docs/PostgreSQL' + self.base_url = 'http://www.postgresql.org/docs/9.3/static/' + self.root_path = 'reference.html' + self.initial_paths = %w(sql.html runtime-config.html charset.html) + + html_filters.insert_before 'normalize_urls', 'postgresql/clean_nav' + html_filters.push 'postgresql/clean_html', 'postgresql/entries', 'title' + + options[:title] = false + options[:root_title] = 'PostgreSQL' + options[:follow_links] = ->(filter) { filter.initial_page? } + + options[:only] = %w( + arrays.html + rowtypes.html + rangetypes.html + mvcc-intro.html + transaction-iso.html + explicit-locking.html + applevel-consistency.html + locking-indexes.html + config-setting.html + locale.html + collation.html + multibyte.html) + + options[:only_patterns] = [ + /\Asql\-/, + /\Aapp\-/, + /\Addl\-/, + /\Adml\-/, + /\Aqueries\-/, + /\Adatatype\-/, + /\Afunctions\-/, + /\Aindexes\-/, + /\Aruntime\-config\-/] + + options[:skip] = %w( + ddl-others.html + runtime-config-custom.html + runtime-config-short.html + functions-event-triggers.html + functions-trigger.html) + + options[:attribution] = <<-HTML + © 1996–2013 The PostgreSQL Global Development Group
+ Licensed under the PostgreSQL License. + HTML + end +end diff --git a/public/icons/docs/postgresql/16.png b/public/icons/docs/postgresql/16.png new file mode 100644 index 0000000000000000000000000000000000000000..22f64d434c92564f41a5c011e1b1254d1b0cf7b0 GIT binary patch literal 833 zcmV-H1HSx;P)(RKN_so|#BUFM?3U z#*mzK7q*@uh|<*%$_)fP1PaP2OgMW@i}Kb1h@_}xa8D&^lSubSfmi$#>nTCqX5l3?MtwTsuY9Wvram&_< z;|dM<?x=$hJaA+Hibnhr06lu-U*{}>9{`&*s8 z1EYR_;Os7mKM=nB*fZJf4+hV@`ZznKuXjdzyc3bMf;t+r6-P34WTY1JORLV{_RsSX z;4t&A;5bg;4{T(7U0%+)QrrNZ(n1P!NX}&84|0XfULzch@+2h>$UsAk;LMGC2+-fz zGXa2ox#orl?L=%_C8`>PLf=m?{}b+s*S?f&EiUC(VD#Nw+u!+LE{7OR_&Fj$00000 LNkvXXu0mjfb+Lr^ literal 0 HcmV?d00001 diff --git a/public/icons/docs/postgresql/16@2x.png b/public/icons/docs/postgresql/16@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..0496ae43435b8cc9006a46627cf4fc1ac6442136 GIT binary patch literal 2442 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 IM6N<$f=qayE&u=k literal 0 HcmV?d00001 diff --git a/public/icons/docs/postgresql/SOURCE b/public/icons/docs/postgresql/SOURCE new file mode 100644 index 00000000..84ce600b --- /dev/null +++ b/public/icons/docs/postgresql/SOURCE @@ -0,0 +1 @@ +http://www.postgresql.org/about/press/presskit93/#logos