⌈⌋ branch:  freshcode


Hex Artifact Content

Artifact 2102c65069eb2ec38b06dc0948e151c7fa037dd5:

  • File aux.php — part of check-in [792720840e] at 2017-01-31 18:42:53 on branch trunk — Recent updates to basic spam blacklist. (user: mario size: 11326)

0000: 3c 3f 70 68 70 0a 2f 2a 2a 0a 20 2a 20 61 70 69  <?php./**. * api
0010: 3a 20 66 72 65 73 68 6d 65 61 74 0a 20 2a 20 74  : freshmeat. * t
0020: 69 74 6c 65 3a 20 74 65 6d 70 6c 61 74 65 20 61  itle: template a
0030: 75 78 69 6c 69 61 72 79 20 63 6f 64 65 0a 20 2a  uxiliary code. *
0040: 20 64 65 73 63 72 69 70 74 69 6f 6e 3a 20 41 20   description: A 
0050: 66 65 77 20 75 74 69 6c 69 74 79 20 66 75 6e 63  few utility func
0060: 74 69 6f 6e 73 20 61 6e 64 20 64 61 74 61 20 66  tions and data f
0070: 6f 72 20 74 68 65 20 74 65 6d 70 6c 61 74 65 73  or the templates
0080: 0a 20 2a 20 76 65 72 73 69 6f 6e 3a 20 30 2e 35  . * version: 0.5
0090: 2e 32 0a 20 2a 20 6c 69 63 65 6e 73 65 3a 20 41  .2. * license: A
00a0: 47 50 4c 0a 20 2a 0a 20 2a 20 54 68 69 73 20 66  GPL. *. * This f
00b0: 75 6e 63 74 69 6f 6e 20 61 73 6f 72 74 6d 65 6e  unction asortmen
00c0: 74 20 70 72 65 70 61 72 65 73 20 73 6f 6d 65 20  t prepares some 
00d0: 63 6f 6d 6d 6f 6e 20 6f 75 74 70 75 74 2e 0a 20  common output.. 
00e0: 2a 20 57 68 69 6c 65 20 61 20 66 65 77 20 61 72  * While a few ar
00f0: 65 20 70 61 72 73 69 6e 67 20 68 65 6c 70 65 72  e parsing helper
0100: 73 20 6f 72 20 44 42 20 71 75 65 72 79 20 73 68  s or DB query sh
0110: 6f 72 74 63 75 74 73 2e 0a 20 2a 0a 20 2a 2f 0a  ortcuts.. *. */.
0120: 0a 0a 0a 23 2d 2d 20 41 64 64 69 74 69 6f 6e 61  ...#-- Additiona
0130: 6c 20 69 6e 70 75 74 20 66 69 6c 74 65 72 73 0a  l input filters.
0140: 0a 0a 2f 2f 20 50 72 6f 6a 65 63 74 20 6e 61 6d  ..// Project nam
0150: 65 73 20 6d 61 79 20 62 65 20 61 6c 70 68 61 6e  es may be alphan
0160: 75 6d 65 72 69 63 2c 20 61 6e 64 20 63 6f 6e 74  umeric, and cont
0170: 61 69 6e 20 64 61 73 68 65 73 0a 66 75 6e 63 74  ain dashes.funct
0180: 69 6f 6e 20 70 72 6f 6a 5f 6e 61 6d 65 28 24 73  ion proj_name($s
0190: 29 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70  ) {.    return p
01a0: 72 65 67 5f 72 65 70 6c 61 63 65 28 22 2f 5b 5e  reg_replace("/[^
01b0: 61 2d 7a 30 2d 39 2d 5f 2e 5d 2b 7c 5e 5b 5e 61  a-z0-9-_.]+|^[^a
01c0: 2d 7a 30 2d 39 5d 2b 7c 5c 57 2b 24 7c 5c 2e 28  -z0-9]+|\W+$|\.(
01d0: 3f 21 5c 77 7b 31 2c 37 7d 24 29 7c 5b 2d 5f 2e  ?!\w{1,7}$)|[-_.
01e0: 5d 2b 28 3f 3d 5b 2d 5f 2e 5d 29 2f 22 2c 20 22  ]+(?=[-_.])/", "
01f0: 22 2c 20 73 74 72 74 6f 6c 6f 77 65 72 28 24 73  ", strtolower($s
0200: 29 29 3b 0a 7d 0a 0a 2f 2f 20 54 61 67 73 20 69  ));.}..// Tags i
0210: 73 20 61 20 63 6f 6d 6d 61 2d 73 65 70 61 72 61  s a comma-separa
0220: 74 65 64 20 6c 69 73 74 2c 20 79 65 74 20 73 6f  ted list, yet so
0230: 6d 65 74 69 6d 65 73 20 64 65 6c 69 6d 69 74 65  metimes delimite
0240: 64 20 77 69 74 68 20 73 6f 6d 65 74 68 69 6e 67  d with something
0250: 20 65 6c 73 65 3b 20 6e 6f 72 6d 61 6c 69 7a 65   else; normalize
0260: 2e 2e 0a 66 75 6e 63 74 69 6f 6e 20 66 5f 74 61  ...function f_ta
0270: 67 73 28 24 73 29 20 7b 0a 20 20 20 20 72 65 74  gs($s) {.    ret
0280: 75 72 6e 0a 20 20 20 20 20 20 20 20 70 72 65 67  urn.        preg
0290: 5f 72 65 70 6c 61 63 65 28 20 20 20 20 20 23 20  _replace(     # 
02a0: 65 78 63 65 70 74 69 6f 6e 20 66 6f 72 20 22 63  exception for "c
02b0: 2b 2b 22 20 61 6e 64 20 22 63 23 22 0a 20 20 20  ++" and "c#".   
02c0: 20 20 20 20 20 20 20 20 20 5b 22 7e 5b 2d 5f 2e           ["~[-_.
02d0: 3a 2f 5d 2b 7e 22 2c 20 22 2f 28 28 5b 63 66 6c  :/]+~", "/(([cfl
02e0: 6a 65 5d 23 7c 63 5c 2b 5c 2b 29 28 3f 3d 5b 5c  je]#|c\+\+)(?=[\
02f0: 73 2c 2d 5d 29 29 3f 5b 2b 23 5d 2a 2f 22 2c 20  s,-]))?[+#]*/", 
0300: 22 2f 5b 2c 3b 7c 5d 2b 2f 22 2c 20 22 2f 5b 5e  "/[,;|]+/", "/[^
0310: 61 2d 7a 30 2d 39 2c 2b 23 5c 73 2d 5d 2b 2f 22  a-z0-9,+#\s-]+/"
0320: 2c 20 22 2f 5b 2c 5c 73 5d 2b 2f 22 2c 20 22 2f  , "/[,\s]+/", "/
0330: 5e 5c 57 2b 7c 5c 57 2b 24 2f 22 5d 2c 0a 20 20  ^\W+|\W+$/"],.  
0340: 20 20 20 20 20 20 20 20 20 20 5b 20 20 22 2d 22            [  "-"
0350: 2c 20 20 20 20 20 20 20 20 20 20 20 20 22 24 31  ,            "$1
0360: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
0370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0380: 20 22 2c 22 2c 20 20 20 20 20 20 20 20 20 20 20   ",",           
0390: 20 20 22 20 22 2c 20 20 20 20 20 20 20 20 20 20    " ",          
03a0: 20 20 20 22 2c 20 22 20 20 20 20 2c 20 20 20 20     ", "    ,    
03b0: 20 20 22 22 20 20 20 20 20 20 5d 2c 0a 20 20 20    ""      ],.   
03c0: 20 20 20 20 20 20 20 20 20 73 74 72 74 6f 6c 6f           strtolo
03d0: 77 65 72 28 24 73 29 0a 20 20 20 20 20 20 20 20  wer($s).        
03e0: 29 3b 0a 7d 0a 0a 2f 2f 20 56 65 72 73 69 6f 6e  );.}..// Version
03f0: 20 6e 75 6d 62 65 72 73 2c 20 72 65 6d 6f 76 65   numbers, remove
0400: 20 6e 6f 6e 2d 77 6f 72 64 20 63 68 61 72 61 63   non-word charac
0410: 74 65 72 73 2c 20 63 6f 6d 70 61 63 74 20 73 70  ters, compact sp
0420: 61 63 65 73 2c 20 73 74 72 69 70 20 6c 65 66 74  aces, strip left
0430: 6d 6f 73 74 20 22 76 22 20 70 72 65 66 69 78 0a  most "v" prefix.
0440: 66 75 6e 63 74 69 6f 6e 20 66 5f 76 65 72 73 69  function f_versi
0450: 6f 6e 28 24 73 29 20 7b 0a 20 20 20 20 72 65 74  on($s) {.    ret
0460: 75 72 6e 20 74 72 69 6d 28 70 72 65 67 5f 72 65  urn trim(preg_re
0470: 70 6c 61 63 65 28 22 2f 28 3f 3c 3d 5c 73 29 5c  place("/(?<=\s)\
0480: 73 2b 7c 5e 5b 76 56 5d 28 3f 21 5b 61 2d 7a 5d  s+|^[vV](?![a-z]
0490: 29 2f 22 2c 20 22 22 2c 20 74 72 69 6d 28 69 6e  )/", "", trim(in
04a0: 70 75 74 3a 3a 77 6f 72 64 73 28 24 73 2c 20 22  put::words($s, "
04b0: 7e 2b 28 29 23 5c 2f 40 3a 22 29 29 29 29 3b 0a  ~+()#\/@:"))));.
04c0: 7d 0a 0a 0a 23 2d 2d 20 54 65 6d 70 6c 61 74 65  }...#-- Template
04d0: 20 68 65 6c 70 65 72 73 0a 0a 2f 2f 20 57 72 61   helpers..// Wra
04e0: 70 20 74 61 67 20 6c 69 73 74 20 69 6e 74 6f 20  p tag list into 
04f0: 6c 69 6e 6b 73 0a 66 75 6e 63 74 69 6f 6e 20 77  links.function w
0500: 72 61 70 5f 74 61 67 73 28 24 74 61 67 73 2c 20  rap_tags($tags, 
0510: 24 72 3d 22 22 29 20 7b 0a 20 20 20 20 66 6f 72  $r="") {.    for
0520: 65 61 63 68 20 28 73 74 72 5f 67 65 74 63 73 76  each (str_getcsv
0530: 28 24 74 61 67 73 29 20 61 73 20 24 69 64 29 20  ($tags) as $id) 
0540: 7b 0a 20 20 20 20 20 20 20 20 24 69 64 20 3d 20  {.        $id = 
0550: 74 72 69 6d 28 24 69 64 29 3b 0a 20 20 20 20 20  trim($id);.     
0560: 20 20 20 24 72 20 2e 3d 20 22 3c 61 20 68 72 65     $r .= "<a hre
0570: 66 3d 5c 22 2f 73 65 61 72 63 68 3f 74 61 67 3d  f=\"/search?tag=
0580: 24 69 64 5c 22 3e 24 69 64 20 3c 2f 61 3e 22 3b  $id\">$id </a>";
0590: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
05a0: 6e 20 24 72 3b 20 20 20 20 0a 7d 0a 0a 2f 2f 20  n $r;    .}..// 
05b0: 52 65 74 75 72 6e 20 44 41 59 20 4d 4f 4e 54 48  Return DAY MONTH
05c0: 20 61 6e 64 20 54 49 4d 45 20 6f 72 20 59 45 41   and TIME or YEA
05d0: 52 20 66 6f 72 20 6f 6c 64 65 72 20 65 6e 74 72  R for older entr
05e0: 69 65 73 0a 66 75 6e 63 74 69 6f 6e 20 64 61 74  ies.function dat
05f0: 65 5f 66 6d 74 28 24 74 69 6d 65 29 20 7b 0a 20  e_fmt($time) {. 
0600: 20 20 20 24 6c 61 73 74 79 65 61 72 20 3d 20 74     $lastyear = t
0610: 69 6d 65 28 29 20 2d 20 24 74 69 6d 65 20 3e 20  ime() - $time > 
0620: 32 35 30 2a 32 34 2a 33 36 30 30 3b 0a 20 20 20  250*24*3600;.   
0630: 20 72 65 74 75 72 6e 20 73 74 72 66 74 69 6d 65   return strftime
0640: 28 24 6c 61 73 74 79 65 61 72 20 3f 20 22 25 64  ($lastyear ? "%d
0650: 20 25 62 20 25 59 22 20 3a 20 22 25 64 20 25 62   %b %Y" : "%d %b
0660: 20 25 48 3a 25 4d 22 2c 20 24 74 69 6d 65 29 3b   %H:%M", $time);
0670: 0a 7d 0a 0a 0a 0a 2f 2a 2a 0a 20 2a 20 53 75 62  .}..../**. * Sub
0680: 73 74 69 74 75 74 65 20 60 24 76 65 72 73 69 6f  stitute `$versio
0690: 6e 60 20 70 6c 61 63 65 68 6f 6c 64 65 72 73 20  n` placeholders 
06a0: 69 6e 20 55 52 4c 73 2e 0a 20 2a 20 28 57 68 69  in URLs.. * (Whi
06b0: 63 68 20 69 73 20 6f 6e 65 20 6f 66 20 74 68 65  ch is one of the
06c0: 20 6d 6f 73 74 20 75 73 65 66 75 6c 20 66 65 61   most useful fea
06d0: 74 75 72 65 73 20 6f 6e 20 66 72 65 73 68 63 6f  tures on freshco
06e0: 64 65 2e 63 6c 75 62 29 0a 20 2a 0a 20 2a 20 53  de.club). *. * S
06f0: 75 70 70 6f 72 74 65 64 20 73 79 6e 74 61 78 20  upported syntax 
0700: 76 61 72 69 61 74 69 6f 6e 73 3a 0a 20 2a 20 20  variations:. *  
0710: 20 20 e2 86 92 20 20 24 76 65 72 73 69 6f 6e 20    ...  $version 
0720: 61 6e 64 20 24 76 65 72 73 69 6f 6e 24 0a 20 2a  and $version$. *
0730: 20 20 20 20 e2 86 92 20 20 25 76 65 72 73 69 6f      ...  %versio
0740: 6e 20 61 6e 64 20 25 76 65 72 73 69 6f 6e 25 0a  n and %version%.
0750: 20 2a 0a 20 2a 20 41 6e 64 20 66 6f 72 20 73 75   *. * And for su
0760: 62 73 74 69 74 75 74 69 6e 67 20 24 76 65 72 73  bstituting $vers
0770: 69 6f 6e 2d 6e 75 6d 62 65 72 20 64 6f 74 73 3a  ion-number dots:
0780: 0a 20 2a 20 20 20 20 e2 86 92 20 20 24 2d 24 76  . *    ...  $-$v
0790: 65 72 73 69 6f 6e 20 20 66 6f 72 20 77 68 69 63  ersion  for whic
07a0: 68 20 31 2e 32 2e 33 20 62 65 63 6f 6d 65 73 20  h 1.2.3 becomes 
07b0: 31 2d 32 2d 33 0a 20 2a 20 20 20 20 e2 86 92 20  1-2-3. *    ... 
07c0: 20 24 5f 24 76 65 72 73 69 6f 6e 20 20 66 6f 72   $_$version  for
07d0: 20 77 68 69 63 68 20 32 2e 33 2e 34 20 62 65 63   which 2.3.4 bec
07e0: 6f 6d 65 73 20 32 5f 33 5f 34 0a 20 2a 0a 20 2a  omes 2_3_4. *. *
07f0: 20 4f 72 20 74 6f 20 69 6e 74 65 72 70 6f 6c 61   Or to interpola
0800: 74 65 20 61 20 73 69 6e 67 6c 65 20 76 65 72 73  te a single vers
0810: 69 6f 6e 20 74 75 70 6c 65 3a 0a 20 2a 20 20 20  ion tuple:. *   
0820: 20 e2 86 92 20 20 24 76 65 72 73 69 6f 6e 30 20   ...  $version0 
0830: 20 28 62 65 63 6f 6d 65 73 20 60 37 60 20 66 6f   (becomes `7` fo
0840: 72 20 60 37 2e 31 2e 32 60 20 69 6e 70 75 74 29  r `7.1.2` input)
0850: 0a 20 2a 0a 20 2a 2f 0a 66 75 6e 63 74 69 6f 6e  . *. */.function
0860: 20 76 65 72 73 69 6f 6e 65 64 5f 75 72 6c 28 24   versioned_url($
0870: 75 72 6c 2c 20 24 76 65 72 73 69 6f 6e 29 20 7b  url, $version) {
0880: 0a 20 20 20 20 24 72 78 20 3d 20 22 2f 0a 20 20  .    $rx = "/.  
0890: 20 20 20 20 20 20 28 5b 20 5c 24 20 25 20 5d 29        ([ \$ % ])
08a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08b0: 20 20 23 20 76 61 72 20 73 69 67 69 6c 0a 20 20    # var sigil.  
08c0: 20 20 20 20 20 20 28 20 28 2e 3f 29 20 5c 5c 31        ( (.?) \\1
08d0: 20 29 3f 2b 20 20 20 20 20 20 20 20 20 20 20 20   )?+            
08e0: 20 20 23 20 73 75 62 73 74 69 74 75 74 69 6f 6e    # substitution
08f0: 20 70 72 65 66 69 78 0a 20 20 20 20 20 20 20 20   prefix.        
0900: 28 76 65 72 73 69 6f 6e 7c 56 65 72 73 69 6f 6e  (version|Version
0910: 7c 56 45 52 53 49 4f 4e 29 20 20 20 23 20 27 76  |VERSION)   # 'v
0920: 65 72 73 69 6f 6e 27 0a 20 20 20 20 20 20 20 20  ersion'.        
0930: 28 5c 64 3f 29 20 20 20 20 20 20 20 20 20 20 20  (\d?)           
0940: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 73 75              # su
0950: 66 66 69 78 20 30 2c 20 31 2c 20 32 20 74 6f 20  ffix 0, 1, 2 to 
0960: 61 63 63 65 73 73 20 76 65 72 73 69 6f 6e 20 74  access version t
0970: 75 70 6c 65 73 0a 20 20 20 20 20 20 20 20 28 3f  uples.        (?
0980: 3d 20 5c 5c 31 20 7c 20 5c 62 20 7c 20 5f 20 29  = \\1 | \b | _ )
0990: 20 20 20 20 20 20 20 20 20 20 23 20 6f 70 74 69            # opti
09a0: 6f 6e 61 6c 20 65 6e 64 69 6e 67 20 73 69 67 69  onal ending sigi
09b0: 6c 20 5b 25 24 5d 2c 20 77 6f 72 64 62 72 65 61  l [%$], wordbrea
09c0: 6b 2c 20 6f 72 20 75 6e 64 65 72 73 63 6f 72 65  k, or underscore
09d0: 0a 20 20 20 20 2f 78 22 3b 0a 20 20 20 20 2f 2f  .    /x";.    //
09e0: 20 43 68 65 63 6b 20 66 6f 72 20 61 6e 64 20 64   Check for and d
09f0: 69 73 70 6c 61 63 65 20 27 24 76 65 72 73 69 6f  isplace '$versio
0a00: 6e 27 0a 20 20 20 20 72 65 74 75 72 6e 20 70 72  n'.    return pr
0a10: 65 67 5f 72 65 70 6c 61 63 65 5f 63 61 6c 6c 62  eg_replace_callb
0a20: 61 63 6b 28 0a 20 20 20 20 20 20 20 20 24 72 78  ack(.        $rx
0a30: 2c 0a 20 20 20 20 20 20 20 20 66 75 6e 63 74 69  ,.        functi
0a40: 6f 6e 20 28 24 6d 29 20 75 73 65 20 28 24 76 65  on ($m) use ($ve
0a50: 72 73 69 6f 6e 29 20 7b 0a 20 20 20 20 20 20 20  rsion) {.       
0a60: 20 20 20 20 20 2f 2f 20 4f 70 74 69 6f 6e 61 6c       // Optional
0a70: 6c 79 20 73 75 62 73 74 69 74 75 74 65 20 64 6f  ly substitute do
0a80: 74 73 20 69 6e 20 76 65 72 73 69 6f 6e 20 73 74  ts in version st
0a90: 72 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20 20  ring.           
0aa0: 20 69 66 20 28 73 74 72 6c 65 6e 28 24 6d 5b 32   if (strlen($m[2
0ab0: 5d 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ])) {.          
0ac0: 20 20 20 20 20 20 24 76 65 72 73 69 6f 6e 20 3d        $version =
0ad0: 20 73 74 72 74 72 28 24 76 65 72 73 69 6f 6e 2c   strtr($version,
0ae0: 20 5b 22 2e 22 20 3d 3e 20 24 6d 5b 33 5d 5d 29   ["." => $m[3]])
0af0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
0b00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 74              // t
0b10: 75 70 6c 65 20 61 63 63 65 73 73 0a 20 20 20 20  uple access.    
0b20: 20 20 20 20 20 20 20 20 69 66 20 28 73 74 72 6c          if (strl
0b30: 65 6e 28 24 6d 5b 35 5d 29 29 20 7b 0a 20 20 20  en($m[5])) {.   
0b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 24 76 65               $ve
0b50: 72 73 69 6f 6e 20 3d 20 70 72 65 67 5f 73 70 6c  rsion = preg_spl
0b60: 69 74 28 22 2f 5b 2d 2e 5f 7e 5d 2f 22 2c 20 24  it("/[-._~]/", $
0b70: 76 65 72 73 69 6f 6e 29 3b 0a 20 20 20 20 20 20  version);.      
0b80: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
0b90: 20 24 76 65 72 73 69 6f 6e 5b 24 6d 5b 35 5d 5d   $version[$m[5]]
0ba0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
0bb0: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
0bc0: 72 6e 20 24 76 65 72 73 69 6f 6e 3b 0a 20 20 20  rn $version;.   
0bd0: 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 20 20       },.        
0be0: 24 75 72 6c 0a 20 20 20 20 29 3b 0a 7d 0a 0a 0a  $url.    );.}...
0bf0: 2f 2a 2a 0a 20 2a 20 43 6f 6e 76 65 72 74 20 22  /**. * Convert "
0c00: 75 72 6c 31 3d 2c 20 75 72 6c 32 3d 2c 20 75 72  url1=, url2=, ur
0c10: 6c 33 3d 22 20 6c 69 73 74 20 69 6e 74 6f 20 74  l3=" list into t
0c20: 69 74 6c 65 64 20 68 79 70 65 72 6c 69 6e 6b 73  itled hyperlinks
0c30: 2e 0a 20 2a 0a 20 2a 2f 0a 66 75 6e 63 74 69 6f  .. *. */.functio
0c40: 6e 20 70 72 6f 6a 5f 6c 69 6e 6b 73 28 24 75 72  n proj_links($ur
0c50: 6c 73 2c 20 24 65 6e 74 72 79 2c 20 24 72 3d 22  ls, $entry, $r="
0c60: 22 29 20 7b 0a 0a 20 20 20 20 2f 2f 20 75 6e 70  ") {..    // unp
0c70: 61 63 6b 20 61 6e 64 20 66 69 6c 74 65 72 0a 20  ack and filter. 
0c80: 20 20 20 24 75 72 6c 73 20 3d 20 70 5f 6b 65 79     $urls = p_key
0c90: 5f 76 61 6c 75 65 28 24 75 72 6c 73 2c 20 4e 55  _value($urls, NU
0ca0: 4c 4c 29 3b 0a 20 20 20 20 24 75 72 6c 73 20 3d  LL);.    $urls =
0cb0: 20 61 72 72 61 79 5f 66 69 6c 74 65 72 28 61 72   array_filter(ar
0cc0: 72 61 79 5f 6d 61 70 28 22 69 6e 70 75 74 3a 3a  ray_map("input::
0cd0: 75 72 6c 22 2c 20 24 75 72 6c 73 29 29 3b 0a 0a  url", $urls));..
0ce0: 20 20 20 20 2f 2f 20 6a 6f 69 6e 20 69 6e 74 6f      // join into
0cf0: 20 48 54 4d 4c 20 6c 69 73 74 0a 20 20 20 20 66   HTML list.    f
0d00: 6f 72 65 61 63 68 20 28 24 75 72 6c 73 20 61 73  oreach ($urls as
0d10: 20 24 74 69 74 6c 65 3d 3e 24 75 72 6c 29 20 7b   $title=>$url) {
0d20: 0a 20 20 20 20 0a 20 20 20 20 20 20 20 20 2f 2f  .    .        //
0d30: 20 6e 6f 72 6d 61 6c 69 7a 65 20 74 69 74 6c 65   normalize title
0d40: 20 61 6e 64 20 73 75 62 73 74 69 74 75 74 65 20   and substitute 
0d50: 24 76 65 72 73 69 6f 6e 20 70 6c 61 63 65 68 6f  $version placeho
0d60: 6c 64 65 72 73 0a 20 20 20 20 20 20 20 20 24 74  lders.        $t
0d70: 69 74 6c 65 20 3d 20 75 63 77 6f 72 64 73 28 24  itle = ucwords($
0d80: 74 69 74 6c 65 29 3b 0a 20 20 20 20 20 20 20 20  title);.        
0d90: 24 5f 74 69 74 6c 65 20 3d 20 73 74 72 74 6f 6c  $_title = strtol
0da0: 6f 77 65 72 28 24 74 69 74 6c 65 29 3b 0a 20 20  ower($title);.  
0db0: 20 20 20 20 20 20 24 75 72 6c 20 3d 20 69 6e 70        $url = inp
0dc0: 75 74 3a 3a 68 74 6d 6c 28 76 65 72 73 69 6f 6e  ut::html(version
0dd0: 65 64 5f 75 72 6c 28 24 75 72 6c 2c 20 24 65 6e  ed_url($url, $en
0de0: 74 72 79 5b 22 76 65 72 73 69 6f 6e 22 5d 29 29  try["version"]))
0df0: 3b 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20 20  ;.        .     
0e00: 20 20 20 2f 2f 67 69 6d 6d 69 63 6b 3a 20 61 70     //gimmick: ap
0e10: 70 65 6e 64 20 48 54 4d 4c 20 6c 69 6e 6b 20 61  pend HTML link a
0e20: 6e 64 20 3c 61 75 64 69 6f 3e 20 66 6f 72 20 74  nd <audio> for t
0e30: 68 65 6d 65 20 73 6f 6e 67 0a 20 20 20 20 20 20  heme song.      
0e40: 20 20 24 72 20 2e 3d 20 22 5c 74 20 20 20 26 72    $r .= "\t   &r
0e50: 61 72 72 3b 20 3c 61 20 68 72 65 66 3d 5c 22 24  arr; <a href=\"$
0e60: 75 72 6c 5c 22 3e 24 74 69 74 6c 65 3c 2f 61 3e  url\">$title</a>
0e70: 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 2e 20  ".            . 
0e80: 28 24 5f 74 69 74 6c 65 20 3d 3d 20 22 74 68 65  ($_title == "the
0e90: 6d 65 2d 73 6f 6e 67 22 20 3f 20 22 3c 61 75 64  me-song" ? "<aud
0ea0: 69 6f 20 61 75 74 6f 70 6c 61 79 20 6f 6e 63 6c  io autoplay oncl
0eb0: 69 63 6b 3d 27 74 68 69 73 2e 70 61 75 73 65 64  ick='this.paused
0ec0: 20 3f 20 74 68 69 73 2e 70 6c 61 79 28 29 20 3a   ? this.play() :
0ed0: 20 74 68 69 73 2e 70 61 75 73 65 28 29 27 3e e2   this.pause()'>.
0ee0: 99 ab 3c 73 6f 75 72 63 65 20 74 79 70 65 3d 5c  ..<source type=\
0ef0: 22 61 75 64 69 6f 2f 6f 67 67 5c 22 20 73 72 63  "audio/ogg\" src
0f00: 3d 5c 22 24 75 72 6c 5c 22 3e 3c 2f 61 75 64 69  =\"$url\"></audi
0f10: 6f 3e 22 20 3a 20 22 22 29 0a 20 20 20 20 20 20  o>" : "").      
0f20: 20 20 20 20 20 20 2e 20 22 3c 62 72 3e 5c 6e 22        . "<br>\n"
0f30: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
0f40: 72 6e 20 24 72 3b 0a 7d 0a 0a 0a 0a 0a 2f 2f 20  rn $r;.}.....// 
0f50: 50 72 6f 6a 65 63 74 20 6c 69 73 74 69 6e 67 20  Project listing 
0f60: 6f 75 74 70 75 74 20 70 72 65 70 61 72 61 74 69  output preparati
0f70: 6f 6e 3b 0a 2f 2f 20 48 54 4d 4c 20 63 6f 6e 74  on;.// HTML cont
0f80: 65 78 74 20 65 73 63 61 70 61 69 6e 67 2c 20 76  ext escapaing, v
0f90: 65 72 73 69 6f 6e 65 64 20 75 72 6c 73 2c 20 66  ersioned urls, f
0fa0: 6f 72 6d 61 74 74 65 64 20 64 61 74 65 20 73 74  ormatted date st
0fb0: 72 69 6e 67 0a 66 75 6e 63 74 69 6f 6e 20 70 72  ring.function pr
0fc0: 65 70 61 72 65 5f 6f 75 74 70 75 74 28 26 24 65  epare_output(&$e
0fd0: 6e 74 72 79 29 20 7b 0a 0a 20 20 20 20 2f 2f 20  ntry) {..    // 
0fe0: 76 65 72 73 69 6f 6e 65 64 20 55 52 4c 73 0a 20  versioned URLs. 
0ff0: 20 20 20 24 65 6e 74 72 79 5b 22 64 6f 77 6e 6c     $entry["downl
1000: 6f 61 64 22 5d 20 3d 20 76 65 72 73 69 6f 6e 65  oad"] = versione
1010: 64 5f 75 72 6c 28 24 65 6e 74 72 79 5b 22 64 6f  d_url($entry["do
1020: 77 6e 6c 6f 61 64 22 5d 2c 20 24 65 6e 74 72 79  wnload"], $entry
1030: 5b 22 76 65 72 73 69 6f 6e 22 5d 29 3b 0a 20 20  ["version"]);.  
1040: 20 20 0a 20 20 20 20 2f 2f 20 70 72 6f 6a 65 63    .    // projec
1050: 74 20 73 63 72 65 65 6e 73 68 6f 74 73 0a 20 20  t screenshots.  
1060: 20 20 69 66 20 28 54 52 55 45 20 6f 72 20 65 6d    if (TRUE or em
1070: 70 74 79 28 24 65 6e 74 72 79 5b 22 69 6d 61 67  pty($entry["imag
1080: 65 22 5d 29 29 20 7b 0a 20 20 20 20 20 20 20 20  e"])) {.        
1090: 69 66 20 28 66 69 6c 65 5f 65 78 69 73 74 73 28  if (file_exists(
10a0: 24 66 6e 20 3d 20 22 69 6d 67 2f 73 63 72 65 65  $fn = "img/scree
10b0: 6e 73 68 6f 74 2f 24 65 6e 74 72 79 5b 6e 61 6d  nshot/$entry[nam
10c0: 65 5d 2e 6a 70 65 67 22 29 29 20 7b 0a 20 20 20  e].jpeg")) {.   
10d0: 20 20 20 20 20 20 20 20 20 24 65 6e 74 72 79 5b           $entry[
10e0: 22 69 6d 61 67 65 22 5d 20 3d 20 22 2f 24 66 6e  "image"] = "/$fn
10f0: 3f 22 20 2e 20 66 69 6c 65 6d 74 69 6d 65 28 24  ?" . filemtime($
1100: 66 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  fn);.        }. 
1110: 20 20 20 20 20 20 20 65 6c 73 65 20 7b 0a 20 20         else {.  
1120: 20 20 20 20 20 20 20 20 20 20 24 65 6e 74 72 79            $entry
1130: 5b 22 69 6d 61 67 65 22 5d 20 3d 20 22 2f 69 6d  ["image"] = "/im
1140: 67 2f 6e 6f 70 72 65 76 69 65 77 2e 70 6e 67 22  g/nopreview.png"
1150: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1160: 7d 0a 20 20 20 20 0a 20 20 20 20 2f 2f 0a 20 20  }.    .    //.  
1170: 20 20 24 65 6e 74 72 79 5b 22 66 6f 72 6d 61 74    $entry["format
1180: 74 65 64 5f 64 61 74 65 22 5d 20 3d 20 64 61 74  ted_date"] = dat
1190: 65 5f 66 6d 74 28 24 65 6e 74 72 79 5b 22 74 5f  e_fmt($entry["t_
11a0: 70 75 62 6c 69 73 68 65 64 22 5d 29 3b 0a 20 20  published"]);.  
11b0: 20 20 0a 20 20 20 20 2f 2f 20 48 54 4d 4c 20 63    .    // HTML c
11c0: 6f 6e 74 65 78 74 0a 20 20 20 20 24 65 6e 74 72  ontext.    $entr
11d0: 79 20 3d 20 61 72 72 61 79 5f 6d 61 70 28 22 69  y = array_map("i
11e0: 6e 70 75 74 3a 3a 5f 68 74 6d 6c 22 2c 20 24 65  nput::_html", $e
11f0: 6e 74 72 79 29 3b 0a 0a 20 20 20 20 2f 2f 20 75  ntry);..    // u
1200: 73 65 72 20 69 6d 61 67 65 0a 20 20 20 20 24 65  ser image.    $e
1210: 6e 74 72 79 5b 22 73 75 62 6d 69 74 74 65 72 5f  ntry["submitter_
1220: 69 6d 67 22 5d 20 3d 20 73 75 62 6d 69 74 74 65  img"] = submitte
1230: 72 5f 67 72 61 76 61 74 61 72 28 24 65 6e 74 72  r_gravatar($entr
1240: 79 5b 22 73 75 62 6d 69 74 74 65 72 5f 69 6d 61  y["submitter_ima
1250: 67 65 22 5d 29 3b 0a 7d 0a 0a 0a 2f 2a 2a 0a 20  ge"]);.}.../**. 
1260: 2a 20 43 6f 6e 76 65 72 74 20 65 6d 61 69 6c 40  * Convert email@
1270: 78 79 7a 20 74 6f 20 67 72 61 76 61 74 61 72 20  xyz to gravatar 
1280: 6f 72 20 69 64 65 6e 74 69 63 6f 6e 2c 0a 20 2a  or identicon,. *
1290: 20 6b 65 65 70 20 72 61 77 20 55 52 4c 73 2c 20   keep raw URLs, 
12a0: 6f 72 20 75 73 65 20 64 65 66 61 75 6c 74 20 69  or use default i
12b0: 6d 61 67 65 20 66 6f 72 20 65 6d 70 74 79 20 66  mage for empty f
12c0: 69 65 6c 64 73 2e 0a 20 2a 0a 20 2a 2f 0a 66 75  ields.. *. */.fu
12d0: 6e 63 74 69 6f 6e 20 73 75 62 6d 69 74 74 65 72  nction submitter
12e0: 5f 67 72 61 76 61 74 61 72 28 24 69 6d 67 2c 20  _gravatar($img, 
12f0: 24 73 69 7a 65 3d 32 34 29 20 7b 0a 20 20 20 20  $size=24) {.    
1300: 0a 20 20 20 20 2f 2f 20 63 61 70 74 75 72 65 2b  .    // capture+
1310: 73 74 72 69 70 20 65 6d 61 69 6c 0a 20 20 20 20  strip email.    
1320: 69 66 20 28 69 73 5f 69 6e 74 28 73 74 72 70 6f  if (is_int(strpo
1330: 73 28 24 69 6d 67 2c 20 22 40 22 29 29 29 20 7b  s($img, "@"))) {
1340: 0a 20 20 20 20 20 20 20 20 24 69 6d 67 20 3d 20  .        $img = 
1350: 22 2f 2f 77 77 77 2e 67 72 61 76 61 74 61 72 2e  "//www.gravatar.
1360: 63 6f 6d 2f 61 76 61 74 61 72 2f 22 20 2e 20 6d  com/avatar/" . m
1370: 64 35 28 24 69 6d 67 29 20 2e 20 22 3f 73 3d 24  d5($img) . "?s=$
1380: 73 69 7a 65 26 64 3d 69 64 65 6e 74 69 63 6f 6e  size&d=identicon
1390: 26 72 3d 70 67 22 3b 0a 20 20 20 20 7d 0a 20 20  &r=pg";.    }.  
13a0: 20 20 65 6c 73 65 69 66 20 28 65 6d 70 74 79 28    elseif (empty(
13b0: 24 69 6d 67 29 29 20 7b 0a 20 20 20 20 20 20 20  $img)) {.       
13c0: 20 24 69 6d 67 20 3d 20 22 2f 69 6d 67 2f 75 73   $img = "/img/us
13d0: 65 72 2e 70 6e 67 22 3b 0a 20 20 20 20 7d 0a 20  er.png";.    }. 
13e0: 20 20 20 0a 20 20 20 20 2f 2f 20 72 65 74 75 72     .    // retur
13f0: 6e 20 68 74 6d 6c 20 3c 69 6d 67 3e 20 73 6e 69  n html <img> sni
1400: 70 70 65 74 0a 20 20 20 20 72 65 74 75 72 6e 20  ppet.    return 
1410: 22 3c 69 6d 67 20 73 72 63 3d 5c 22 24 69 6d 67  "<img src=\"$img
1420: 5c 22 20 77 69 64 74 68 3d 24 73 69 7a 65 20 68  \" width=$size h
1430: 65 69 67 68 74 3d 24 73 69 7a 65 20 63 6c 61 73  eight=$size clas
1440: 73 3d 67 72 61 76 61 74 61 72 3e 22 3b 0a 7d 0a  s=gravatar>";.}.
1450: 0a 0a 2f 2a 2a 0a 20 2a 20 43 6f 6e 76 65 72 74  ../**. * Convert
1460: 20 73 70 65 63 69 61 6c 20 75 73 65 72 40 73 65   special user@se
1470: 72 76 69 63 65 20 6d 6f 6e 69 6b 65 72 73 20 69  rvice monikers i
1480: 6e 74 6f 20 55 52 4c 73 2c 0a 20 2a 20 6b 65 65  nto URLs,. * kee
1490: 70 20 65 76 65 72 79 74 68 69 6e 67 20 65 6c 73  p everything els
14a0: 65 20 61 73 20 73 75 70 70 6f 73 65 64 20 67 72  e as supposed gr
14b0: 61 76 61 74 61 72 20 6c 69 6e 6b 2e 0a 20 2a 0a  avatar link.. *.
14c0: 20 2a 2f 0a 66 75 6e 63 74 69 6f 6e 20 75 72 6c   */.function url
14d0: 5f 75 73 65 72 5f 69 63 6f 6e 28 24 6d 61 69 6c  _user_icon($mail
14e0: 29 20 7b 0a 0a 20 20 20 20 2f 2f 20 73 70 65 63  ) {..    // spec
14f0: 69 61 6c 20 70 72 6f 6a 65 63 74 20 68 6f 73 74  ial project host
1500: 65 72 73 0a 20 20 20 20 69 66 20 28 70 72 65 67  ers.    if (preg
1510: 5f 6d 61 74 63 68 28 22 2f 5e 28 5b 5c 77 2e 2d  _match("/^([\w.-
1520: 5d 2b 29 40 28 67 69 74 68 75 62 7c 73 6f 75 72  ]+)@(github|sour
1530: 63 65 66 6f 72 67 65 7c 6c 61 75 6e 63 68 70 61  ceforge|launchpa
1540: 64 29 2f 69 22 2c 20 24 6d 61 69 6c 2c 20 24 75  d)/i", $mail, $u
1550: 73 65 72 29 29 20 7b 0a 0a 20 20 20 20 20 20 20  ser)) {..       
1560: 20 2f 2f 20 75 73 65 72 20 69 6d 61 67 65 20 6c   // user image l
1570: 6f 6f 6b 75 70 20 72 75 6c 65 73 20 20 20 20 0a  ookup rules    .
1580: 20 20 20 20 20 20 20 20 24 6d 61 70 20 3d 20 5b          $map = [
1590: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 67 69  .            "gi
15a0: 74 68 75 62 22 20 3d 3e 20 5b 0a 20 20 20 20 20  thub" => [.     
15b0: 20 20 20 20 20 20 20 20 20 20 20 23 22 70 61 67             #"pag
15c0: 65 22 20 3d 3e 20 5b 22 55 52 4c 22 20 3d 3e 20  e" => ["URL" => 
15d0: 22 68 74 74 70 3a 2f 2f 61 70 69 2e 67 69 74 68  "http://api.gith
15e0: 75 62 2e 63 6f 6d 2f 75 73 65 72 73 2f 24 75 73  ub.com/users/$us
15f0: 65 72 5b 31 5d 22 2c 20 22 55 53 45 52 50 57 44  er[1]", "USERPWD
1600: 22 20 3d 3e 20 47 49 54 48 55 42 5f 41 50 49 5f  " => GITHUB_API_
1610: 50 57 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  PW],.           
1620: 20 20 20 20 20 23 22 72 78 22 20 3d 3e 20 22 7e       #"rx" => "~
1630: 5c 22 61 76 61 74 61 72 5f 75 72 6c 5c 22 3a 5c  \"avatar_url\":\
1640: 73 2a 5c 22 28 2e 2a 3f 29 5c 22 7e 22 2c 0a 20  s*\"(.*?)\"~",. 
1650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
1660: 70 61 67 65 22 20 3d 3e 20 22 68 74 74 70 3a 2f  page" => "http:/
1670: 2f 67 69 74 68 75 62 2e 63 6f 6d 2f 24 75 73 65  /github.com/$use
1680: 72 5b 31 5d 22 2c 0a 20 20 20 20 20 20 20 20 20  r[1]",.         
1690: 20 20 20 20 20 20 20 22 72 78 22 20 3d 3e 20 22         "rx" => "
16a0: 7e 28 2f 2f 61 76 61 74 61 72 73 5c 64 2a 2e 67  ~(//avatars\d*.g
16b0: 69 74 68 75 62 75 73 65 72 63 6f 6e 74 65 6e 74  ithubusercontent
16c0: 2e 63 6f 6d 2f 75 2f 5c 64 2b 5b 3f 3d 5c 77 26  .com/u/\d+[?=\w&
16d0: 3b 5d 2b 29 7e 22 2c 0a 20 20 20 20 20 20 20 20  ;]+)~",.        
16e0: 20 20 20 20 20 20 20 20 22 64 65 66 61 75 6c 74          "default
16f0: 22 20 3d 3e 20 22 2f 2f 69 64 65 6e 74 69 63 6f  " => "//identico
1700: 6e 73 2e 67 69 74 68 75 62 2e 63 6f 6d 2f 24 75  ns.github.com/$u
1710: 73 65 72 5b 31 5d 2e 70 6e 67 22 2c 0a 20 20 20  ser[1].png",.   
1720: 20 20 20 20 20 20 20 20 20 5d 2c 0a 20 20 20 20           ],.    
1730: 20 20 20 20 20 20 20 20 22 73 6f 75 72 63 65 66          "sourcef
1740: 6f 72 67 65 22 20 3d 3e 20 5b 0a 20 20 20 20 20  orge" => [.     
1750: 20 20 20 20 20 20 20 20 20 20 20 22 70 61 67 65             "page
1760: 22 20 3d 3e 20 22 68 74 74 70 3a 2f 2f 73 6f 75  " => "http://sou
1770: 72 63 65 66 6f 72 67 65 2e 6e 65 74 2f 75 2f 24  rceforge.net/u/$
1780: 75 73 65 72 5b 31 5d 2f 70 72 6f 66 69 6c 65 22  user[1]/profile"
1790: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
17a0: 20 20 22 72 78 22 20 3d 3e 20 22 7e 28 68 74 74    "rx" => "~(htt
17b0: 70 5b 3a 2f 5c 77 2e 5d 2b 2f 61 76 61 74 61 72  p[:/\w.]+/avatar
17c0: 2f 5b 5b 3a 78 64 69 67 69 74 3a 5d 5d 2b 29 7e  /[[:xdigit:]]+)~
17d0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
17e0: 20 20 20 22 64 65 66 61 75 6c 74 22 20 3d 3e 20     "default" => 
17f0: 22 24 75 73 65 72 5b 31 5d 40 75 73 65 72 73 2e  "$user[1]@users.
1800: 73 6f 75 72 63 65 66 6f 72 67 65 2e 6e 65 74 22  sourceforge.net"
1810: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 5d 2c  ,.            ],
1820: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 6c 61  .            "la
1830: 75 6e 63 68 70 61 64 22 20 3d 3e 20 5b 0a 20 20  unchpad" => [.  
1840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 70                "p
1850: 61 67 65 22 20 3d 3e 20 22 68 74 74 70 3a 2f 2f  age" => "http://
1860: 6c 61 75 6e 63 68 70 61 64 2e 6e 65 74 2f 7e 24  launchpad.net/~$
1870: 75 73 65 72 5b 31 5d 22 2c 0a 20 20 20 20 20 20  user[1]",.      
1880: 20 20 20 20 20 20 20 20 20 20 22 72 78 22 20 3d            "rx" =
1890: 3e 20 22 7e 28 2f 2f 6c 61 75 6e 63 68 70 61 64  > "~(//launchpad
18a0: 6c 69 62 72 61 72 69 61 6e 2e 6e 65 74 2f 5c 64  librarian.net/\d
18b0: 2b 2f 5b 5e 5c 22 5c 27 5c 3e 5c 29 5d 2b 29 7e  +/[^\"\'\>\)]+)~
18c0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
18d0: 20 20 20 22 64 65 66 61 75 6c 74 22 20 3d 3e 20     "default" => 
18e0: 22 24 75 73 65 72 5b 31 5d 40 6c 61 75 6e 63 68  "$user[1]@launch
18f0: 70 61 64 2e 6e 65 74 22 2c 0a 20 20 20 20 20 20  pad.net",.      
1900: 20 20 20 20 20 20 5d 2c 0a 20 20 20 20 20 20 20        ],.       
1910: 20 5d 3b 0a 20 20 20 20 20 20 20 20 65 78 74 72   ];.        extr
1920: 61 63 74 28 24 6d 61 70 5b 73 74 72 74 6f 6c 6f  act($map[strtolo
1930: 77 65 72 28 24 75 73 65 72 5b 32 5d 29 5d 29 3b  wer($user[2])]);
1940: 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20  .        .      
1950: 20 20 2f 2f 20 66 65 74 63 68 20 75 73 65 72 20    // fetch user 
1960: 70 61 67 65 20 6f 6e 20 73 65 72 76 69 63 65 2c  page on service,
1970: 20 63 68 65 63 6b 20 66 6f 72 20 67 72 61 76 61   check for grava
1980: 74 61 72 2d 69 64 20 6f 72 20 75 72 6c 0a 20 20  tar-id or url.  
1990: 20 20 20 20 20 20 69 66 20 28 70 72 65 67 5f 6d        if (preg_m
19a0: 61 74 63 68 28 24 72 78 2c 20 24 73 72 63 20 3d  atch($rx, $src =
19b0: 20 63 75 72 6c 28 24 70 61 67 65 29 2d 3e 74 69   curl($page)->ti
19c0: 6d 65 6f 75 74 28 32 2e 35 29 2d 3e 65 78 65 63  meout(2.5)->exec
19d0: 28 29 2c 20 24 75 72 6c 29 29 0a 20 20 20 20 20  (), $url)).     
19e0: 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20     {.           
19f0: 20 24 6d 61 69 6c 20 3d 20 24 75 72 6c 5b 31 5d   $mail = $url[1]
1a00: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1a10: 20 20 20 20 2f 2f 20 66 61 6c 6c 62 61 63 6b 0a      // fallback.
1a20: 20 20 20 20 20 20 20 20 65 6c 73 65 20 7b 0a 20          else {. 
1a30: 20 20 20 20 20 20 20 20 20 20 20 24 6d 61 69 6c             $mail
1a40: 20 3d 20 24 64 65 66 61 75 6c 74 3b 0a 20 20 20   = $default;.   
1a50: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
1a60: 20 20 2f 2f 20 6b 65 65 70 20 61 73 2d 69 73 2c    // keep as-is,
1a70: 20 61 6e 64 20 68 61 76 65 20 69 74 20 72 65 73   and have it res
1a80: 6f 6c 76 65 64 20 61 73 20 73 74 61 6e 64 61 72  olved as standar
1a90: 64 20 67 72 61 76 61 74 61 72 0a 20 20 20 20 72  d gravatar.    r
1aa0: 65 74 75 72 6e 28 24 6d 61 69 6c 29 3b 0a 7d 0a  eturn($mail);.}.
1ab0: 0a 0a 0a 2f 2f 20 53 6f 63 69 61 6c 20 6d 65 64  ...// Social med
1ac0: 69 61 20 73 68 61 72 65 20 6c 69 6e 6b 73 0a 66  ia share links.f
1ad0: 75 6e 63 74 69 6f 6e 20 73 6f 63 69 61 6c 5f 73  unction social_s
1ae0: 68 61 72 65 5f 6c 69 6e 6b 73 28 24 6e 61 6d 65  hare_links($name
1af0: 2c 20 24 75 72 6c 29 20 7b 0a 20 20 20 20 24 63  , $url) {.    $c
1b00: 20 3d 20 61 72 72 61 79 28 22 67 6f 6f 67 6c 65   = array("google
1b10: 22 3d 3e 30 2c 20 22 66 61 63 65 62 6f 6f 6b 22  "=>0, "facebook"
1b20: 3d 3e 30 2c 20 22 74 77 69 74 74 65 72 22 3d 3e  =>0, "twitter"=>
1b30: 30 2c 20 22 72 65 64 64 69 74 22 3d 3e 30 2c 20  0, "reddit"=>0, 
1b40: 22 6c 69 6e 6b 65 64 69 6e 22 3d 3e 30 2c 20 22  "linkedin"=>0, "
1b50: 73 74 75 6d 62 6c 65 75 70 6f 6e 22 3d 3e 30 2c  stumbleupon"=>0,
1b60: 20 22 64 65 6c 69 63 69 6f 75 73 22 3d 3e 30 29   "delicious"=>0)
1b70: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 3c 3c 3c  ;.    return <<<
1b80: 48 54 4d 4c 0a 20 20 20 20 20 20 3c 73 70 61 6e  HTML.      <span
1b90: 20 63 6c 61 73 73 3d 73 6f 63 69 61 6c 2d 73 68   class=social-sh
1ba0: 61 72 65 2d 6c 69 6e 6b 73 3e 0a 20 20 20 20 20  are-links>.     
1bb0: 20 20 20 20 3c 61 20 68 72 65 66 3d 22 68 74 74      <a href="htt
1bc0: 70 73 3a 2f 2f 70 6c 75 73 2e 67 6f 6f 67 6c 65  ps://plus.google
1bd0: 2e 63 6f 6d 2f 73 68 61 72 65 3f 75 72 6c 3d 24  .com/share?url=$
1be0: 75 72 6c 22 20 74 69 74 6c 65 3d 67 6f 6f 67 6c  url" title=googl
1bf0: 65 2b 3e 20 67 2b 20 3c 2f 61 3e 0a 20 20 20 20  e+> g+ </a>.    
1c00: 20 20 20 20 20 3c 61 20 68 72 65 66 3d 22 68 74       <a href="ht
1c10: 74 70 73 3a 2f 2f 77 77 77 2e 66 61 63 65 62 6f  tps://www.facebo
1c20: 6f 6b 2e 63 6f 6d 2f 73 68 61 72 65 72 2f 73 68  ok.com/sharer/sh
1c30: 61 72 65 72 2e 70 68 70 3f 75 3d 24 75 72 6c 22  arer.php?u=$url"
1c40: 20 74 69 74 6c 65 3d 66 61 63 65 62 6f 6f 6b 3e   title=facebook>
1c50: 20 66 62 20 3c 2f 61 3e 0a 20 20 20 20 20 20 20   fb </a>.       
1c60: 20 20 3c 61 20 68 72 65 66 3d 22 68 74 74 70 73    <a href="https
1c70: 3a 2f 2f 74 77 69 74 74 65 72 2e 63 6f 6d 2f 69  ://twitter.com/i
1c80: 6e 74 65 6e 74 2f 74 77 65 65 74 3f 75 72 6c 3d  ntent/tweet?url=
1c90: 24 75 72 6c 22 20 74 69 74 6c 65 3d 74 77 69 74  $url" title=twit
1ca0: 74 65 72 3e 20 74 77 20 3c 2f 61 3e 0a 20 20 20  ter> tw </a>.   
1cb0: 20 20 20 20 20 20 3c 61 20 68 72 65 66 3d 22 68        <a href="h
1cc0: 74 74 70 3a 2f 2f 72 65 64 64 69 74 2e 63 6f 6d  ttp://reddit.com
1cd0: 2f 73 75 62 6d 69 74 3f 75 72 6c 3d 24 75 72 6c  /submit?url=$url
1ce0: 22 20 74 69 74 6c 65 3d 72 65 64 64 69 74 3e 20  " title=reddit> 
1cf0: 72 64 20 3c 2f 61 3e 0a 20 20 20 20 20 20 20 20  rd </a>.        
1d00: 20 3c 61 20 68 72 65 66 3d 22 68 74 74 70 73 3a   <a href="https:
1d10: 2f 2f 77 77 77 2e 6c 69 6e 6b 65 64 69 6e 2e 63  //www.linkedin.c
1d20: 6f 6d 2f 73 68 61 72 65 41 72 74 69 63 6c 65 3f  om/shareArticle?
1d30: 6d 69 6e 69 3d 74 72 75 65 26 61 6d 70 3b 75 72  mini=true&amp;ur
1d40: 6c 3d 24 75 72 6c 22 20 74 69 74 6c 65 3d 6c 69  l=$url" title=li
1d50: 6e 6b 65 64 69 6e 3e 20 69 6e 20 3c 2f 61 3e 0a  nkedin> in </a>.
1d60: 20 20 20 20 20 20 20 20 20 3c 61 20 68 72 65 66           <a href
1d70: 3d 22 68 74 74 70 73 3a 2f 2f 77 77 77 2e 73 74  ="https://www.st
1d80: 75 6d 62 6c 65 75 70 6f 6e 2e 63 6f 6d 2f 73 75  umbleupon.com/su
1d90: 62 6d 69 74 3f 75 72 6c 3d 24 75 72 6c 22 20 74  bmit?url=$url" t
1da0: 69 74 6c 65 3d 73 74 75 6d 62 6c 65 75 70 6f 6e  itle=stumbleupon
1db0: 3e 20 73 75 20 3c 2f 61 3e 0a 20 20 20 20 20 20  > su </a>.      
1dc0: 20 20 20 3c 61 20 68 72 65 66 3d 22 68 74 74 70     <a href="http
1dd0: 73 3a 2f 2f 64 65 6c 2e 69 63 69 6f 2e 75 73 2f  s://del.icio.us/
1de0: 70 6f 73 74 3f 75 72 6c 3d 24 75 72 6c 22 20 74  post?url=$url" t
1df0: 69 74 6c 65 3d 64 65 6c 69 63 69 6f 75 73 3e 20  itle=delicious> 
1e00: 64 6c 20 3c 2f 61 3e 0a 20 20 20 20 20 20 3c 2f  dl </a>.      </
1e10: 73 70 61 6e 3e 0a 48 54 4d 4c 3b 0a 7d 0a 66 75  span>.HTML;.}.fu
1e20: 6e 63 74 69 6f 6e 20 73 6f 63 69 61 6c 5f 73 68  nction social_sh
1e30: 61 72 65 5f 63 6f 75 6e 74 28 24 6e 75 6d 29 20  are_count($num) 
1e40: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 65 6d 70  {.    return emp
1e50: 74 79 28 24 6e 75 6d 29 20 3f 20 22 22 20 3a 20  ty($num) ? "" : 
1e60: 22 3c 76 61 72 20 63 6c 61 73 73 3d 73 6f 63 69  "<var class=soci
1e70: 61 6c 2d 73 68 61 72 65 2d 63 6f 75 6e 74 3e 24  al-share-count>$
1e80: 6e 75 6d 3c 2f 76 61 72 3e 22 3b 0a 7d 0a 0a 0a  num</var>";.}...
1e90: 0a 2f 2a 2a 0a 20 2a 20 57 72 69 74 65 20 6f 75  ./**. * Write ou
1ea0: 74 20 70 73 65 75 64 6f 20 70 61 67 69 6e 61 74  t pseudo paginat
1eb0: 69 6f 6e 20 6c 69 6e 6b 73 2e 0a 20 2a 20 54 68  ion links.. * Th
1ec0: 69 73 20 69 73 20 6a 75 73 74 20 61 70 70 65 6e  is is just appen
1ed0: 64 65 64 20 6e 6f 20 6d 61 74 74 65 72 20 74 68  ded no matter th
1ee0: 65 20 61 63 74 75 61 6c 6c 79 20 61 76 61 69 6c  e actually avail
1ef0: 61 62 6c 65 20 65 6e 74 72 69 65 73 2e 0a 20 2a  able entries.. *
1f00: 20 54 68 65 20 64 62 28 29 20 71 75 65 72 69 65   The db() querie
1f10: 73 20 74 68 65 6d 73 65 6c 76 65 73 20 68 61 6e  s themselves han
1f20: 64 6c 65 20 74 68 65 20 4c 49 4d 49 54 2f 4f 46  dle the LIMIT/OF
1f30: 46 53 45 54 2c 20 64 65 70 65 6e 64 69 6e 67 20  FSET, depending 
1f40: 6f 6e 20 61 20 70 61 67 65 20 70 61 72 61 6d 2e  on a page param.
1f50: 0a 20 2a 0a 20 2a 2f 0a 66 75 6e 63 74 69 6f 6e  . *. */.function
1f60: 20 70 61 67 69 6e 61 74 69 6f 6e 28 24 70 61 67   pagination($pag
1f70: 65 5f 6e 6f 2c 20 24 47 45 54 5f 70 61 72 61 6d  e_no, $GET_param
1f80: 3d 22 6e 22 29 20 7b 0a 20 20 20 20 70 72 69 6e  ="n") {.    prin
1f90: 74 20 22 3c 70 20 63 6c 61 73 73 3d 70 61 67 69  t "<p class=pagi
1fa0: 6e 61 74 69 6f 6e 2d 6c 69 6e 6b 73 3e 20 c2 bb  nation-links> ..
1fb0: 22 3b 0a 20 20 20 20 66 6f 72 65 61 63 68 20 28  ";.    foreach (
1fc0: 72 61 6e 67 65 28 24 70 61 67 65 5f 6e 6f 2d 32  range($page_no-2
1fd0: 2c 20 24 70 61 67 65 5f 6e 6f 2b 39 29 20 61 73  , $page_no+9) as
1fe0: 20 24 6e 29 20 69 66 20 28 24 6e 20 3e 20 30 29   $n) if ($n > 0)
1ff0: 20 7b 0a 20 20 20 20 20 20 20 20 70 72 69 6e 74   {.        print
2000: 20 22 20 3c 61 20 22 20 2e 20 28 24 6e 3d 3d 24   " <a " . ($n==$
2010: 70 61 67 65 5f 6e 6f 20 3f 20 22 63 6c 61 73 73  page_no ? "class
2020: 3d 63 75 72 72 65 6e 74 20 22 20 3a 20 22 22 29  =current " : "")
2030: 2e 20 22 68 72 65 66 3d 5c 22 3f 6e 3d 24 6e 5c  . "href=\"?n=$n\
2040: 22 3e 24 6e 3c 2f 61 3e 20 22 3b 0a 20 20 20 20  ">$n</a> ";.    
2050: 7d 0a 20 20 20 20 70 72 69 6e 74 20 22 c2 ab 20  }.    print ".. 
2060: 3c 2f 70 3e 22 3b 0a 7d 0a 0a 0a 2f 2a 2a 0a 20  </p>";.}.../**. 
2070: 2a 20 4f 75 74 70 75 74 20 61 20 6c 69 73 74 20  * Output a list 
2080: 6f 66 20 73 65 6c 65 63 74 20 3c 6f 70 74 69 6f  of select <optio
2090: 6e 3e 73 0a 20 2a 0a 20 2a 20 2d 20 45 69 74 68  n>s. *. * - Eith
20a0: 65 72 20 61 63 63 65 70 74 73 20 61 20 6f 70 74  er accepts a opt
20b0: 69 6f 6e 2c 76 61 6c 75 65 2c 66 69 65 6c 64 20  ion,value,field 
20c0: 6c 69 73 74 2e 0a 20 2a 20 2d 20 4f 72 20 61 6e  list.. * - Or an
20d0: 20 61 73 73 6f 63 69 61 74 69 76 65 20 61 72 72   associative arr
20e0: 61 79 2e 0a 20 2a 0a 20 2a 2f 0a 66 75 6e 63 74  ay.. *. */.funct
20f0: 69 6f 6e 20 66 6f 72 6d 5f 73 65 6c 65 63 74 5f  ion form_select_
2100: 6f 70 74 69 6f 6e 73 28 24 6e 61 6d 65 73 2c 20  options($names, 
2110: 24 76 61 6c 75 65 3d 4e 55 4c 4c 2c 20 24 72 3d  $value=NULL, $r=
2120: 22 22 29 20 7b 0a 0a 20 20 20 20 2f 2f 20 54 72  "") {..    // Tr
2130: 61 6e 73 66 6f 72 6d 20 63 6f 6d 6d 61 2d 73 65  ansform comma-se
2140: 70 61 72 61 74 65 64 20 73 74 72 69 6e 67 20 69  parated string i
2150: 6e 74 6f 20 61 72 72 61 79 0a 20 20 20 20 24 6d  nto array.    $m
2160: 61 70 20 3d 20 69 73 5f 73 74 72 69 6e 67 28 24  ap = is_string($
2170: 6e 61 6d 65 73 29 20 3f 20 61 72 72 61 79 5f 63  names) ? array_c
2180: 6f 6d 62 69 6e 65 28 24 6e 61 6d 65 73 20 3d 20  ombine($names = 
2190: 73 74 72 5f 67 65 74 63 73 76 28 24 6e 61 6d 65  str_getcsv($name
21a0: 73 29 2c 20 24 6e 61 6d 65 73 29 20 3a 20 24 6e  s), $names) : $n
21b0: 61 6d 65 73 3b 0a 20 20 20 20 0a 20 20 20 20 2f  ames;.    .    /
21c0: 2f 20 41 64 64 20 63 75 72 72 65 6e 74 6c 79 20  / Add currently 
21d0: 61 63 74 69 76 65 20 76 61 6c 75 65 20 69 66 20  active value if 
21e0: 6d 69 73 73 69 6e 67 0a 20 20 20 20 69 66 20 28  missing.    if (
21f0: 24 76 61 6c 75 65 20 61 6e 64 20 21 69 73 73 65  $value and !isse
2200: 74 28 24 6d 61 70 5b 24 76 61 6c 75 65 5d 29 20  t($map[$value]) 
2210: 61 6e 64 20 24 76 61 6c 75 65 20 21 3d 3d 20 4e  and $value !== N
2220: 55 4c 4c 29 20 7b 0a 20 20 20 20 20 20 20 20 24  ULL) {.        $
2230: 6d 61 70 5b 24 76 61 6c 75 65 5d 20 3d 20 24 76  map[$value] = $v
2240: 61 6c 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  alue;.    }.    
2250: 0a 20 20 20 20 2f 2f 20 4f 75 74 70 75 74 20 3c  .    // Output <
2260: 6f 70 74 69 6f 6e 3e 20 66 69 65 6c 64 73 0a 20  option> fields. 
2270: 20 20 20 66 6f 72 65 61 63 68 20 28 24 6d 61 70     foreach ($map
2280: 20 61 73 20 24 69 64 3d 3e 24 74 69 74 6c 65 29   as $id=>$title)
2290: 20 7b 0a 20 20 20 20 20 20 20 20 2f 2f 20 6f 70   {.        // op
22a0: 74 67 72 6f 75 70 0a 20 20 20 20 20 20 20 20 69  tgroup.        i
22b0: 66 20 28 69 73 5f 61 72 72 61 79 28 24 74 69 74  f (is_array($tit
22c0: 6c 65 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20  le)) {.         
22d0: 20 20 20 24 72 20 2e 3d 20 22 3c 6f 70 74 67 72     $r .= "<optgr
22e0: 6f 75 70 20 6c 61 62 65 6c 3d 5c 22 24 69 64 5c  oup label=\"$id\
22f0: 22 3e 22 20 2e 20 66 6f 72 6d 5f 73 65 6c 65 63  ">" . form_selec
2300: 74 5f 6f 70 74 69 6f 6e 73 28 24 74 69 74 6c 65  t_options($title
2310: 2c 20 24 76 61 6c 75 65 29 20 2e 20 22 3c 2f 6f  , $value) . "</o
2320: 70 74 67 72 6f 75 70 3e 22 3b 0a 20 20 20 20 20  ptgroup>";.     
2330: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2f 20     }.        // 
2340: 70 6c 61 69 6e 20 76 61 6c 75 65 20 66 69 65 6c  plain value fiel
2350: 64 0a 20 20 20 20 20 20 20 20 65 6c 73 65 20 7b  d.        else {
2360: 0a 20 20 20 20 20 20 20 20 20 20 20 20 24 72 20  .            $r 
2370: 2e 3d 20 22 3c 6f 70 74 69 6f 6e 22 20 2e 20 28  .= "<option" . (
2380: 24 69 64 20 3d 3d 20 24 76 61 6c 75 65 20 3f 20  $id == $value ? 
2390: 22 20 73 65 6c 65 63 74 65 64 22 20 3a 20 22 22  " selected" : ""
23a0: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
23b0: 20 20 2e 20 22 20 76 61 6c 75 65 3d 5c 22 24 69    . " value=\"$i
23c0: 64 5c 22 20 74 69 74 6c 65 3d 5c 22 24 74 69 74  d\" title=\"$tit
23d0: 6c 65 5c 22 3e 24 69 64 3c 2f 6f 70 74 69 6f 6e  le\">$id</option
23e0: 3e 22 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  >";.        }.  
23f0: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 24    }.    return $
2400: 72 3b 0a 7d 0a 0a 0a 2f 2a 2a 0a 20 2a 20 43 53  r;.}.../**. * CS
2410: 52 46 20 74 6f 6b 65 6e 20 67 65 6e 65 72 61 74  RF token generat
2420: 69 6f 6e 2f 76 65 72 69 66 69 63 61 74 69 6f 6e  ion/verification
2430: 2e 0a 20 2a 0a 20 2a 20 49 73 20 6f 6e 6c 79 20  .. *. * Is only 
2440: 75 73 65 64 20 66 6f 72 20 6c 6f 67 67 65 64 2d  used for logged-
2450: 69 6e 20 75 73 65 72 73 20 74 68 6f 75 67 68 2e  in users though.
2460: 20 48 65 72 65 20 74 68 65 79 27 72 65 20 6d 61   Here they're ma
2470: 69 6e 6c 79 20 74 6f 20 70 72 65 76 65 6e 74 0a  inly to prevent.
2480: 20 2a 20 72 65 6d 6f 74 65 6c 79 20 69 6e 69 74   * remotely init
2490: 69 61 74 65 64 20 72 65 71 75 65 73 74 73 20 61  iated requests a
24a0: 67 61 69 6e 73 74 20 6f 74 68 65 72 20 75 73 65  gainst other use
24b0: 72 73 2c 20 6e 6f 74 20 67 65 6e 65 72 61 6c 20  rs, not general 
24c0: 66 6f 72 6d 20 6e 6f 6e 63 65 73 2e 0a 20 2a 2f  form nonces.. */
24d0: 0a 66 75 6e 63 74 69 6f 6e 20 63 73 72 66 28 24  .function csrf($
24e0: 70 72 6f 62 65 3d 66 61 6c 73 65 29 20 7b 0a 0a  probe=false) {..
24f0: 20 20 20 20 2f 2f 20 54 6f 6b 65 6e 73 20 61 72      // Tokens ar
2500: 65 20 73 74 6f 72 65 64 20 69 6e 20 73 65 73 73  e stored in sess
2510: 69 6f 6e 2c 20 72 65 75 73 61 62 6c 65 2c 20 62  ion, reusable, b
2520: 75 74 20 6f 6e 6c 79 20 66 6f 72 20 61 6e 20 68  ut only for an h
2530: 6f 75 72 0a 20 20 20 20 24 73 74 6f 72 65 20 3d  our.    $store =
2540: 20 26 20 24 5f 53 45 53 53 49 4f 4e 5b 22 63 73   & $_SESSION["cs
2550: 72 66 22 5d 3b 0a 20 20 20 20 66 6f 72 65 61 63  rf"];.    foreac
2560: 68 20 28 24 73 74 6f 72 65 20 61 73 20 24 69 64  h ($store as $id
2570: 3d 3e 24 74 69 6d 65 29 20 7b 0a 20 20 20 20 20  =>$time) {.     
2580: 20 20 20 69 66 20 28 24 74 69 6d 65 20 3c 20 74     if ($time < t
2590: 69 6d 65 28 29 29 20 7b 20 75 6e 73 65 74 28 24  ime()) { unset($
25a0: 73 74 6f 72 65 5b 24 69 64 5d 29 3b 20 7d 0a 20  store[$id]); }. 
25b0: 20 20 20 7d 0a 20 20 20 20 0a 20 20 20 20 2f 2f     }.    .    //
25c0: 20 54 65 73 74 20 70 72 65 73 65 6e 63 65 0a 20   Test presence. 
25d0: 20 20 20 69 66 20 28 24 70 72 6f 62 65 29 20 7b     if ($probe) {
25e0: 0a 20 20 20 20 20 20 20 20 69 66 20 28 65 6d 70  .        if (emp
25f0: 74 79 28 24 5f 53 45 53 53 49 4f 4e 5b 22 6f 70  ty($_SESSION["op
2600: 65 6e 69 64 22 5d 29 29 20 7b 0a 20 20 20 20 20  enid"])) {.     
2610: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 52         return TR
2620: 55 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  UE;.        }.  
2630: 20 20 20 20 20 20 69 66 20 28 24 69 64 20 3d 20        if ($id = 
2640: 24 5f 52 45 51 55 45 53 54 2d 3e 6e 61 6d 65 5b  $_REQUEST->name[
2650: 22 5f 63 74 22 5d 29 20 7b 0a 20 20 20 20 20 20  "_ct"]) {.      
2660: 20 20 20 20 20 20 72 65 74 75 72 6e 20 69 73 73        return iss
2670: 65 74 28 24 73 74 6f 72 65 5b 24 69 64 5d 29 3b  et($store[$id]);
2680: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  .        }.    }
2690: 0a 20 20 20 20 0a 20 20 20 20 2f 2f 20 43 72 65  .    .    // Cre
26a0: 61 74 65 20 6e 65 77 20 65 6e 74 72 79 2c 20 6f  ate new entry, o
26b0: 75 74 70 75 74 20 66 6f 72 6d 20 66 69 65 6c 64  utput form field
26c0: 20 66 6f 72 20 74 6f 6b 65 6e 0a 20 20 20 20 65   for token.    e
26d0: 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 2f 2f  lse {.        //
26e0: 20 73 65 72 76 65 72 20 45 4e 56 20 61 6c 72 65   server ENV alre
26f0: 61 64 79 20 63 6f 6e 74 61 69 6e 65 64 20 41 70  ady contained Ap
2700: 61 63 68 65 20 75 6e 69 71 75 65 20 72 65 71 75  ache unique requ
2710: 65 73 74 20 69 64 20 65 74 63 2e 0a 20 20 20 20  est id etc..    
2720: 20 20 20 20 24 69 64 20 3d 20 73 68 61 31 28 73      $id = sha1(s
2730: 65 72 69 61 6c 69 7a 65 28 24 5f 53 45 52 56 45  erialize($_SERVE
2740: 52 2d 3e 5f 5f 76 61 72 73 29 29 3b 0a 20 20 20  R->__vars));.   
2750: 20 20 20 20 20 24 73 74 6f 72 65 5b 24 69 64 5d       $store[$id]
2760: 20 3d 20 74 69 6d 65 28 29 20 2b 20 33 36 30 30   = time() + 3600
2770: 3b 20 20 2f 2f 20 74 69 6d 65 6f 75 74 0a 20 20  ;  // timeout.  
2780: 20 20 20 20 20 20 72 65 74 75 72 6e 20 22 3c 69        return "<i
2790: 6e 70 75 74 20 74 79 70 65 3d 68 69 64 64 65 6e  nput type=hidden
27a0: 20 6e 61 6d 65 3d 2e 63 74 20 76 61 6c 75 65 3d   name=.ct value=
27b0: 24 69 64 3e 22 3b 0a 20 20 20 20 7d 0a 7d 0a 0a  $id>";.    }.}..
27c0: 0a 2f 2a 2a 0a 20 2a 20 54 72 69 76 69 61 6c 20  ./**. * Trivial 
27d0: 63 68 65 63 6b 20 61 67 61 69 6e 73 74 20 77 65  check against we
27e0: 6c 6c 2d 6b 6e 6f 77 6e 20 70 72 6f 6a 65 63 74  ll-known project
27f0: 20 73 70 61 6d 2e 0a 20 2a 0a 20 2a 2f 0a 66 75   spam.. *. */.fu
2800: 6e 63 74 69 6f 6e 20 64 61 74 61 5f 62 6c 61 63  nction data_blac
2810: 6b 6c 69 73 74 65 64 28 24 72 65 6c 65 61 73 65  klisted($release
2820: 29 20 7b 0a 20 20 20 20 24 72 75 6c 65 73 20 3d  ) {.    $rules =
2830: 20 61 72 72 61 79 28 0a 20 20 20 20 20 20 20 20   array(.        
2840: 22 73 75 62 6d 69 74 74 65 72 22 20 3d 3e 20 22  "submitter" => "
2850: 2f 77 69 6c 6d 69 78 20 6a 2f 69 22 2c 0a 20 20  /wilmix j/i",.  
2860: 20 20 20 20 20 20 22 68 6f 6d 65 70 61 67 65 22        "homepage"
2870: 20 3d 3e 20 22 7e 77 69 6c 6d 69 78 7c 7a 65 65   => "~wilmix|zee
2880: 73 6d 6f 76 69 65 7c 73 6f 66 74 77 61 72 65 72  smovie|softwarer
2890: 65 76 69 65 77 73 7c 64 69 63 6c 6f 66 65 6e 61  eviews|diclofena
28a0: 63 7c 5c 2f 5c 2f 62 75 79 2d 7e 69 22 2c 0a 20  c|\/\/buy-~i",. 
28b0: 20 20 20 20 20 20 20 22 6e 61 6d 65 22 20 3d 3e         "name" =>
28c0: 20 22 2f 44 4f 4c 4c 41 52 7c 4a 44 6f 6c 6c 61   "/DOLLAR|JDolla
28d0: 72 7c 4a 65 68 6f 76 61 68 7c 4d 69 6c 6c 69 6f  r|Jehovah|Millio
28e0: 6e 61 69 72 65 20 2a 73 2f 22 2c 0a 20 20 20 20  naire *s/",.    
28f0: 20 20 20 20 22 64 65 73 63 72 69 70 74 69 6f 6e      "description
2900: 22 20 3d 3e 20 22 2f 76 69 61 67 72 61 7c 6c 65  " => "/viagra|le
2910: 76 69 74 72 61 7c 74 65 74 72 61 63 79 63 6c 69  vitra|tetracycli
2920: 6e 65 2a 73 7c 71 75 69 63 6b 62 6f 6f 6b 73 2f  ne*s|quickbooks/
2930: 22 2c 0a 20 20 20 20 29 3b 0a 20 20 20 20 66 6f  ",.    );.    fo
2940: 72 65 61 63 68 20 28 24 72 75 6c 65 73 20 61 73  reach ($rules as
2950: 20 24 66 69 65 6c 64 20 3d 3e 20 24 72 78 29 20   $field => $rx) 
2960: 7b 0a 20 20 20 20 20 20 20 20 69 66 20 28 70 72  {.        if (pr
2970: 65 67 5f 6d 61 74 63 68 28 24 72 78 2c 20 24 72  eg_match($rx, $r
2980: 65 6c 65 61 73 65 5b 24 66 69 65 6c 64 5d 29 29  elease[$field]))
2990: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72   {.            r
29a0: 65 74 75 72 6e 20 54 52 55 45 3b 0a 20 20 20 20  eturn TRUE;.    
29b0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
29c0: 72 65 74 75 72 6e 20 66 61 6c 73 65 3b 0a 7d 0a  return false;.}.
29d0: 0a 0a 0a 0a 23 2d 2d 20 53 6f 6d 65 20 73 74 72  ....#-- Some str
29e0: 69 6e 67 20 70 61 72 73 69 6e 67 0a 0a 0a 2f 2a  ing parsing.../*
29f0: 2a 0a 20 2a 20 20 50 6c 61 69 6e 20 63 6f 6d 6d  *. *  Plain comm
2a00: 61 2d 73 65 70 61 72 61 74 65 64 20 6c 69 73 74  a-separated list
2a10: 0a 20 2a 0a 20 2a 2f 0a 66 75 6e 63 74 69 6f 6e  . *. */.function
2a20: 20 70 5f 63 73 76 28 24 73 74 72 29 20 7b 0a 20   p_csv($str) {. 
2a30: 20 20 20 72 65 74 75 72 6e 20 70 72 65 67 5f 73     return preg_s
2a40: 70 6c 69 74 28 22 2f 5c 73 2a 2c 5c 73 2a 2f 22  plit("/\s*,\s*/"
2a50: 2c 20 74 72 69 6d 28 24 73 74 72 29 29 3b 0a 7d  , trim($str));.}
2a60: 0a 0a 0a 2f 2a 2a 0a 20 2a 20 20 45 78 74 72 61  .../**. *  Extra
2a70: 63 74 73 20 6b 65 79 20 3d 20 76 61 6c 75 65 20  cts key = value 
2a80: 6c 69 73 74 2e 0a 20 2a 20 20 4b 65 79 73 20 6d  list.. *  Keys m
2a90: 61 79 20 62 65 20 77 72 61 70 70 65 64 20 69 6e  ay be wrapped in
2aa0: 20 24 2c 20 25 20 6f 72 20 5b 5d 0a 20 2a 20 20   $, % or []. *  
2ab0: 56 61 6c 75 65 73 20 6d 61 79 20 6e 6f 74 20 63  Values may not c
2ac0: 6f 6e 74 61 69 6e 20 73 70 61 63 65 73 0a 20 2a  ontain spaces. *
2ad0: 0a 20 2a 2f 0a 66 75 6e 63 74 69 6f 6e 20 70 5f  . */.function p_
2ae0: 6b 65 79 5f 76 61 6c 75 65 28 24 73 74 72 2c 20  key_value($str, 
2af0: 24 63 61 73 65 3d 43 41 53 45 5f 4c 4f 57 45 52  $case=CASE_LOWER
2b00: 2c 20 24 6d 61 74 63 68 3d 22 5c 53 2b 22 29 20  , $match="\S+") 
2b10: 7b 0a 20 20 20 20 70 72 65 67 5f 6d 61 74 63 68  {.    preg_match
2b20: 5f 61 6c 6c 28 0a 20 20 20 20 20 20 20 20 22 40  _all(.        "@
2b30: 0a 20 20 20 20 20 20 20 20 20 20 20 5b 5b 25 24  .           [[%$
2b40: 5d 2a 20 20 28 5b 2d 5c 77 5d 2b 29 20 20 5b 5d  ]*  ([-\w]+)  []
2b50: 25 24 5d 2a 0a 20 20 20 20 20 20 20 20 20 20 20  %$]*.           
2b60: 20 20 20 5c 68 2a 20 20 5b 3a 3d 3e 5d 2b 20 20     \h*  [:=>]+  
2b70: 5c 68 2a 0a 20 20 20 20 20 20 20 20 20 20 20 20  \h*.            
2b80: 20 20 20 20 20 20 20 28 24 6d 61 74 63 68 29 0a         ($match).
2b90: 20 20 20 20 20 20 20 20 20 20 20 28 3f 3c 21 5b             (?<![
2ba0: 2c 2e 3b 5d 29 0a 20 20 20 20 20 20 20 20 40 69  ,.;]).        @i
2bb0: 6d 73 78 22 2c 0a 20 20 20 20 20 20 20 20 24 73  msx",.        $s
2bc0: 74 72 2c 20 24 6d 0a 20 20 20 20 29 3b 0a 20 20  tr, $m.    );.  
2bd0: 20 20 24 72 20 3d 20 61 72 72 61 79 5f 63 6f 6d    $r = array_com
2be0: 62 69 6e 65 28 24 6d 5b 31 5d 2c 20 24 6d 5b 32  bine($m[1], $m[2
2bf0: 5d 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 69  ]);.    return i
2c00: 73 5f 69 6e 74 28 24 63 61 73 65 29 20 3f 20 61  s_int($case) ? a
2c10: 72 72 61 79 5f 63 68 61 6e 67 65 5f 6b 65 79 5f  rray_change_key_
2c20: 63 61 73 65 28 24 72 2c 20 24 63 61 73 65 29 20  case($r, $case) 
2c30: 3a 20 24 72 3b 0a 7d 0a 0a 0a 0a 0a 3f 3e        : $r;.}.....?>