⌈⌋ branch:  freshcode


Hex Artifact Content

Artifact 068d8c89f9adc522f5862cc7b1c49788b8978a01:

  • File page_feed.php — part of check-in [de80c25858] at 2017-06-12 23:11:09 on branch trunk — Check for UTF-8 encoding mismatches before piping row to feed. Also: add `summary` field. (user: mario size: 7153)

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 63 6f 64 65 0a 20 2a 20 74  : freshcode. * t
0020: 69 74 6c 65 3a 20 6a 73 6f 6e 20 66 65 65 64 73  itle: json feeds
0030: 0a 20 2a 20 64 65 73 63 72 69 70 74 69 6f 6e 3a  . * description:
0040: 20 65 78 63 68 61 6e 67 65 20 70 72 6f 74 6f 63   exchange protoc
0050: 6f 6c 20 61 6e 64 20 70 65 72 2d 70 72 6f 6a 65  ol and per-proje
0060: 63 74 20 66 65 65 64 73 0a 20 2a 20 76 65 72 73  ct feeds. * vers
0070: 69 6f 6e 3a 20 31 2e 31 0a 20 2a 20 6c 69 63 65  ion: 1.1. * lice
0080: 6e 73 65 3a 20 43 43 2d 42 59 2d 53 41 0a 20 2a  nse: CC-BY-SA. *
0090: 20 64 65 70 65 6e 64 73 3a 20 70 68 70 3a 6a 73   depends: php:js
00a0: 6f 6e 2c 20 66 65 65 64 65 72 0a 20 2a 0a 20 2a  on, feeder. *. *
00b0: 20 47 65 6e 65 72 61 74 65 73 20 2f 78 66 65 72   Generates /xfer
00c0: 20 73 74 72 65 61 6d 20 61 6e 64 20 70 65 72 2d   stream and per-
00d0: 2f 70 72 6f 6a 65 63 74 20 72 65 6c 65 61 73 65  /project release
00e0: 20 66 65 65 64 73 2e 0a 20 2a 20 52 65 74 75 72   feeds.. * Retur
00f0: 6e 73 20 4a 53 4f 4e 20 28 69 6e 74 65 72 63 68  ns JSON (interch
0100: 61 6e 67 65 20 66 6f 72 6d 61 74 29 20 61 6e 64  ange format) and
0110: 20 52 53 53 20 6f 72 20 41 74 6f 6d 20 66 65 65   RSS or Atom fee
0120: 64 73 2e 0a 20 2a 0a 20 2a 20 54 68 65 20 55 52  ds.. *. * The UR
0130: 4c 20 73 63 68 65 6d 65 73 3a 0a 20 2a 20 20 20  L schemes:. *   
0140: 20 68 74 74 70 3a 2f 2f 66 72 65 73 68 63 6f 64   http://freshcod
0150: 65 2e 63 6c 75 62 2f 66 65 65 64 2f 70 72 6f 6a  e.club/feed/proj
0160: 65 63 74 6e 61 6d 65 20 20 20 20 28 2e 6a 73 6f  ectname    (.jso
0170: 6e 20 6f 70 74 69 6f 6e 61 6c 29 0a 20 2a 20 20  n optional). *  
0180: 20 20 68 74 74 70 3a 2f 2f 66 72 65 73 68 63 6f    http://freshco
0190: 64 65 2e 63 6c 75 62 2f 66 65 65 64 2f 70 72 6f  de.club/feed/pro
01a0: 6a 65 63 74 6e 61 6d 65 2e 72 73 73 0a 20 2a 20  jectname.rss. * 
01b0: 20 20 20 68 74 74 70 3a 2f 2f 66 72 65 73 68 63     http://freshc
01c0: 6f 64 65 2e 63 6c 75 62 2f 66 65 65 64 2f 70 72  ode.club/feed/pr
01d0: 6f 6a 65 63 74 6e 61 6d 65 2e 61 74 6f 6d 0a 20  ojectname.atom. 
01e0: 2a 20 46 6f 72 20 74 68 65 20 63 6f 6d 70 6c 65  * For the comple
01f0: 74 65 20 73 69 74 65 20 75 70 64 61 74 65 20 6c  te site update l
0200: 69 73 74 3a 0a 20 2a 20 20 20 20 68 74 74 70 3a  ist:. *    http:
0210: 2f 2f 66 72 65 73 68 63 6f 64 65 2e 63 6c 75 62  //freshcode.club
0220: 2f 66 65 65 64 2f 78 66 65 72 20 20 20 20 20 20  /feed/xfer      
0230: 20 20 20 28 2e 6a 73 6f 6e 2f 2e 61 74 6f 6d 2f     (.json/.atom/
0240: 2e 72 73 73 29 0a 20 2a 0a 20 2a 20 4e 6f 20 43  .rss). *. * No C
0250: 6f 6e 74 65 6e 74 2d 4e 65 67 6f 74 69 61 74 69  ontent-Negotiati
0260: 6f 6e 20 68 65 72 65 2c 20 61 73 20 6e 6f 62 6f  on here, as nobo
0270: 64 79 20 69 73 20 65 76 65 6e 20 62 6f 74 68 65  dy is even bothe
0280: 72 69 6e 67 0a 20 2a 20 61 6e 79 6d 6f 72 65 2e  ring. * anymore.
0290: 20 54 68 65 20 2e 68 74 61 63 63 65 73 73 20 64   The .htaccess d
02a0: 69 73 70 61 74 63 68 69 6e 67 20 61 64 64 73 20  ispatching adds 
02b0: 74 68 65 20 3f 65 78 74 3d 72 73 73 20 69 66 20  the ?ext=rss if 
02c0: 61 6e 0a 20 2a 20 65 78 74 65 6e 73 69 6f 6e 20  an. * extension 
02d0: 28 2e 6a 73 6f 6e 20 2f 20 2e 61 74 6f 6d 20 2f  (.json / .atom /
02e0: 20 2e 72 73 73 29 20 77 61 73 20 61 70 70 65 6e   .rss) was appen
02f0: 64 65 64 2e 0a 20 2a 0a 20 2a 0a 20 2a 20 4a 53  ded.. *. *. * JS
0300: 4f 4e 20 46 4f 52 4d 41 54 0a 20 2a 0a 20 2a 20  ON FORMAT. *. * 
0310: 20 20 49 73 20 73 74 69 6c 6c 20 73 75 73 63 65    Is still susce
0320: 70 74 69 62 6c 65 20 74 6f 20 63 68 61 6e 67 65  ptible to change
0330: 73 2e 20 43 75 72 72 65 6e 74 6c 79 20 66 72 65  s. Currently fre
0340: 73 68 63 6f 64 65 2e 63 6c 75 62 0a 20 2a 20 20  shcode.club. *  
0350: 20 73 65 65 6d 73 20 74 68 65 20 6f 6e 6c 79 20   seems the only 
0360: 46 4d 2d 72 65 69 6d 70 6c 65 6d 65 6e 74 61 74  FM-reimplementat
0370: 69 6f 6e 2e 20 42 75 74 20 6f 62 76 69 6f 75 73  ion. But obvious
0380: 6c 79 20 74 68 65 20 64 61 74 61 0a 20 2a 20 20  ly the data. *  
0390: 20 66 6f 72 6d 61 74 20 73 68 6f 75 6c 64 20 63   format should c
03a0: 6f 6e 76 65 72 67 65 20 74 6f 20 66 61 63 69 6c  onverge to facil
03b0: 69 74 61 74 65 20 70 72 6f 70 65 72 20 73 79 6e  itate proper syn
03c0: 63 68 72 6f 6e 69 7a 61 74 69 6f 6e 2e 0a 20 2a  chronization.. *
03d0: 0a 20 2a 20 20 20 2f 66 65 65 64 2f 78 66 65 72  . *   /feed/xfer
03e0: 20 61 6c 73 6f 20 64 6f 65 73 6e 27 74 20 70 72   also doesn't pr
03f0: 6f 76 69 64 65 20 74 68 65 20 72 61 77 20 44 42  ovide the raw DB
0400: 20 63 6f 6e 74 65 6e 74 73 2e 20 4f 70 65 6e 49   contents. OpenI
0410: 44 0a 20 2a 20 20 20 68 61 6e 64 6c 65 73 20 61  D. *   handles a
0420: 72 65 20 73 74 72 69 70 70 65 64 2c 20 61 6e 64  re stripped, and
0430: 20 70 65 72 73 6f 6e 61 6c 6c 79 20 69 64 65 6e   personally iden
0440: 74 69 66 79 61 62 6c 65 20 69 6e 66 6f 73 20 0a  tifyable infos .
0450: 20 2a 20 20 20 64 72 6f 70 70 65 64 20 28 65 2e   *   dropped (e.
0460: 67 2e 20 67 72 61 76 61 74 61 72 20 65 6d 61 69  g. gravatar emai
0470: 6c 29 2e 0a 20 2a 20 20 20 4f 74 68 65 72 77 69  l).. *   Otherwi
0480: 73 65 20 69 74 27 73 20 73 69 6d 69 6c 61 72 20  se it's similar 
0490: 74 6f 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  to the internal 
04a0: 64 61 74 61 62 61 73 65 20 73 74 72 75 63 74 75  database structu
04b0: 72 65 2e 0a 20 2a 0a 20 2a 2f 0a 0a 0a 2f 2a 2a  re.. *. */.../**
04c0: 0a 20 2a 20 67 72 6f 75 70 20 61 6e 64 20 72 65  . * group and re
04d0: 6e 61 6d 65 20 69 6e 74 65 72 6e 61 6c 20 63 6f  name internal co
04e0: 6c 75 6d 6e 73 20 69 6e 74 6f 20 66 65 65 64 20  lumns into feed 
04f0: 73 74 72 75 63 74 75 72 65 0a 20 2a 0a 20 2a 2f  structure. *. */
0500: 0a 0a 23 2d 2d 20 67 65 6e 65 72 61 6c 20 70 72  ..#-- general pr
0510: 6f 6a 65 63 74 20 64 65 73 63 72 69 70 74 69 6f  oject descriptio
0520: 6e 0a 66 75 6e 63 74 69 6f 6e 20 66 65 65 64 5f  n.function feed_
0530: 70 72 6f 6a 65 63 74 28 24 72 6f 77 29 20 7b 0a  project($row) {.
0540: 20 20 20 20 72 65 74 75 72 6e 20 61 72 72 61 79      return array
0550: 28 0a 20 20 20 20 20 20 20 20 22 6e 61 6d 65 22  (.        "name"
0560: 20 3d 3e 20 24 72 6f 77 5b 22 6e 61 6d 65 22 5d   => $row["name"]
0570: 2c 0a 20 20 20 20 20 20 20 20 22 74 69 74 6c 65  ,.        "title
0580: 22 20 3d 3e 20 24 72 6f 77 5b 22 74 69 74 6c 65  " => $row["title
0590: 22 5d 2c 0a 20 20 20 20 20 20 20 20 22 73 75 6d  "],.        "sum
05a0: 6d 61 72 79 22 20 3d 3e 20 24 72 6f 77 5b 22 73  mary" => $row["s
05b0: 75 6d 6d 61 72 79 22 5d 2c 0a 20 20 20 20 20 20  ummary"],.      
05c0: 20 20 22 64 65 73 63 72 69 70 74 69 6f 6e 22 20    "description" 
05d0: 3d 3e 20 24 72 6f 77 5b 22 64 65 73 63 72 69 70  => $row["descrip
05e0: 74 69 6f 6e 22 5d 2c 0a 20 20 20 20 20 20 20 20  tion"],.        
05f0: 22 68 6f 6d 65 70 61 67 65 22 20 3d 3e 20 24 72  "homepage" => $r
0600: 6f 77 5b 22 68 6f 6d 65 70 61 67 65 22 5d 2c 0a  ow["homepage"],.
0610: 20 20 20 20 20 20 20 20 22 6c 69 63 65 6e 73 65          "license
0620: 22 20 3d 3e 20 24 72 6f 77 5b 22 6c 69 63 65 6e  " => $row["licen
0630: 73 65 22 5d 2c 0a 20 20 20 20 20 20 20 20 22 74  se"],.        "t
0640: 61 67 73 22 20 3d 3e 20 24 72 6f 77 5b 22 74 61  ags" => $row["ta
0650: 67 73 22 5d 2c 0a 20 20 20 20 20 20 20 20 22 69  gs"],.        "i
0660: 6d 61 67 65 22 20 3d 3e 20 24 72 6f 77 5b 22 69  mage" => $row["i
0670: 6d 61 67 65 22 5d 2c 0a 20 20 20 20 20 20 20 20  mage"],.        
0680: 22 73 75 62 6d 69 74 74 65 72 22 20 3d 3e 20 24  "submitter" => $
0690: 72 6f 77 5b 22 73 75 62 6d 69 74 74 65 72 22 5d  row["submitter"]
06a0: 2c 0a 20 20 20 20 20 20 20 20 22 75 72 6c 73 22  ,.        "urls"
06b0: 20 3d 3e 20 70 5f 6b 65 79 5f 76 61 6c 75 65 28   => p_key_value(
06c0: 24 72 6f 77 5b 22 75 72 6c 73 22 5d 2c 20 43 41  $row["urls"], CA
06d0: 53 45 5f 4c 4f 57 45 52 29 2c 0a 20 20 20 20 29  SE_LOWER),.    )
06e0: 3b 0a 7d 0a 0a 23 2d 2d 20 76 65 72 73 69 6f 6e  ;.}..#-- version
06f0: 2f 72 65 6c 65 61 73 65 20 62 6c 6f 63 6b 73 0a  /release blocks.
0700: 66 75 6e 63 74 69 6f 6e 20 66 65 65 64 5f 72 65  function feed_re
0710: 6c 65 61 73 65 28 24 72 6f 77 29 20 7b 0a 20 20  lease($row) {.  
0720: 20 20 72 65 74 75 72 6e 20 61 72 72 61 79 28 0a    return array(.
0730: 20 20 20 20 20 20 20 20 22 76 65 72 73 69 6f 6e          "version
0740: 22 20 3d 3e 20 24 72 6f 77 5b 22 76 65 72 73 69  " => $row["versi
0750: 6f 6e 22 5d 2c 0a 20 20 20 20 20 20 20 20 22 73  on"],.        "s
0760: 74 61 74 65 22 20 3d 3e 20 24 72 6f 77 5b 22 73  tate" => $row["s
0770: 74 61 74 65 22 5d 2c 0a 20 20 20 20 20 20 20 20  tate"],.        
0780: 22 73 63 6f 70 65 22 20 3d 3e 20 24 72 6f 77 5b  "scope" => $row[
0790: 22 73 63 6f 70 65 22 5d 2c 0a 20 20 20 20 20 20  "scope"],.      
07a0: 20 20 22 63 68 61 6e 67 65 73 22 20 3d 3e 20 24    "changes" => $
07b0: 72 6f 77 5b 22 63 68 61 6e 67 65 73 22 5d 2c 0a  row["changes"],.
07c0: 20 20 20 20 20 20 20 20 22 64 6f 77 6e 6c 6f 61          "downloa
07d0: 64 22 20 3d 3e 20 76 65 72 73 69 6f 6e 65 64 5f  d" => versioned_
07e0: 75 72 6c 28 24 72 6f 77 5b 22 64 6f 77 6e 6c 6f  url($row["downlo
07f0: 61 64 22 5d 2c 20 24 72 6f 77 5b 22 76 65 72 73  ad"], $row["vers
0800: 69 6f 6e 22 5d 29 2c 0a 20 20 20 20 20 20 20 20  ion"]),.        
0810: 22 70 75 62 6c 69 73 68 65 64 22 20 3d 3e 20 67  "published" => g
0820: 6d 64 61 74 65 28 44 61 74 65 54 69 6d 65 3a 3a  mdate(DateTime::
0830: 49 53 4f 38 36 30 31 2c 20 24 72 6f 77 5b 22 74  ISO8601, $row["t
0840: 5f 70 75 62 6c 69 73 68 65 64 22 5d 29 2c 0a 20  _published"]),. 
0850: 20 20 20 29 3b 0a 7d 0a 0a 23 2d 2d 20 65 78 63     );.}..#-- exc
0860: 68 61 6e 67 65 20 64 61 74 61 0a 66 75 6e 63 74  hange data.funct
0870: 69 6f 6e 20 66 65 65 64 5f 78 66 65 72 28 24 72  ion feed_xfer($r
0880: 6f 77 29 20 7b 0a 20 20 20 20 72 65 74 75 72 6e  ow) {.    return
0890: 20 61 72 72 61 79 28 0a 20 20 20 20 20 20 20 20   array(.        
08a0: 22 68 69 64 64 65 6e 22 20 3d 3e 20 24 72 6f 77  "hidden" => $row
08b0: 5b 22 68 69 64 64 65 6e 22 5d 2c 0a 20 20 20 20  ["hidden"],.    
08c0: 20 20 20 20 22 63 68 61 6e 67 65 64 22 20 3d 3e      "changed" =>
08d0: 20 67 6d 64 61 74 65 28 44 61 74 65 54 69 6d 65   gmdate(DateTime
08e0: 3a 3a 49 53 4f 38 36 30 31 2c 20 24 72 6f 77 5b  ::ISO8601, $row[
08f0: 22 74 5f 70 75 62 6c 69 73 68 65 64 22 5d 29 2c  "t_published"]),
0900: 0a 20 20 20 20 20 20 20 20 22 61 75 74 6f 75 70  .        "autoup
0910: 64 61 74 65 5f 6d 6f 64 75 6c 65 22 20 3d 3e 20  date_module" => 
0920: 24 72 6f 77 5b 22 61 75 74 6f 75 70 64 61 74 65  $row["autoupdate
0930: 5f 6d 6f 64 75 6c 65 22 5d 2c 0a 20 20 20 20 20  _module"],.     
0940: 20 20 20 22 61 75 74 6f 75 70 64 61 74 65 5f 75     "autoupdate_u
0950: 72 6c 22 20 3d 3e 20 24 72 6f 77 5b 22 61 75 74  rl" => $row["aut
0960: 6f 75 70 64 61 74 65 5f 75 72 6c 22 5d 2c 0a 20  oupdate_url"],. 
0970: 20 20 20 20 20 20 20 22 61 75 74 6f 75 70 64 61         "autoupda
0980: 74 65 5f 72 65 67 65 78 22 20 3d 3e 20 24 72 6f  te_regex" => $ro
0990: 77 5b 22 61 75 74 6f 75 70 64 61 74 65 5f 72 65  w["autoupdate_re
09a0: 67 65 78 22 5d 2c 0a 20 20 20 20 20 20 20 20 2f  gex"],.        /
09b0: 2f 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c  / following fiel
09c0: 64 73 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 74  ds will not be t
09d0: 72 61 6e 73 66 65 72 72 65 64 20 66 6f 72 20 70  ransferred for p
09e0: 72 69 76 61 63 79 20 72 65 61 73 6f 6e 73 0a 20  rivacy reasons. 
09f0: 20 20 20 20 20 20 23 20 22 73 75 62 6d 69 74 74        # "submitt
0a00: 65 72 5f 6f 70 65 6e 69 64 22 20 3d 3e 20 24 72  er_openid" => $r
0a10: 6f 77 5b 22 73 75 62 6d 69 74 74 65 72 5f 6f 70  ow["submitter_op
0a20: 65 6e 69 64 22 5d 2c 0a 20 20 20 20 20 20 20 23  enid"],.       #
0a30: 20 22 6c 6f 63 6b 22 20 3d 3e 20 24 72 6f 77 5b   "lock" => $row[
0a40: 22 73 75 62 6d 69 74 74 65 72 5f 6c 6f 63 6b 22  "submitter_lock"
0a50: 5d 2c 0a 20 20 20 20 29 3b 0a 7d 0a 0a 0a 0a 0a  ],.    );.}.....
0a60: 23 2d 2d 20 73 6f 6d 65 74 68 69 6e 67 20 77 61  #-- something wa
0a70: 73 20 72 65 71 75 65 73 74 65 64 0a 69 66 20 28  s requested.if (
0a80: 24 6e 61 6d 65 20 3d 20 24 5f 47 45 54 2d 3e 70  $name = $_GET->p
0a90: 72 6f 6a 5f 6e 61 6d 65 5b 22 6e 61 6d 65 22 5d  roj_name["name"]
0aa0: 29 20 7b 0a 20 20 20 20 6c 69 73 74 28 24 6e 61  ) {.    list($na
0ab0: 6d 65 2c 20 24 65 78 74 2c 20 29 20 3d 20 65 78  me, $ext, ) = ex
0ac0: 70 6c 6f 64 65 28 22 2e 22 2c 20 22 24 6e 61 6d  plode(".", "$nam
0ad0: 65 2e 6a 73 6f 6e 22 29 3b 0a 0a 20 20 20 20 24  e.json");..    $
0ae0: 66 65 65 64 20 3d 20 61 72 72 61 79 28 0a 20 20  feed = array(.  
0af0: 20 20 20 20 20 20 22 5c 24 66 65 65 64 2d 6f 72        "\$feed-or
0b00: 69 67 69 6e 22 20 3d 3e 20 22 68 74 74 70 3a 2f  igin" => "http:/
0b10: 2f 66 72 65 73 68 63 6f 64 65 2e 63 6c 75 62 2f  /freshcode.club/
0b20: 22 2c 0a 20 20 20 20 20 20 20 20 22 5c 24 66 65  ",.        "\$fe
0b30: 65 64 2d 6c 69 63 65 6e 73 65 22 20 3d 3e 20 22  ed-license" => "
0b40: 43 43 2d 42 59 2d 53 41 20 33 2e 30 22 2c 0a 20  CC-BY-SA 3.0",. 
0b50: 20 20 20 29 3b 0a 0a 0a 20 20 20 20 23 2d 2d 20     );...    #-- 
0b60: 65 78 63 68 61 6e 67 65 20 64 61 74 61 0a 20 20  exchange data.  
0b70: 20 20 69 66 20 28 24 6e 61 6d 65 20 3d 3d 20 22    if ($name == "
0b80: 78 66 65 72 22 29 20 7b 0a 20 20 20 20 20 20 20  xfer") {.       
0b90: 20 24 66 65 65 64 5b 22 72 65 6c 65 61 73 65 73   $feed["releases
0ba0: 22 5d 20 3d 20 61 72 72 61 79 28 29 3b 0a 20 20  "] = array();.  
0bb0: 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 24        .        $
0bc0: 72 20 3d 20 64 62 28 22 0a 20 20 20 20 20 20 20  r = db(".       
0bd0: 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 0a         SELECT *.
0be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0bf0: 46 52 4f 4d 20 72 65 6c 65 61 73 65 0a 20 20 20  FROM release.   
0c00: 20 20 20 20 20 20 20 20 20 20 20 20 57 48 45 52              WHER
0c10: 45 20 4e 4f 54 20 64 65 6c 65 74 65 64 0a 20 20  E NOT deleted.  
0c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 41                 A
0c30: 4e 44 20 4e 4f 54 20 68 69 64 64 65 6e 0a 20 20  ND NOT hidden.  
0c40: 20 20 20 20 20 20 20 20 20 20 47 52 4f 55 50 20            GROUP 
0c50: 42 59 20 6e 61 6d 65 2c 20 74 5f 70 75 62 6c 69  BY name, t_publi
0c60: 73 68 65 64 0a 20 20 20 20 20 20 20 20 20 20 20  shed.           
0c70: 20 4f 52 44 45 52 20 42 59 20 74 5f 70 75 62 6c   ORDER BY t_publ
0c80: 69 73 68 65 64 20 44 45 53 43 2c 20 74 5f 63 68  ished DESC, t_ch
0c90: 61 6e 67 65 64 20 44 45 53 43 0a 20 20 20 20 20  anged DESC.     
0ca0: 20 20 20 20 20 20 20 20 20 20 4c 49 4d 49 54 20            LIMIT 
0cb0: 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ?.              
0cc0: 4f 46 46 53 45 54 20 3f 22 2c 0a 20 20 20 20 20  OFFSET ?",.     
0cd0: 20 20 20 20 20 20 20 24 5f 47 45 54 2d 3e 69 6e         $_GET->in
0ce0: 74 2d 3e 64 65 66 61 75 6c 74 e2 80 a6 31 30 30  t->default...100
0cf0: 2d 3e 72 61 6e 67 65 e2 80 a6 31 e2 80 a6 31 35  ->range...1...15
0d00: 30 30 30 5b 22 6e 75 6d 22 5d 2c 0a 20 20 20 20  000["num"],.    
0d10: 20 20 20 20 20 20 20 20 24 5f 47 45 54 2d 3e 69          $_GET->i
0d20: 6e 74 2d 3e 64 65 66 61 75 6c 74 e2 80 a6 30 5b  nt->default...0[
0d30: 22 6f 66 66 73 65 74 22 5d 0a 20 20 20 20 20 20  "offset"].      
0d40: 20 20 29 3b 0a 20 20 20 20 20 20 20 20 24 69 20    );.        $i 
0d50: 3d 20 24 66 20 3d 20 30 3b 0a 23 20 20 20 20 20  = $f = 0;.#     
0d60: 20 20 20 65 72 72 6f 72 5f 72 65 70 6f 72 74 69     error_reporti
0d70: 6e 67 28 45 5f 41 4c 4c 29 3b 0a 23 20 20 20 20  ng(E_ALL);.#    
0d80: 20 20 20 20 73 65 74 5f 65 72 72 6f 72 5f 68 61      set_error_ha
0d90: 6e 64 6c 65 72 28 22 76 61 72 5f 64 75 6d 70 22  ndler("var_dump"
0da0: 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61  );.        forea
0db0: 63 68 20 28 24 72 20 61 73 20 24 72 6f 77 29 20  ch ($r as $row) 
0dc0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 24 69  {.            $i
0dd0: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
0de0: 69 66 20 28 6a 73 6f 6e 5f 65 6e 63 6f 64 65 28  if (json_encode(
0df0: 24 72 6f 77 29 29 20 7b 0a 20 20 20 20 20 20 20  $row)) {.       
0e00: 20 20 20 20 20 20 20 20 20 20 24 66 65 65 64 5b            $feed[
0e10: 22 72 65 6c 65 61 73 65 73 22 5d 5b 5d 20 3d 20  "releases"][] = 
0e20: 66 65 65 64 5f 70 72 6f 6a 65 63 74 28 24 72 6f  feed_project($ro
0e30: 77 29 20 2b 20 66 65 65 64 5f 72 65 6c 65 61 73  w) + feed_releas
0e40: 65 28 24 72 6f 77 29 20 2b 20 66 65 65 64 5f 78  e($row) + feed_x
0e50: 66 65 72 28 24 72 6f 77 29 3b 0a 20 20 20 20 20  fer($row);.     
0e60: 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 20         } else { 
0e70: 24 66 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 20 20  $f++; }.        
0e80: 7d 0a 20 20 20 20 20 20 20 20 68 65 61 64 65 72  }.        header
0e90: 28 22 58 2d 43 6f 75 6e 74 3a 20 24 69 22 29 3b  ("X-Count: $i");
0ea0: 0a 20 20 20 20 20 20 20 20 68 65 61 64 65 72 28  .        header(
0eb0: 22 58 2d 49 6e 76 61 6c 69 64 2d 45 6e 63 6f 64  "X-Invalid-Encod
0ec0: 69 6e 67 3a 20 24 66 22 29 3b 0a 20 20 20 20 7d  ing: $f");.    }
0ed0: 0a 0a 20 20 20 20 0a 20 20 20 20 23 2d 2d 20 70  ..    .    #-- p
0ee0: 65 72 20 70 72 6f 6a 65 63 74 0a 20 20 20 20 65  er project.    e
0ef0: 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 24 72  lse {.        $r
0f00: 20 3d 20 64 62 28 22 53 45 4c 45 43 54 20 2a 20   = db("SELECT * 
0f10: 46 52 4f 4d 20 72 65 6c 65 61 73 65 5f 76 65 72  FROM release_ver
0f20: 73 69 6f 6e 73 20 57 48 45 52 45 20 6e 61 6d 65  sions WHERE name
0f30: 3d 3f 20 4c 49 4d 49 54 20 31 30 22 2c 20 24 6e  =? LIMIT 10", $n
0f40: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 77 68  ame);.        wh
0f50: 69 6c 65 20 28 20 24 72 6f 77 20 3d 20 24 72 2d  ile ( $row = $r-
0f60: 3e 66 65 74 63 68 28 29 20 29 20 7b 0a 0a 20 20  >fetch() ) {..  
0f70: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 70 72 6f            // pro
0f80: 6a 65 63 74 20 64 65 73 63 72 69 70 74 69 6f 6e  ject description
0f90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 73 73  .            iss
0fa0: 65 74 28 24 66 65 65 64 5b 22 72 65 6c 65 61 73  et($feed["releas
0fb0: 65 73 22 5d 29 20 6f 72 20 24 66 65 65 64 20 2b  es"]) or $feed +
0fc0: 3d 20 66 65 65 64 5f 70 72 6f 6a 65 63 74 28 24  = feed_project($
0fd0: 72 6f 77 29 20 2b 20 61 72 72 61 79 28 22 72 65  row) + array("re
0fe0: 6c 65 61 73 65 73 22 20 3d 3e 20 61 72 72 61 79  leases" => array
0ff0: 28 29 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  ());..          
1000: 20 20 2f 2f 20 76 65 72 73 69 6f 6e 73 0a 20 20    // versions.  
1010: 20 20 20 20 20 20 20 20 20 20 24 66 65 65 64 5b            $feed[
1020: 22 72 65 6c 65 61 73 65 73 22 5d 5b 5d 20 3d 20  "releases"][] = 
1030: 66 65 65 64 5f 72 65 6c 65 61 73 65 28 24 72 6f  feed_release($ro
1040: 77 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  w);.        }.  
1050: 20 20 7d 0a 0a 0a 20 20 20 20 23 2d 2d 20 4f 75    }...    #-- Ou
1060: 74 70 75 74 20 4a 53 4f 4e 0a 20 20 20 20 69 66  tput JSON.    if
1070: 20 28 24 65 78 74 20 3d 3d 20 22 6a 73 6f 6e 22   ($ext == "json"
1080: 29 20 7b 0a 20 20 20 20 20 20 20 20 68 65 61 64  ) {.        head
1090: 65 72 28 22 43 6f 6e 74 65 6e 74 2d 54 79 70 65  er("Content-Type
10a0: 3a 20 6a 73 6f 6e 2f 76 6e 64 2e 66 72 65 73 68  : json/vnd.fresh
10b0: 63 6f 64 65 2e 63 6c 75 62 3b 20 63 68 61 72 73  code.club; chars
10c0: 65 74 3d 55 54 46 2d 38 22 29 3b 0a 20 20 20 20  et=UTF-8");.    
10d0: 20 20 20 20 65 78 69 74 28 6a 73 6f 6e 5f 65 6e      exit(json_en
10e0: 63 6f 64 65 28 24 66 65 65 64 2c 20 4a 53 4f 4e  code($feed, JSON
10f0: 5f 50 52 45 54 54 59 5f 50 52 49 4e 54 7c 4a 53  _PRETTY_PRINT|JS
1100: 4f 4e 5f 55 4e 45 53 43 41 50 45 44 5f 53 4c 41  ON_UNESCAPED_SLA
1110: 53 48 45 53 29 29 3b 0a 20 20 20 20 7d 0a 0a 20  SHES));.    }.. 
1120: 20 20 20 0a 20 20 20 20 23 2d 2d 20 45 6c 73 65     .    #-- Else
1130: 20 63 6f 6e 76 65 72 74 20 69 6e 74 6f 20 52 53   convert into RS
1140: 53 20 6f 72 20 41 74 6f 6d 0a 20 20 20 20 65 6c  S or Atom.    el
1150: 73 65 20 7b 0a 0a 20 20 20 20 20 20 20 20 2f 2a  se {..        /*
1160: 2a 0a 20 20 20 20 20 20 20 20 20 2a 20 49 74 27  *.         * It'
1170: 73 20 6f 62 76 69 6f 75 73 6c 79 20 73 75 70 65  s obviously supe
1180: 72 20 6c 6f 6e 67 2d 77 69 6e 64 65 64 20 74 6f  r long-winded to
1190: 20 72 65 73 74 72 75 63 74 75 72 65 20 74 68 65   restructure the
11a0: 20 4a 53 4f 4e 20 78 66 65 72 0a 20 20 20 20 20   JSON xfer.     
11b0: 20 20 20 20 2a 20 6f 72 20 70 65 72 2d 70 72 6f      * or per-pro
11c0: 6a 65 63 74 20 64 61 74 61 20 69 6e 74 6f 20 52  ject data into R
11d0: 53 53 2f 41 74 6f 6d 20 73 6e 69 70 70 65 74 73  SS/Atom snippets
11e0: 20 68 65 72 65 20 61 66 74 65 72 77 61 72 64 73   here afterwards
11f0: 2e 0a 20 20 20 20 20 20 20 20 20 2a 0a 20 20 20  ..         *.   
1200: 20 20 20 20 20 20 2a 20 40 74 6f 64 6f 3a 20 72        * @todo: r
1210: 65 73 74 72 75 63 74 75 72 65 0a 20 20 20 20 20  estructure.     
1220: 20 20 20 20 2a 0a 20 20 20 20 20 20 20 20 20 2a      *.         *
1230: 2f 0a 0a 20 20 20 20 20 20 20 20 24 66 20 3d 20  /..        $f = 
1240: 6e 65 77 20 46 65 65 64 65 72 28 29 3b 0a 20 20  new Feeder();.  
1250: 20 20 20 20 20 20 24 66 2d 3e 63 68 61 6e 6e 65        $f->channe
1260: 6c 28 29 2d 3e 73 65 74 66 72 6f 6d 61 72 72 61  l()->setfromarra
1270: 79 28 61 72 72 61 79 28 0a 20 20 20 20 20 20 20  y(array(.       
1280: 20 20 20 20 20 22 74 69 74 6c 65 22 20 20 20 20       "title"    
1290: 20 20 20 3d 3e 20 22 24 6e 61 6d 65 22 2c 0a 20     => "$name",. 
12a0: 20 20 20 20 20 20 20 20 20 20 20 22 64 65 73 63             "desc
12b0: 72 69 70 74 69 6f 6e 22 20 3d 3e 20 22 4f 70 65  ription" => "Ope
12c0: 6e 20 53 6f 75 72 63 65 20 70 72 6f 6a 65 63 74  n Source project
12d0: 20 75 70 64 61 74 65 73 22 2c 0a 20 20 20 20 20   updates",.     
12e0: 20 20 20 20 20 20 20 22 61 75 74 68 6f 72 22 20         "author" 
12f0: 20 20 20 20 20 3d 3e 20 22 66 72 65 73 68 63 6f       => "freshco
1300: 64 65 2e 63 6c 75 62 22 2c 0a 20 20 20 20 20 20  de.club",.      
1310: 20 20 20 20 20 20 22 6c 69 63 65 6e 73 65 22 20        "license" 
1320: 20 20 20 20 3d 3e 20 24 66 65 65 64 5b 22 5c 24      => $feed["\$
1330: 66 65 65 64 2d 6c 69 63 65 6e 73 65 22 5d 2c 0a  feed-license"],.
1340: 20 20 20 20 20 20 20 20 20 20 20 20 22 69 63 6f              "ico
1350: 6e 22 20 20 20 20 20 20 20 20 3d 3e 20 22 68 74  n"        => "ht
1360: 74 70 3a 2f 2f 66 72 65 73 68 63 6f 64 65 2e 63  tp://freshcode.c
1370: 6c 75 62 2f 69 6d 67 2f 63 68 61 6e 67 65 73 2e  lub/img/changes.
1380: 70 6e 67 22 2c 0a 20 20 20 20 20 20 20 20 20 20  png",.          
1390: 20 20 22 6c 6f 67 6f 22 20 20 20 20 20 20 20 20    "logo"        
13a0: 3d 3e 20 22 68 74 74 70 3a 2f 2f 66 72 65 73 68  => "http://fresh
13b0: 63 6f 64 65 2e 63 6c 75 62 2f 6c 6f 67 6f 2e 70  code.club/logo.p
13c0: 6e 67 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ng",.           
13d0: 20 22 73 6b 69 70 48 6f 75 72 73 22 20 20 20 3d   "skipHours"   =
13e0: 3e 20 61 72 72 61 79 5f 64 69 66 66 28 72 61 6e  > array_diff(ran
13f0: 67 65 28 30 2c 20 32 33 29 2c 20 5b 30 2c 34 2c  ge(0, 23), [0,4,
1400: 38 2c 31 32 2c 31 36 2c 32 30 5d 29 2c 0a 20 20  8,12,16,20]),.  
1410: 20 20 20 20 20 20 29 29 3b 0a 20 20 20 20 20 20        ));.      
1420: 20 20 0a 20 20 20 20 20 20 20 20 69 66 20 28 21    .        if (!
1430: 65 6d 70 74 79 28 24 66 65 65 64 5b 22 72 65 6c  empty($feed["rel
1440: 65 61 73 65 73 22 5d 29 29 0a 20 20 20 20 20 20  eases"])).      
1450: 20 20 66 6f 72 65 61 63 68 20 28 24 66 65 65 64    foreach ($feed
1460: 5b 22 72 65 6c 65 61 73 65 73 22 5d 20 61 73 20  ["releases"] as 
1470: 24 69 3d 3e 24 72 6f 77 29 20 7b 0a 20 20 20 20  $i=>$row) {.    
1480: 20 20 20 20 20 20 20 20 24 66 2d 3e 65 6e 74 72          $f->entr
1490: 79 28 24 69 2c 20 6e 65 77 20 46 65 65 64 45 6e  y($i, new FeedEn
14a0: 74 72 79 28 40 61 72 72 61 79 28 0a 20 20 20 20  try(@array(.    
14b0: 20 20 20 20 20 20 20 20 20 20 20 20 22 74 69 74              "tit
14c0: 6c 65 22 20 20 20 3d 3e 20 28 24 72 6f 77 5b 22  le"   => ($row["
14d0: 74 69 74 6c 65 22 5d 20 3f 3a 20 24 66 65 65 64  title"] ?: $feed
14e0: 5b 22 74 69 74 6c 65 22 5d 29 20 2e 20 22 20 24  ["title"]) . " $
14f0: 72 6f 77 5b 76 65 72 73 69 6f 6e 5d 22 2c 0a 20  row[version]",. 
1500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
1510: 70 75 62 6c 69 73 68 65 64 22 20 3d 3e 20 24 72  published" => $r
1520: 6f 77 5b 22 70 75 62 6c 69 73 68 65 64 22 5d 2c  ow["published"],
1530: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1540: 20 22 61 75 74 68 6f 72 22 20 20 3d 3e 20 24 72   "author"  => $r
1550: 6f 77 5b 22 73 75 62 6d 69 74 74 65 72 22 5d 20  ow["submitter"] 
1560: 3f 3a 20 24 66 65 65 64 5b 22 73 75 62 6d 69 74  ?: $feed["submit
1570: 74 65 72 22 5d 2c 0a 20 20 20 20 20 20 20 20 20  ter"],.         
1580: 20 20 20 20 20 20 20 22 63 6f 6e 74 65 6e 74 22         "content"
1590: 20 3d 3e 20 73 75 62 73 74 72 28 24 72 6f 77 5b   => substr($row[
15a0: 22 64 65 73 63 72 69 70 74 69 6f 6e 22 5d 2c 20  "description"], 
15b0: 30 2c 20 32 30 30 29 20 2e 20 22 e2 80 a6 5c 6e  0, 200) . "...\n
15c0: e2 80 93 20 43 68 61 6e 67 65 73 3a 20 22 20 2e  ... Changes: " .
15d0: 20 73 75 62 73 74 72 28 24 72 6f 77 5b 22 63 68   substr($row["ch
15e0: 61 6e 67 65 73 22 5d 2c 20 30 2c 20 33 30 30 29  anges"], 0, 300)
15f0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1600: 20 20 22 70 65 72 6d 61 6c 69 6e 6b 22 20 3d 3e    "permalink" =>
1610: 20 24 72 6f 77 5b 22 68 6f 6d 65 70 61 67 65 22   $row["homepage"
1620: 5d 20 3f 3a 20 24 66 65 65 64 5b 22 68 6f 6d 65  ] ?: $feed["home
1630: 70 61 67 65 22 5d 2c 0a 20 20 20 20 20 20 20 20  page"],.        
1640: 20 20 20 20 29 29 29 3b 0a 20 20 20 20 20 20 20      )));.       
1650: 20 7d 0a 0a 20 20 20 20 20 20 20 20 23 2d 2d 20   }..        #-- 
1660: 4f 75 74 70 75 74 0a 20 20 20 20 20 20 20 20 68  Output.        h
1670: 65 61 64 65 72 28 73 70 72 69 6e 74 66 28 22 43  eader(sprintf("C
1680: 61 63 68 65 2d 43 6f 6e 74 72 6f 6c 3a 20 6d 61  ache-Control: ma
1690: 78 2d 61 67 65 3d 25 73 22 2c 20 33 20 2a 20 39  x-age=%s", 3 * 9
16a0: 30 30 30 30 29 29 3b 0a 20 20 20 20 20 20 20 20  0000));.        
16b0: 68 65 61 64 65 72 28 73 70 72 69 6e 74 66 28 22  header(sprintf("
16c0: 45 78 70 69 72 65 73 3a 20 25 73 22 2c 20 67 6d  Expires: %s", gm
16d0: 64 61 74 65 28 44 41 54 45 5f 43 4f 4f 4b 49 45  date(DATE_COOKIE
16e0: 2c 20 74 69 6d 65 28 29 20 2b 20 33 20 2a 20 39  , time() + 3 * 9
16f0: 30 30 30 30 29 29 29 3b 0a 20 20 20 20 20 20 20  0000)));.       
1700: 20 24 6f 20 3d 20 28 24 65 78 74 20 3d 3d 20 22   $o = ($ext == "
1710: 61 74 6f 6d 22 29 20 3f 20 6e 65 77 20 41 74 6f  atom") ? new Ato
1720: 6d 46 65 65 64 28 29 20 3a 20 6e 65 77 20 52 73  mFeed() : new Rs
1730: 73 32 30 46 65 65 64 28 29 3b 0a 20 20 20 20 20  s20Feed();.     
1740: 20 20 20 24 6f 2d 3e 6f 75 74 70 75 74 28 24 66     $o->output($f
1750: 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0a 0a 23 2d 2d  );.    }.}...#--
1760: 20 65 6c 73 65 20 70 72 69 6e 74 20 61 6e 20 69   else print an i
1770: 6e 66 6f 20 70 61 67 65 0a 65 6c 73 65 20 7b 0a  nfo page.else {.
1780: 20 20 20 20 69 6e 63 6c 75 64 65 28 22 74 65 6d      include("tem
1790: 70 6c 61 74 65 2f 68 65 61 64 65 72 2e 70 68 70  plate/header.php
17a0: 22 29 3b 0a 20 20 20 20 3f 3e 0a 20 20 20 20 3c  ");.    ?>.    <
17b0: 73 65 63 74 69 6f 6e 20 69 64 3d 6d 61 69 6e 20  section id=main 
17c0: 63 6c 61 73 73 3d 63 6f 6e 74 61 69 6e 65 72 2d  class=container-
17d0: 77 69 64 74 68 3e 0a 20 20 20 20 20 20 20 3c 68  width>.       <h
17e0: 34 3e 46 65 65 64 73 3c 2f 68 34 3e 0a 20 20 20  4>Feeds</h4>.   
17f0: 20 20 20 20 3c 70 3e 0a 20 20 20 20 20 20 20 20      <p>.        
1800: 20 20 59 6f 75 20 63 61 6e 20 67 65 74 20 61 6e    You can get an
1810: 79 20 70 72 6f 6a 65 63 74 73 20 3c 62 3e 72 65  y projects <b>re
1820: 6c 65 61 73 65 73 2e 6a 73 6f 6e 3c 2f 62 3e 20  leases.json</b> 
1830: 66 65 65 64 20 75 73 69 6e 67 0a 20 20 20 20 20  feed using.     
1840: 20 20 20 20 20 3c 75 6c 3e 0a 20 20 20 20 20 20       <ul>.      
1850: 20 20 20 20 20 20 20 3c 6c 69 3e 20 3c 74 74 3e         <li> <tt>
1860: 68 74 74 70 3a 2f 2f 66 72 65 73 68 63 6f 64 65  http://freshcode
1870: 2e 63 6c 75 62 2f 66 65 65 64 2f 3c 65 6d 3e 70  .club/feed/<em>p
1880: 72 6f 6a 65 63 74 6e 61 6d 65 3c 2f 65 6d 3e 3c  rojectname</em><
1890: 76 61 72 20 73 74 79 6c 65 3d 22 63 6f 6c 6f 72  var style="color
18a0: 3a 20 23 63 63 63 22 3e 2e 6a 73 6f 6e 3c 2f 76  : #ccc">.json</v
18b0: 61 72 3e 3c 2f 74 74 3e 0a 20 20 20 20 20 20 20  ar></tt>.       
18c0: 20 20 20 3c 2f 75 6c 3e 0a 20 20 20 20 20 20 20     </ul>.       
18d0: 20 20 20 41 6c 74 65 72 6e 61 74 69 76 65 6c 79     Alternatively
18e0: 20 61 73 20 52 53 53 2f 41 74 6f 6d 20 66 65 65   as RSS/Atom fee
18f0: 64 0a 20 20 20 20 20 20 20 20 20 20 3c 75 6c 3e  d.          <ul>
1900: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 3c 6c  .             <l
1910: 69 3e 20 3c 74 74 3e 68 74 74 70 3a 2f 2f 66 72  i> <tt>http://fr
1920: 65 73 68 63 6f 64 65 2e 63 6c 75 62 2f 66 65 65  eshcode.club/fee
1930: 64 2f 3c 65 6d 3e 70 72 6f 6a 65 63 74 6e 61 6d  d/<em>projectnam
1940: 65 3c 2f 65 6d 3e 2e 72 73 73 3c 2f 74 74 3e 0a  e</em>.rss</tt>.
1950: 20 20 20 20 20 20 20 20 20 20 20 20 20 3c 6c 69               <li
1960: 3e 20 3c 74 74 3e 68 74 74 70 3a 2f 2f 66 72 65  > <tt>http://fre
1970: 73 68 63 6f 64 65 2e 63 6c 75 62 2f 66 65 65 64  shcode.club/feed
1980: 2f 3c 65 6d 3e 70 72 6f 6a 65 63 74 6e 61 6d 65  /<em>projectname
1990: 3c 2f 65 6d 3e 2e 61 74 6f 6d 3c 2f 74 74 3e 0a  </em>.atom</tt>.
19a0: 20 20 20 20 20 20 20 20 20 20 3c 2f 75 6c 3e 0a            </ul>.
19b0: 20 20 20 20 20 20 20 3c 2f 70 3e 0a 20 20 20 20         </p>.    
19c0: 20 20 20 3c 70 3e 0a 20 20 20 20 20 20 20 20 20     <p>.         
19d0: 20 54 6f 20 67 65 74 20 61 6c 6c 20 70 72 6f 6a   To get all proj
19e0: 65 63 74 20 75 70 64 61 74 65 73 20 69 6e 73 74  ect updates inst
19f0: 65 61 64 20 75 73 65 0a 20 20 20 20 20 20 20 20  ead use.        
1a00: 20 20 3c 75 6c 3e 0a 20 20 20 20 20 20 20 20 20    <ul>.         
1a10: 20 20 20 20 3c 6c 69 3e 20 3c 74 74 3e 68 74 74      <li> <tt>htt
1a20: 70 3a 2f 2f 66 72 65 73 68 63 6f 64 65 2e 63 6c  p://freshcode.cl
1a30: 75 62 2f 66 65 65 64 2f 3c 62 3e 78 66 65 72 3c  ub/feed/<b>xfer<
1a40: 2f 62 3e 3c 76 61 72 20 73 74 79 6c 65 3d 22 63  /b><var style="c
1a50: 6f 6c 6f 72 3a 20 23 63 63 63 22 3e 2e 6a 73 6f  olor: #ccc">.jso
1a60: 6e 3c 2f 76 61 72 3e 3c 2f 74 74 3e 0a 20 20 20  n</var></tt>.   
1a70: 20 20 20 20 20 20 20 20 20 20 3c 6c 69 3e 20 3c            <li> <
1a80: 74 74 3e 68 74 74 70 3a 2f 2f 66 72 65 73 68 63  tt>http://freshc
1a90: 6f 64 65 2e 63 6c 75 62 2f 70 72 6f 6a 65 63 74  ode.club/project
1aa0: 73 2e 72 73 73 3c 2f 74 74 3e 20 6f 72 20 3c 74  s.rss</tt> or <t
1ab0: 74 3e 2f 3f 66 6f 72 6d 61 74 3d 72 73 73 3c 2f  t>/?format=rss</
1ac0: 74 74 3e 0a 20 20 20 20 20 20 20 20 20 20 20 20  tt>.            
1ad0: 20 3c 6c 69 3e 20 3c 74 74 3e 68 74 74 70 3a 2f   <li> <tt>http:/
1ae0: 2f 66 72 65 73 68 63 6f 64 65 2e 63 6c 75 62 2f  /freshcode.club/
1af0: 70 72 6f 6a 65 63 74 73 2e 61 74 6f 6d 3c 2f 74  projects.atom</t
1b00: 74 3e 20 6f 72 20 3c 74 74 3e 2f 3f 66 6f 72 6d  t> or <tt>/?form
1b10: 61 74 3d 61 74 6f 6d 3c 2f 74 74 3e 0a 20 20 20  at=atom</tt>.   
1b20: 20 20 20 20 20 20 20 3c 2f 75 6c 3e 0a 20 20 20         </ul>.   
1b30: 20 20 20 20 3c 2f 70 3e 0a 20 20 20 20 20 20 20      </p>.       
1b40: 3c 70 3e 0a 20 20 20 20 20 20 20 20 20 20 4a 53  <p>.          JS
1b50: 4f 4e 20 66 65 65 64 73 20 61 72 65 20 75 73 69  ON feeds are usi
1b60: 6e 67 20 61 20 70 6f 73 74 2d 31 2e 30 20 4d 49  ng a post-1.0 MI
1b70: 4d 45 20 74 79 70 65 20 6f 66 20 3c 65 6d 3e 6a  ME type of <em>j
1b80: 73 6f 6e 2f 76 6e 64 2e 66 72 65 73 68 63 6f 64  son/vnd.freshcod
1b90: 65 2e 63 6c 75 62 3c 2f 65 6d 3e 20 66 6f 72 20  e.club</em> for 
1ba0: 6e 6f 77 2e 0a 20 20 20 20 20 20 20 3c 2f 70 3e  now..       </p>
1bb0: 0a 20 20 20 20 3c 2f 73 65 63 74 69 6f 6e 3e 0a  .    </section>.
1bc0: 20 20 20 20 3c 3f 70 68 70 0a 20 20 20 20 69 6e      <?php.    in
1bd0: 63 6c 75 64 65 28 22 74 65 6d 70 6c 61 74 65 2f  clude("template/
1be0: 62 6f 74 74 6f 6d 2e 70 68 70 22 29 3b 0a 7d 0a  bottom.php");.}.
1bf0: 0a                                               .