⌈⌋ branch:  freshcode


Hex Artifact Content

Artifact b6ddd8d5a8c53fe080ff80fa0c6a4dc5c93e9917:

Wiki page [AutoupdateRegex] by mario 2014-10-12 04:25:19.
0000: 44 20 32 30 31 34 2d 31 30 2d 31 32 54 30 34 3a  D 2014-10-12T04:
0010: 32 35 3a 31 39 2e 36 32 35 0a 4c 20 41 75 74 6f  25:19.625.L Auto
0020: 75 70 64 61 74 65 52 65 67 65 78 0a 4e 20 74 65  updateRegex.N te
0030: 78 74 2f 78 2d 6d 61 72 6b 64 6f 77 6e 0a 50 20  xt/x-markdown.P 
0040: 63 32 34 62 62 63 31 62 30 38 64 38 36 65 32 36  c24bbc1b08d86e26
0050: 39 35 39 62 37 30 66 63 36 61 33 61 39 34 31 33  959b70fc6a3a9413
0060: 63 65 65 39 63 64 35 64 0a 55 20 6d 61 72 69 6f  cee9cd5d.U mario
0070: 0a 57 20 35 34 39 35 0a 3c 69 6d 67 20 73 72 63  .W 5495.<img src
0080: 3d 22 68 74 74 70 3a 2f 2f 66 72 65 73 68 63 6f  ="http://freshco
0090: 64 65 2e 63 6c 75 62 2f 69 6d 67 2f 64 72 63 68  de.club/img/drch
00a0: 61 6e 67 65 6c 6f 67 2e 70 6e 67 22 20 61 6c 69  angelog.png" ali
00b0: 67 6e 3d 72 69 67 68 74 20 68 65 69 67 68 74 3d  gn=right height=
00c0: 31 35 30 20 77 69 64 74 68 3d 31 35 30 20 61 6c  150 width=150 al
00d0: 74 3d 62 69 72 64 79 3e 0d 0a 54 68 65 20 5b 41  t=birdy>..The [A
00e0: 75 74 6f 75 70 64 61 74 65 5d 28 77 69 6b 69 2f  utoupdate](wiki/
00f0: 41 75 74 6f 75 70 64 61 74 65 29 20 22 72 65 67  Autoupdate) "reg
0100: 65 78 22 20 6d 6f 64 75 6c 65 20 69 73 20 74 68  ex" module is th
0110: 65 20 6d 6f 73 74 20 76 65 72 73 61 74 69 6c 65  e most versatile
0120: 20 66 6f 72 20 63 6f 6c 6c 65 63 74 69 6e 67 20   for collecting 
0130: 72 65 6c 65 61 73 65 20 69 6e 66 6f 73 20 66 72  release infos fr
0140: 6f 6d 20 70 72 6f 6a 65 63 74 20 70 61 67 65 73  om project pages
0150: 2e 20 20 42 65 73 69 64 65 73 20 2a 2a 52 65 67  .  Besides **Reg
0160: 45 78 70 2a 2a 20 6d 61 74 63 68 69 6e 67 20 28  Exp** matching (
0170: 66 6f 72 20 74 65 78 74 20 73 6f 75 72 63 65 73  for text sources
0180: 29 2c 20 69 74 20 61 6c 73 6f 20 73 75 70 70 6f  ), it also suppo
0190: 72 74 73 20 2a 2a 58 50 61 74 68 2a 2a 20 61 6e  rts **XPath** an
01a0: 64 20 2a 2a 6a 51 75 65 72 79 2a 2a 2d 73 74 79  d **jQuery**-sty
01b0: 6c 65 20 73 65 6c 65 63 74 69 6f 6e 73 20 6e 6f  le selections no
01c0: 77 2c 20 77 68 69 63 68 20 65 61 73 65 20 48 54  w, which ease HT
01d0: 4d 4c 20 70 72 6f 6a 65 63 74 20 77 65 62 73 69  ML project websi
01e0: 74 65 20 73 63 72 61 70 69 6e 67 2e 0d 0a 0d 0a  te scraping.....
01f0: 53 65 65 20 61 6c 73 6f 20 3c 61 20 68 72 65 66  See also <a href
0200: 3d 22 68 74 74 70 3a 2f 2f 66 72 65 73 68 63 6f  ="http://freshco
0210: 64 65 2e 63 6c 75 62 2f 64 72 63 68 61 6e 67 65  de.club/drchange
0220: 6c 6f 67 22 3e 44 72 2e 20 43 68 61 6e 67 65 6c  log">Dr. Changel
0230: 6f 67 3c 2f 61 3e 20 66 6f 72 20 74 72 79 69 6e  og</a> for tryin
0240: 67 20 69 74 20 6f 75 74 2e 0d 0a 0d 0a 23 23 23  g it out.....###
0250: 20 46 69 65 6c 64 20 52 75 6c 65 73 0d 0a 0d 0a   Field Rules....
0260: 49 74 20 63 61 6e 20 62 65 20 63 6f 6e 66 69 67  It can be config
0270: 75 72 65 64 20 69 6e 20 74 68 65 20 2a 41 75 74  ured in the *Aut
0280: 6f 75 70 64 61 74 65 20 52 75 6c 65 73 2f 52 65  oupdate Rules/Re
0290: 67 65 78 2a 20 70 72 6f 6a 65 63 74 20 66 69 65  gex* project fie
02a0: 6c 64 2c 20 77 68 65 72 65 20 69 74 20 65 78 70  ld, where it exp
02b0: 65 63 74 73 20 61 20 6c 69 73 74 20 6f 66 20 60  ects a list of `
02c0: 6b 65 79 20 3d 20 2e 2e 2e 60 20 65 6e 74 72 69  key = ...` entri
02d0: 65 73 2e 20 45 61 63 68 20 6b 65 79 20 63 61 6e  es. Each key can
02e0: 20 6c 69 73 74 20 61 6e 20 55 52 4c 2c 20 6f 6e   list an URL, on
02f0: 65 20 6f 72 20 6d 6f 72 65 20 52 65 67 45 78 70  e or more RegExp
0300: 2c 20 58 50 61 74 68 20 6f 72 20 6a 51 75 65 72  , XPath or jQuer
0310: 79 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 0d 0a  y expressions...
0320: 0d 0a 20 20 20 20 76 65 72 73 69 6f 6e 20 3d 20  ..    version = 
0330: 68 74 74 70 3a 2f 2f 65 78 61 6d 70 6c 65 2e 63  http://example.c
0340: 6f 6d 2f 64 6f 77 6e 6c 6f 61 64 2e 68 74 6d 6c  om/download.html
0350: 0d 0a 20 20 20 20 76 65 72 73 69 6f 6e 20 3d 20  ..    version = 
0360: 2f 28 5c 64 2b 5c 2e 5c 64 2b 28 5c 2e 5c 64 2b  /(\d+\.\d+(\.\d+
0370: 29 2b 29 2f 0d 0a 0d 0a 20 20 20 20 63 68 61 6e  )+)/....    chan
0380: 67 65 73 20 3d 20 68 74 74 70 3a 2f 2f 65 78 61  ges = http://exa
0390: 6d 70 6c 65 2e 63 6f 6d 2f 6e 65 77 73 2e 68 74  mple.com/news.ht
03a0: 6d 6c 0d 0a 20 20 20 20 63 68 61 6e 67 65 73 20  ml..    changes 
03b0: 3d 20 24 28 22 23 6d 61 69 6e 20 2e 72 65 6c 65  = $("#main .rele
03c0: 61 73 65 20 64 69 76 2e 63 75 72 72 65 6e 74 22  ase div.current"
03d0: 29 0d 0a 20 20 20 20 63 68 61 6e 67 65 73 20 3d  )..    changes =
03e0: 20 2f 53 75 6d 6d 61 72 79 3a 5c 73 2a 28 2e 2b   /Summary:\s*(.+
03f0: 3f 29 5c 52 5c 52 2f 73 6d 69 78 0d 0a 0d 0a 20  ?)\R\R/smix.... 
0400: 20 20 20 73 63 6f 70 65 20 3d 20 7e 28 28 6d 69     scope = ~((mi
0410: 6e 6f 72 7c 6d 61 6a 6f 72 29 20 28 62 75 67 66  nor|major) (bugf
0420: 69 78 7c 63 6c 65 61 6e 75 70 7c 73 65 63 75 72  ix|cleanup|secur
0430: 69 74 79 29 29 7e 0d 0a 20 20 20 20 73 74 61 74  ity))~..    stat
0440: 65 20 3d 20 7e 28 73 74 61 62 6c 65 7c 62 65 74  e = ~(stable|bet
0450: 61 7c 70 72 65 72 65 6c 65 61 73 65 29 7e 69 0d  a|prerelease)~i.
0460: 0a 20 20 20 20 64 6f 77 6e 6c 6f 61 64 20 3d 20  .    download = 
0470: 24 28 22 61 2e 64 6f 77 6e 6c 6f 61 64 22 29 2e  $("a.download").
0480: 61 74 74 72 28 22 68 72 65 66 22 29 0d 0a 0d 0a  attr("href")....
0490: 49 74 20 77 69 6c 6c 20 6e 6f 74 20 75 70 64 61  It will not upda
04a0: 74 65 20 67 65 6e 65 72 61 6c 20 70 72 6f 6a 65  te general proje
04b0: 63 74 20 64 65 73 63 72 69 70 74 69 6f 6e 73 2c  ct descriptions,
04c0: 20 62 75 74 20 6f 6e 6c 79 20 60 76 65 72 73 69   but only `versi
04d0: 6f 6e 3d 60 20 61 6e 64 20 60 63 68 61 6e 67 65  on=` and `change
04e0: 73 3d 60 20 6f 72 20 6f 70 74 69 6f 6e 61 6c 6c  s=` or optionall
04f0: 79 20 60 73 63 6f 70 65 3d 60 2c 20 60 73 74 61  y `scope=`, `sta
0500: 74 65 3d 60 20 61 6e 64 20 60 64 6f 77 6e 6c 6f  te=` and `downlo
0510: 61 64 3d 60 2e 0d 0a 0d 0a 20 20 2a 20 20 55 52  ad=`.....  *  UR
0520: 4c 73 20 73 68 6f 75 6c 64 20 70 72 65 63 65 65  Ls should precee
0530: 64 20 74 68 65 20 65 78 74 72 61 63 74 69 6f 6e  d the extraction
0540: 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 0d 0a 20   expressions... 
0550: 20 2a 20 20 46 6f 72 20 72 65 67 65 78 20 72 75   *  For regex ru
0560: 6c 65 73 20 74 68 65 20 66 69 72 73 74 20 63 61  les the first ca
0570: 70 74 75 72 65 20 67 72 6f 75 70 20 60 28 2e 2e  pture group `(..
0580: 29 60 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20  )` will be used 
0590: 61 73 20 72 65 73 75 6c 74 2e 0d 0a 20 20 2a 20  as result...  * 
05a0: 20 41 6c 6c 20 72 65 67 65 78 20 66 6c 61 67 73   All regex flags
05b0: 20 60 2f 55 6d 69 78 75 73 60 20 61 72 65 20 61   `/Umixus` are a
05c0: 6c 6c 6f 77 65 64 2c 20 61 6e 64 20 61 20 73 70  llowed, and a sp
05d0: 65 63 69 61 6c 20 60 2f 2a 60 20 6d 61 74 63 68  ecial `/*` match
05e0: 2d 61 6c 6c 20 66 6c 61 67 20 69 73 20 70 72 6f  -all flag is pro
05f0: 76 69 64 65 64 2e 0d 0a 20 20 2a 20 20 55 73 65  vided...  *  Use
0600: 20 6c 69 6e 65 20 62 72 65 61 6b 73 20 74 6f 20   line breaks to 
0610: 73 65 70 61 72 61 74 65 20 72 75 6c 65 20 61 73  separate rule as
0620: 73 69 67 6e 6d 65 6e 74 73 2e 20 43 6f 6d 6d 65  signments. Comme
0630: 6e 74 73 20 69 6e 20 62 65 74 77 65 65 6e 20 77  nts in between w
0640: 69 6c 6c 20 65 66 66 65 63 74 69 76 65 6c 79 20  ill effectively 
0650: 62 65 20 69 67 6e 6f 72 65 64 2e 0d 0a 20 20 2a  be ignored...  *
0660: 20 20 58 70 61 74 68 20 65 78 70 72 65 73 73 69    Xpath expressi
0670: 6f 6e 73 20 66 6f 72 20 65 78 61 6d 70 6c 65 20  ons for example 
0680: 74 61 6b 65 20 74 68 65 20 66 6f 72 6d 20 60 63  take the form `c
0690: 68 61 6e 67 65 73 20 3d 20 28 2f 2f 75 6c 29 5b  hanges = (//ul)[
06a0: 31 5d 2f 6c 69 60 0d 0a 20 20 2a 20 20 6a 51 75  1]/li`..  *  jQu
06b0: 65 72 79 2d 73 74 79 6c 65 20 73 65 6c 65 63 74  ery-style select
06c0: 6f 72 73 20 63 61 6e 20 63 68 61 69 6e 20 60 24  ors can chain `$
06d0: 28 22 64 69 76 22 29 2e 66 69 6e 64 28 22 23 66  ("div").find("#f
06e0: 69 72 73 74 22 29 60 20 6d 75 6c 74 69 70 6c 65  irst")` multiple
06f0: 20 73 65 6c 65 63 74 6f 72 20 66 75 6e 63 74 69   selector functi
0700: 6f 6e 73 2e 0d 0a 20 20 2a 20 20 46 69 65 6c 64  ons...  *  Field
0710: 2f 6b 65 79 20 6e 61 6d 65 73 20 6d 61 79 20 62  /key names may b
0720: 65 20 70 72 65 66 69 78 65 64 20 77 69 74 68 20  e prefixed with 
0730: 60 24 60 20 6f 72 20 60 25 60 20 61 73 20 69 6e  `$` or `%` as in
0740: 20 60 24 76 65 72 73 69 6f 6e 20 3d 20 2f 28 5b   `$version = /([
0750: 5c 64 2e 5d 2b 29 2f 60 2e 0d 0a 0d 0a 23 23 23  \d.]+)/`.....###
0760: 20 55 52 4c 20 73 6f 75 72 63 65 73 0d 0a 0d 0a   URL sources....
0770: 49 6e 69 74 69 61 6c 6c 79 20 74 68 65 20 70 72  Initially the pr
0780: 69 6d 61 72 79 20 2a 41 75 74 6f 75 70 64 61 74  imary *Autoupdat
0790: 65 20 55 52 4c 2a 20 69 73 20 75 73 65 64 20 61  e URL* is used a
07a0: 73 20 73 6f 75 72 63 65 20 66 6f 72 20 65 78 74  s source for ext
07b0: 72 61 63 74 69 6f 6e 2e 20 49 74 27 73 20 65 71  raction. It's eq
07c0: 75 69 76 61 6c 65 6e 74 20 74 6f 20 6c 69 73 74  uivalent to list
07d0: 69 6e 67 20 61 6e 20 55 52 4c 20 66 6f 72 20 60  ing an URL for `
07e0: 76 65 72 73 69 6f 6e 20 3d 60 2e 20 45 61 63 68  version =`. Each
07f0: 20 73 75 62 73 65 71 75 65 6e 74 20 66 69 65 6c   subsequent fiel
0800: 64 20 65 78 74 72 61 63 74 69 6f 6e 20 77 69 6c  d extraction wil
0810: 6c 20 72 65 75 73 65 20 74 68 65 20 6c 61 73 74  l reuse the last
0820: 6c 79 20 72 65 74 72 69 65 76 65 64 20 70 61 67  ly retrieved pag
0830: 65 2e 20 4c 69 6b 65 2d 6e 61 6d 65 64 20 55 52  e. Like-named UR
0840: 4c 20 65 6e 74 72 69 65 73 20 69 6e 20 2a 5b 4f  L entries in *[O
0850: 74 68 65 72 20 55 52 4c 73 5d 28 77 69 6b 69 2f  ther URLs](wiki/
0860: 4f 74 68 65 72 2b 55 52 4c 73 29 2a 20 77 69 6c  Other+URLs)* wil
0870: 6c 20 61 6c 73 6f 20 62 65 20 72 65 63 6f 67 6e  l also be recogn
0880: 69 7a 65 64 2e 20 0d 0a 0d 0a 0d 0a 23 23 23 20  ized. ......### 
0890: 52 65 67 65 78 20 6d 75 6c 74 69 2d 6d 61 74 63  Regex multi-matc
08a0: 68 20 2f 2a 20 66 6c 61 67 0d 0a 0d 0a 54 68 65  h /* flag....The
08b0: 72 65 27 73 20 61 20 73 70 65 63 69 61 6c 20 72  re's a special r
08c0: 65 67 65 78 20 66 6c 61 67 20 60 2f 2a 60 20 66  egex flag `/*` f
08d0: 6f 72 20 61 20 60 70 72 65 67 5f 6d 61 74 63 68  or a `preg_match
08e0: 5f 61 6c 6c 60 20 6d 6f 64 65 2e 20 49 74 27 73  _all` mode. It's
08f0: 20 75 73 65 64 20 62 79 20 74 68 65 20 6c 69 73   used by the lis
0900: 74 69 6e 67 20 66 6f 72 20 74 68 65 20 4c 69 6e  ting for the Lin
0910: 75 78 20 6b 65 72 6e 65 6c 20 28 77 68 69 63 68  ux kernel (which
0920: 20 69 73 20 61 20 67 69 74 20 6c 6f 67 29 20 66   is a git log) f
0930: 6f 72 20 69 6e 73 74 61 6e 63 65 3a 0d 0a 0d 0a  or instance:....
0940: 20 20 20 20 63 68 61 6e 67 65 73 20 3d 20 2f 5e      changes = /^
0950: 44 61 74 65 3a 2e 2b 5c 52 5c 52 5c 73 2b 28 2e  Date:.+\R\R\s+(.
0960: 2b 29 5c 73 2b 5b 20 5d 63 6f 6d 6d 69 74 2f 6d  +)\s+[ ]commit/m
0970: 2a 0d 0a 0d 0a 48 65 72 65 20 6d 75 6c 74 69 70  *....Here multip
0980: 6c 65 20 6f 63 63 75 72 65 6e 63 65 73 20 77 69  le occurences wi
0990: 6c 6c 20 62 65 20 66 6f 75 6e 64 2c 20 61 6e 64  ll be found, and
09a0: 20 6d 65 72 67 65 64 20 69 6e 74 6f 20 61 20 63   merged into a c
09b0: 68 61 6e 67 65 6c 6f 67 20 6c 69 73 74 2e 20 28  hangelog list. (
09c0: 53 6f 20 69 74 27 73 20 73 6f 6d 65 77 68 61 74  So it's somewhat
09d0: 20 6c 69 6b 65 20 74 68 65 20 60 2f 67 60 20 66   like the `/g` f
09e0: 6c 61 67 20 69 6e 20 4a 61 76 61 53 63 72 69 70  lag in JavaScrip
09f0: 74 2e 29 0d 0a 0d 0a 0d 0a 0d 0a 23 23 23 20 53  t.)........### S
0a00: 6c 69 63 69 6e 67 0d 0a 0d 0a 4f 66 74 65 6e 74  licing....Oftent
0a10: 69 6d 65 73 20 69 74 27 73 20 73 69 6d 70 6c 65  imes it's simple
0a20: 72 20 74 6f 20 6a 75 73 74 20 6e 61 72 72 6f 77  r to just narrow
0a30: 20 64 6f 77 6e 20 74 68 65 20 65 78 74 72 61 63   down the extrac
0a40: 74 69 6f 6e 20 61 72 65 61 20 68 6f 77 65 76 65  tion area howeve
0a50: 72 2e 20 54 68 65 72 65 66 6f 72 65 20 72 65 70  r. Therefore rep
0a60: 65 61 74 69 6e 67 20 60 6b 65 79 3d 2f 72 65 67  eating `key=/reg
0a70: 65 78 2f 60 20 73 70 65 63 69 66 69 65 72 73 20  ex/` specifiers 
0a80: 6f 66 74 65 6e 20 69 73 20 75 73 65 66 75 6c 3a  often is useful:
0a90: 0d 0a 0d 0a 20 20 20 20 63 68 61 6e 67 65 73 20  ....    changes 
0aa0: 3d 20 2f 43 68 61 6e 67 65 6c 6f 67 28 2e 2b 3f  = /Changelog(.+?
0ab0: 29 5c 5a 2f 73 0d 0a 20 20 20 20 63 68 61 6e 67  )\Z/s..    chang
0ac0: 65 73 20 3d 20 2f 28 2e 2b 29 2d 2d 2d 2f 0d 0a  es = /(.+)---/..
0ad0: 0d 0a 49 74 27 73 20 73 6f 6d 65 74 69 6d 65 73  ..It's sometimes
0ae0: 20 73 65 6e 73 69 62 6c 65 20 74 6f 20 6d 69 78   sensible to mix
0af0: 20 58 50 61 74 68 2f 6a 51 75 65 72 79 20 65 78   XPath/jQuery ex
0b00: 74 72 61 63 74 69 6f 6e 73 20 66 69 72 73 74 20  tractions first 
0b10: 61 6e 64 20 61 20 72 65 67 65 78 20 74 68 65 72  and a regex ther
0b20: 65 61 66 74 65 72 20 74 6f 20 63 75 74 20 6f 75  eafter to cut ou
0b30: 74 20 74 68 65 20 61 63 74 75 61 6c 20 72 65 73  t the actual res
0b40: 75 6c 74 3a 0d 0a 0d 0a 20 20 20 20 76 65 72 73  ult:....    vers
0b50: 69 6f 6e 20 3d 20 24 28 22 61 72 74 69 63 6c 65  ion = $("article
0b60: 20 68 34 22 29 0d 0a 20 20 20 20 76 65 72 73 69   h4")..    versi
0b70: 6f 6e 20 3d 20 7e 56 65 72 73 69 6f 6e 20 28 5b  on = ~Version ([
0b80: 5c 64 2e 5d 2b 29 7e 0d 0a 0d 0a 4d 61 74 63 68  \d.]+)~....Match
0b90: 69 6e 67 20 72 75 6c 65 73 20 74 68 75 73 20 69  ing rules thus i
0ba0: 74 65 72 61 74 69 76 65 6c 79 20 69 73 6f 6c 61  teratively isola
0bb0: 74 65 20 74 68 65 20 66 69 65 6c 64 20 74 6f 20  te the field to 
0bc0: 62 65 20 70 6f 70 75 6c 61 74 65 64 2e 0d 0a 0d  be populated....
0bd0: 0a 0d 0a 23 23 23 20 6a 51 75 65 72 79 2d 73 74  ...### jQuery-st
0be0: 79 6c 65 20 73 65 6c 65 63 74 6f 72 20 63 68 61  yle selector cha
0bf0: 69 6e 69 6e 67 0d 0a 0d 0a 4f 66 74 65 6e 20 69  ining....Often i
0c00: 74 20 73 75 66 66 69 63 65 73 20 74 6f 20 63 61  t suffices to ca
0c10: 6c 6c 20 74 68 65 20 6d 61 69 6e 20 60 24 28 29  ll the main `$()
0c20: 60 20 43 53 53 20 73 65 6c 65 63 74 6f 72 20 66  ` CSS selector f
0c30: 75 6e 63 74 69 6f 6e 2e 20 41 6e 64 20 6f 6e 65  unction. And one
0c40: 20 63 6f 75 6c 64 20 61 67 61 69 6e 20 75 73 65   could again use
0c50: 20 6d 75 6c 74 69 70 6c 65 20 73 6c 69 63 69 6e   multiple slicin
0c60: 67 20 72 75 6c 65 73 2c 20 62 75 74 20 6d 61 6e  g rules, but man
0c70: 79 20 6a 51 75 65 72 79 2d 73 74 79 6c 65 20 73  y jQuery-style s
0c80: 75 62 66 75 6e 63 74 69 6f 6e 73 20 63 61 6e 20  ubfunctions can 
0c90: 62 65 20 63 68 61 69 6e 65 64 20 69 6e 20 6f 6e  be chained in on
0ca0: 65 20 6c 69 6e 65 3a 0d 0a 0d 0a 20 20 20 20 63  e line:....    c
0cb0: 68 61 6e 67 65 73 20 3d 20 24 28 22 2e 61 72 74  hanges = $(".art
0cc0: 69 63 6c 65 20 2e 66 69 72 73 74 22 29 2e 6e 65  icle .first").ne
0cd0: 78 74 28 29 2e 66 69 6e 64 28 22 6c 69 22 29 0d  xt().find("li").
0ce0: 0a 0d 0a 58 50 61 74 68 20 61 6e 64 20 6a 51 75  ...XPath and jQu
0cf0: 65 72 79 20 72 75 6c 65 20 61 73 73 69 67 6e 6d  ery rule assignm
0d00: 65 6e 74 73 20 63 61 6e 20 6f 6e 6c 79 20 62 65  ents can only be
0d10: 20 73 69 6e 67 6c 65 2d 6c 69 6e 65 20 64 69 72   single-line dir
0d20: 65 63 74 69 76 65 73 2e 20 28 55 6e 6c 69 6b 65  ectives. (Unlike
0d30: 20 52 65 67 45 78 70 73 20 77 69 74 68 20 74 68   RegExps with th
0d40: 65 20 2f 78 20 66 6c 61 67 2c 20 77 68 69 63 68  e /x flag, which
0d50: 20 63 61 6e 20 77 72 61 70 20 61 72 6f 75 6e 64   can wrap around
0d60: 20 6c 69 6e 65 62 72 65 61 6b 73 2e 29 0d 0a 0d   linebreaks.)...
0d70: 0a 0d 0a 0d 0a 23 23 23 20 52 65 66 65 72 65 6e  .....### Referen
0d80: 63 65 73 0d 0a 0d 0a 53 65 65 20 5b 72 65 67 75  ces....See [regu
0d90: 6c 61 72 2d 65 78 70 72 65 73 73 69 6f 6e 73 2e  lar-expressions.
0da0: 69 6e 66 6f 5d 28 68 74 74 70 3a 2f 2f 77 77 77  info](http://www
0db0: 2e 72 65 67 75 6c 61 72 2d 65 78 70 72 65 73 73  .regular-express
0dc0: 69 6f 6e 73 2e 69 6e 66 6f 2f 29 20 66 6f 72 20  ions.info/) for 
0dd0: 61 20 73 69 6d 70 6c 65 20 52 65 67 45 78 70 20  a simple RegExp 
0de0: 69 6e 74 72 6f 64 75 63 74 69 6f 6e 2e 20 4f 74  introduction. Ot
0df0: 68 65 72 77 69 73 65 20 63 68 65 63 6b 20 6f 75  herwise check ou
0e00: 74 20 5b 6a 51 20 26 20 43 53 53 20 73 65 6c 65  t [jQ & CSS sele
0e10: 63 74 6f 72 73 5d 28 68 74 74 70 3a 2f 2f 73 74  ctors](http://st
0e20: 61 6e 64 61 72 64 69 73 74 61 2e 63 6f 6d 2f 6a  andardista.com/j
0e30: 71 75 65 72 79 2f 29 20 61 6e 64 20 74 68 65 20  query/) and the 
0e40: 5b 77 33 2e 6f 72 67 20 73 70 65 63 5d 28 68 74  [w3.org spec](ht
0e50: 74 70 3a 2f 2f 77 77 77 2e 77 33 2e 6f 72 67 2f  tp://www.w3.org/
0e60: 54 52 2f 43 53 53 32 2f 73 65 6c 65 63 74 6f 72  TR/CSS2/selector
0e70: 2e 68 74 6d 6c 29 20 6f 72 20 5b 6a 51 75 65 72  .html) or [jQuer
0e80: 79 20 70 73 65 75 64 6f 20 73 65 6c 65 63 74 6f  y pseudo selecto
0e90: 72 73 5d 28 68 74 74 70 3a 2f 2f 61 70 69 2e 6a  rs](http://api.j
0ea0: 71 75 65 72 79 2e 63 6f 6d 2f 63 61 74 65 67 6f  query.com/catego
0eb0: 72 79 2f 73 65 6c 65 63 74 6f 72 73 2f 29 20 66  ry/selectors/) f
0ec0: 6f 72 20 43 53 53 20 73 65 6c 65 63 74 6f 72 73  or CSS selectors
0ed0: 2e 20 41 6e 64 20 74 68 65 20 5b 58 50 61 74 68  . And the [XPath
0ee0: 20 2f 20 53 65 6c 65 6e 69 75 6d 20 63 68 65 61   / Selenium chea
0ef0: 74 20 73 68 65 65 74 5d 28 68 74 74 70 73 3a 2f  t sheet](https:/
0f00: 2f 77 77 77 2e 73 69 6d 70 6c 65 2d 74 61 6c 6b  /www.simple-talk
0f10: 2e 63 6f 6d 2f 64 6f 74 6e 65 74 2f 2e 6e 65 74  .com/dotnet/.net
0f20: 2d 66 72 61 6d 65 77 6f 72 6b 2f 78 70 61 74 68  -framework/xpath
0f30: 2c 2d 63 73 73 2c 2d 64 6f 6d 2d 61 6e 64 2d 73  ,-css,-dom-and-s
0f40: 65 6c 65 6e 69 75 6d 2d 74 68 65 2d 72 6f 73 65  elenium-the-rose
0f50: 74 74 61 2d 73 74 6f 6e 65 2f 29 20 6f 72 20 61  tta-stone/) or a
0f60: 6e 20 5b 58 70 61 74 68 2f 52 65 67 65 78 20 6f  n [Xpath/Regex o
0f70: 76 65 72 76 69 65 77 5d 28 68 74 74 70 3a 2f 2f  verview](http://
0f80: 78 70 61 74 68 2e 61 6c 65 70 68 7a 61 72 72 6f  xpath.alephzarro
0f90: 2e 63 6f 6d 2f 63 6f 6e 74 65 6e 74 2f 63 68 65  .com/content/che
0fa0: 61 74 73 68 65 65 74 2e 68 74 6d 6c 29 20 66 6f  atsheet.html) fo
0fb0: 72 20 58 50 61 74 68 20 65 78 61 6d 70 6c 65 73  r XPath examples
0fc0: 2e 0d 0a 0d 0a 0d 0a 23 23 23 20 45 78 61 6d 70  .......### Examp
0fd0: 6c 65 73 20 52 65 67 65 78 0d 0a 0d 0a 49 66 20  les Regex....If 
0fe0: 79 6f 75 20 75 73 65 20 73 65 6d 61 6e 74 69 63  you use semantic
0ff0: 20 76 65 72 73 69 6f 6e 69 6e 67 2c 20 74 68 65   versioning, the
1000: 6e 20 79 6f 75 20 63 61 6e 20 6b 65 65 70 20 74  n you can keep t
1010: 68 65 20 60 5c 64 2b 2e 5c 64 2b 2e 5c 64 2b 60  he `\d+.\d+.\d+`
1020: 20 76 65 72 73 69 6f 6e 3d 20 66 69 65 6c 64 2e   version= field.
1030: 20 54 6f 20 61 6c 6c 6f 77 20 66 6f 72 20 60 2d   To allow for `-
1040: 62 65 74 61 60 20 6f 72 20 60 2d 64 65 76 2e 32  beta` or `-dev.2
1050: 60 20 70 72 65 66 69 78 65 73 20 65 76 65 6e 3a  ` prefixes even:
1060: 0d 0a 0d 0a 20 20 20 20 76 65 72 73 69 6f 6e 20  ....    version 
1070: 3d 20 2f 28 28 5c 64 2b 5c 2e 5c 64 2b 28 5c 2e  = /((\d+\.\d+(\.
1080: 5c 64 2b 29 2b 28 2d 5c 77 2b 28 3f 3a 5c 2e 5c  \d+)+(-\w+(?:\.\
1090: 77 2b 29 2a 29 2a 2f 0d 0a 0d 0a 59 6f 75 20 63  w+)*)*/....You c
10a0: 61 6e 20 6f 66 20 63 6f 75 72 73 65 20 70 72 65  an of course pre
10b0: 63 65 65 64 20 74 68 69 73 20 72 65 67 65 78 20  ceed this regex 
10c0: 77 69 74 68 20 6d 6f 72 65 20 63 6f 6e 63 72 65  with more concre
10d0: 74 65 20 63 6f 6e 74 65 78 74 20 6d 61 74 63 68  te context match
10e0: 65 73 2e 20 49 66 20 66 6f 72 20 65 78 61 6d 70  es. If for examp
10f0: 6c 65 20 79 6f 75 20 77 65 72 65 20 74 6f 20 75  le you were to u
1100: 73 65 20 6d 65 74 61 20 64 61 74 61 20 63 6f 6d  se meta data com
1110: 6d 65 6e 74 73 3a 0d 0a 0d 0a 20 20 20 20 76 65  ments:....    ve
1120: 72 73 69 6f 6e 20 3d 20 7e 20 5e 5c 68 2a 20 5b  rsion = ~ ^\h* [
1130: 2f 23 2a 5d 2b 20 5c 68 2a 76 65 72 73 69 6f 6e  /#*]+ \h*version
1140: 3a 5c 68 2a 20 20 28 5c 64 2b 28 3f 3a 5c 2e 5c  :\h*  (\d+(?:\.\
1150: 64 2b 29 2b 5b 2d 2e 5c 77 5d 2b 29 20 7e 6d 69  d+)+[-.\w]+) ~mi
1160: 78 0d 0a 0d 0a 45 78 74 72 61 63 74 69 6e 67 20  x....Extracting 
1170: 61 20 43 68 61 6e 67 65 6c 6f 67 20 73 75 6d 6d  a Changelog summ
1180: 61 72 79 20 69 73 20 6d 6f 72 65 20 64 69 66 66  ary is more diff
1190: 69 63 75 6c 74 2e 20 49 66 20 79 6f 75 20 77 61  icult. If you wa
11a0: 6e 74 20 74 6f 20 65 73 63 68 65 77 20 6d 61 6e  nt to eschew man
11b0: 75 61 6c 20 72 65 6c 65 61 73 65 20 73 75 62 6d  ual release subm
11c0: 69 73 73 69 6f 6e 73 20 6f 6e 20 2a 66 72 65 73  issions on *fres
11d0: 68 63 6f 64 65 2e 63 6c 75 62 2a 20 79 6f 75 20  hcode.club* you 
11e0: 6d 61 79 20 77 69 73 68 20 74 6f 20 61 64 6f 70  may wish to adop
11f0: 74 20 61 20 63 6f 68 65 72 65 6e 74 20 52 45 41  t a coherent REA
1200: 44 4d 45 20 6f 72 20 43 48 41 4e 47 45 4c 4f 47  DME or CHANGELOG
1210: 20 73 63 68 65 6d 65 2e 0d 0a 0d 0a 46 6f 72 20   scheme.....For 
1220: 65 78 61 6d 70 6c 65 20 49 20 75 73 65 20 61 20  example I use a 
1230: 60 68 69 73 74 6f 72 79 5c 6e 2d 2d 2d 2d 2d 2d  `history\n------
1240: 5c 6e 60 20 6d 61 72 6b 65 72 20 69 6e 20 74 68  \n` marker in th
1250: 65 20 52 45 41 44 4d 45 2c 20 77 68 65 72 65 20  e README, where 
1260: 69 74 27 73 20 65 61 73 79 20 74 6f 20 6d 61 74  it's easy to mat
1270: 63 68 20 74 68 65 20 70 72 65 2d 73 75 6d 6d 61  ch the pre-summa
1280: 72 69 7a 65 64 20 63 68 61 6e 67 65 73 3a 0d 0a  rized changes:..
1290: 0d 0a 20 20 20 20 63 68 61 6e 67 65 73 20 3d 20  ..    changes = 
12a0: 2f 68 69 73 74 6f 72 79 5c 52 2d 2d 2d 2d 2d 2b  /history\R-----+
12b0: 5c 52 2b 5b 5c 64 2e 5d 2b 5c 52 28 2e 2b 3f 29  \R+[\d.]+\R(.+?)
12c0: 5c 52 5c 52 2f 73 0d 0a 0d 0a 54 68 65 20 60 5c  \R\R/s....The `\
12d0: 52 60 20 69 73 20 61 20 6c 69 6e 65 62 72 65 61  R` is a linebrea
12e0: 6b 20 70 6c 61 63 65 68 6f 6c 64 65 72 20 28 61  k placeholder (a
12f0: 6c 6c 20 43 52 2c 20 4c 46 2c 20 43 52 4c 46 20  ll CR, LF, CRLF 
1300: 76 61 72 69 61 6e 74 73 29 2c 20 61 6e 64 20 60  variants), and `
1310: 5c 52 5c 52 60 20 68 65 6e 63 65 20 61 6e 20 65  \R\R` hence an e
1320: 6d 70 74 79 20 6c 69 6e 65 2e 0d 0a 0d 0a 46 6f  mpty line.....Fo
1330: 72 20 74 68 65 20 60 63 68 61 6e 67 65 73 60 20  r the `changes` 
1340: 66 69 65 6c 64 20 61 6e 79 20 60 2d 60 20 6f 72  field any `-` or
1350: 20 60 23 60 20 61 6e 64 20 60 2a 60 20 61 74 20   `#` and `*` at 
1360: 74 68 65 20 73 74 61 72 74 20 6f 66 20 6c 69 6e  the start of lin
1370: 65 73 20 67 65 74 20 73 74 72 69 70 70 65 64 2c  es get stripped,
1380: 20 62 74 77 2e 0d 0a 0d 0a 59 6f 75 20 73 74 69   btw.....You sti
1390: 6c 6c 20 6f 75 67 68 74 20 74 6f 20 6b 65 65 70  ll ought to keep
13a0: 20 74 68 65 20 63 68 61 6e 67 65 6c 6f 67 20 69   the changelog i
13b0: 6e 20 61 6e 20 65 6e 64 2d 75 73 65 72 20 61 70  n an end-user ap
13c0: 70 72 6f 61 63 68 61 62 6c 65 20 77 72 69 74 69  proachable writi
13d0: 6e 67 20 73 74 79 6c 65 2e 0d 0a 0d 0a 0d 0a 0d  ng style........
13e0: 0a 23 23 23 20 68 69 64 64 65 6e 20 72 65 6c 65  .### hidden rele
13f0: 61 73 65 73 0d 0a 0d 0a 49 66 20 79 6f 75 20 63  ases....If you c
1400: 61 6e 27 74 20 75 6e 63 6f 76 65 72 20 61 20 73  an't uncover a s
1410: 75 69 74 61 62 6c 65 20 73 6f 75 72 63 65 20 66  uitable source f
1420: 6f 72 20 60 24 63 68 61 6e 67 65 73 3d 60 20 74  or `$changes=` t
1430: 68 65 6e 20 79 6f 75 72 20 61 75 74 6f 6d 61 74  hen your automat
1440: 65 64 20 72 65 6c 65 61 73 65 20 73 75 62 6d 69  ed release submi
1450: 73 73 69 6f 6e 20 77 69 6c 6c 20 62 65 20 63 6c  ssion will be cl
1460: 61 73 73 69 66 69 65 64 20 61 73 20 2a 68 69 64  assified as *hid
1470: 64 65 6e 2a 2e 20 54 68 75 73 20 74 68 65 20 70  den*. Thus the p
1480: 72 6f 6a 65 63 74 20 65 6e 74 72 79 20 77 69 6c  roject entry wil
1490: 6c 20 73 74 61 79 20 63 75 72 72 65 6e 74 2c 20  l stay current, 
14a0: 62 75 74 20 6e 6f 20 66 72 6f 6e 74 70 61 67 65  but no frontpage
14b0: 20 6c 69 73 74 69 6e 67 20 28 6f 72 20 6e 6f 74   listing (or not
14c0: 69 66 69 63 61 74 69 6f 6e 29 20 77 69 6c 6c 20  ification) will 
14d0: 6f 63 63 75 72 2e 0d 0a 0d 0a 54 68 65 20 72 65  occur.....The re
14e0: 67 65 78 20 6d 6f 64 75 6c 65 20 77 69 6c 6c 20  gex module will 
14f0: 61 6c 73 6f 20 6c 69 6b 65 6c 79 20 62 65 20 72  also likely be r
1500: 61 74 65 20 6c 69 6d 69 74 65 64 2c 20 73 6f 20  ate limited, so 
1510: 77 6f 6e 27 74 20 72 65 73 63 61 6e 20 79 6f 75  won't rescan you
1520: 72 20 77 65 62 73 69 74 65 20 64 61 69 6c 79 2e  r website daily.
1530: 0d 0a 0d 0a 0d 0a 23 23 23 20 69 6e 74 65 72 76  ......### interv
1540: 61 6c 3d 20 72 75 6c 65 0d 0a 0d 0a 41 6c 6c 20  al= rule....All 
1550: 41 75 74 6f 75 70 64 61 74 65 20 6d 6f 64 75 6c  Autoupdate modul
1560: 65 73 20 61 64 64 69 74 69 6f 6e 61 6c 6c 79 20  es additionally 
1570: 73 75 70 70 6f 72 74 20 74 68 65 20 60 69 6e 74  support the `int
1580: 65 72 76 61 6c 20 3d 20 37 60 20 72 75 6c 65 3b  erval = 7` rule;
1590: 20 74 68 65 20 6e 75 6d 62 65 72 20 73 70 65 63   the number spec
15a0: 69 66 79 69 6e 67 20 61 20 6d 69 6e 69 6d 75 6d  ifying a minimum
15b0: 20 61 6d 6f 75 6e 74 20 6f 66 20 64 61 79 73 20   amount of days 
15c0: 62 65 66 6f 72 65 20 61 6e 79 20 6e 65 77 20 72  before any new r
15d0: 65 6c 65 61 73 65 20 6c 6f 6f 6b 75 70 20 69 73  elease lookup is
15e0: 20 61 74 74 65 6d 70 74 65 64 2e 0d 0a 0d 0a 0a   attempted......
15f0: 5a 20 65 36 33 34 33 63 39 34 32 38 65 64 62 61  Z e6343c9428edba
1600: 64 62 36 38 61 38 37 62 33 66 39 35 66 66 30 31  db68a87b3f95ff01
1610: 33 65 0a                                         3e.