Collection of themes/skins for the Fossil SCM

⌈⌋ ⎇ branch:  Fossil Skins Extra


Hex Artifact Content

Artifact f3faad3102bc7d86c29339741ced9435e22909b0:

  • Executable file extroot/config — part of check-in [eff6e152ba] at 2021-10-19 05:06:22 on branch trunk — Editing UI for additional `config` table entries. (user: mario size: 5534)

0000: 23 21 2f 75 73 72 2f 62 69 6e 2f 70 68 70 2d 63  #!/usr/bin/php-c
0010: 67 69 20 2d 64 63 67 69 2e 66 6f 72 63 65 5f 72  gi -dcgi.force_r
0020: 65 64 69 72 65 63 74 3d 30 0a 3c 3f 70 68 70 0a  edirect=0.<?php.
0030: 23 20 65 6e 63 6f 64 69 6e 67 3a 20 75 74 66 2d  # encoding: utf-
0040: 38 0a 23 20 61 70 69 3a 20 63 67 69 0a 23 20 74  8.# api: cgi.# t
0050: 79 70 65 3a 20 63 6f 6e 66 69 67 0a 23 20 63 61  ype: config.# ca
0060: 74 65 67 6f 72 79 3a 20 61 64 6d 69 6e 0a 23 20  tegory: admin.# 
0070: 74 69 74 6c 65 3a 20 45 78 74 72 61 20 63 6f 6e  title: Extra con
0080: 66 69 67 0a 23 20 64 65 73 63 72 69 70 74 69 6f  fig.# descriptio
0090: 6e 3a 20 41 64 64 69 74 69 6f 6e 61 6c 20 6c 69  n: Additional li
00a0: 73 74 20 6f 66 20 6f 70 74 69 6f 6e 73 20 74 6f  st of options to
00b0: 20 63 6f 6e 66 69 67 75 72 65 2c 20 72 65 61 64   configure, read
00c0: 20 66 72 6f 6d 20 65 78 74 2f 2a 20 50 4d 44 0a   from ext/* PMD.
00d0: 23 20 76 65 72 73 69 6f 6e 3a 20 30 2e 31 0a 23  # version: 0.1.#
00e0: 20 73 74 61 74 65 3a 20 62 65 74 61 0a 23 20 63   state: beta.# c
00f0: 6f 6e 66 69 67 3a 0a 23 20 20 20 20 7b 20 6e 61  onfig:.#    { na
0100: 6d 65 3a 20 70 72 6f 6a 65 63 74 2d 74 77 69 74  me: project-twit
0110: 74 65 72 2c 20 74 79 70 65 3a 20 73 74 72 2c 20  ter, type: str, 
0120: 76 61 6c 75 65 3a 20 22 22 2c 20 64 65 73 63 72  value: "", descr
0130: 69 70 74 69 6f 6e 3a 20 22 54 77 69 74 74 65 72  iption: "Twitter
0140: 20 68 61 6e 64 6c 65 20 66 6f 72 20 70 72 6f 6a   handle for proj
0150: 65 63 74 20 28 65 2e 67 2e 20 40 73 71 6c 69 74  ect (e.g. @sqlit
0160: 65 31 29 22 20 7d 0a 23 20 20 20 20 7b 20 6e 61  e1)" }.#    { na
0170: 6d 65 3a 20 70 72 6f 6a 65 63 74 2d 6c 69 63 65  me: project-lice
0180: 6e 73 65 2c 20 74 79 70 65 3a 20 73 65 6c 65 63  nse, type: selec
0190: 74 2c 20 73 65 6c 65 63 74 3a 20 22 30 42 53 44  t, select: "0BSD
01a0: 7c 41 41 4c 7c 41 44 53 4c 7c 41 46 4c 2d 33 2e  |AAL|ADSL|AFL-3.
01b0: 30 7c 41 47 50 4c 2d 31 2e 30 7c 41 47 50 4c 2d  0|AGPL-1.0|AGPL-
01c0: 33 2e 30 7c 41 47 50 4c 2d 33 2e 30 2d 6f 72 2d  3.0|AGPL-3.0-or-
01d0: 6c 61 74 65 72 7c 41 70 61 63 68 65 2d 32 2e 30  later|Apache-2.0
01e0: 7c 41 50 53 4c 2d 32 2e 30 7c 41 72 74 69 73 74  |APSL-2.0|Artist
01f0: 69 63 2d 31 2e 30 7c 41 72 74 69 73 74 69 63 2d  ic-1.0|Artistic-
0200: 32 2e 30 7c 42 53 44 2d 31 2d 43 6c 61 75 73 65  2.0|BSD-1-Clause
0210: 7c 42 53 44 2d 32 2d 43 6c 61 75 73 65 7c 42 53  |BSD-2-Clause|BS
0220: 44 2d 32 2d 43 6c 61 75 73 65 2d 46 72 65 65 42  D-2-Clause-FreeB
0230: 53 44 7c 42 53 44 2d 32 2d 43 6c 61 75 73 65 2d  SD|BSD-2-Clause-
0240: 4e 65 74 42 53 44 7c 42 53 44 2d 32 2d 43 6c 61  NetBSD|BSD-2-Cla
0250: 75 73 65 2d 50 61 74 65 6e 74 7c 42 53 44 2d 33  use-Patent|BSD-3
0260: 2d 43 6c 61 75 73 65 7c 42 53 44 2d 33 2d 43 6c  -Clause|BSD-3-Cl
0270: 61 75 73 65 2d 41 74 74 72 69 62 75 74 69 6f 6e  ause-Attribution
0280: 7c 42 53 44 2d 33 2d 43 6c 61 75 73 65 2d 43 6c  |BSD-3-Clause-Cl
0290: 65 61 72 7c 42 53 44 2d 33 2d 43 6c 61 75 73 65  ear|BSD-3-Clause
02a0: 2d 4d 6f 64 69 66 69 63 61 74 69 6f 6e 7c 42 53  -Modification|BS
02b0: 44 2d 34 2d 43 6c 61 75 73 65 7c 42 53 44 2d 34  D-4-Clause|BSD-4
02c0: 2d 43 6c 61 75 73 65 2d 53 68 6f 72 74 65 6e 65  -Clause-Shortene
02d0: 64 7c 42 53 4c 2d 31 2e 30 7c 43 41 4c 2d 31 2e  d|BSL-1.0|CAL-1.
02e0: 30 7c 43 43 30 2d 31 2e 30 7c 43 43 2d 42 59 2d  0|CC0-1.0|CC-BY-
02f0: 32 2e 30 7c 43 43 2d 42 59 2d 33 2e 30 7c 43 43  2.0|CC-BY-3.0|CC
0300: 2d 42 59 2d 34 2e 30 7c 43 43 2d 42 59 2d 4e 43  -BY-4.0|CC-BY-NC
0310: 2d 32 2e 30 7c 43 43 2d 42 59 2d 4e 43 2d 34 2e  -2.0|CC-BY-NC-4.
0320: 30 7c 43 43 2d 42 59 2d 4e 43 2d 4e 44 2d 32 2e  0|CC-BY-NC-ND-2.
0330: 30 7c 43 43 2d 42 59 2d 4e 43 2d 4e 44 2d 33 2e  0|CC-BY-NC-ND-3.
0340: 30 7c 43 43 2d 42 59 2d 4e 43 2d 4e 44 2d 34 2e  0|CC-BY-NC-ND-4.
0350: 30 7c 43 43 2d 42 59 2d 4e 43 2d 53 41 2d 32 2e  0|CC-BY-NC-SA-2.
0360: 30 7c 43 43 2d 42 59 2d 4e 43 2d 53 41 2d 33 2e  0|CC-BY-NC-SA-3.
0370: 30 7c 43 43 2d 42 59 2d 4e 43 2d 53 41 2d 34 2e  0|CC-BY-NC-SA-4.
0380: 30 7c 43 43 2d 42 59 2d 4e 44 2d 34 2e 30 7c 43  0|CC-BY-ND-4.0|C
0390: 43 2d 42 59 2d 53 41 2d 32 2e 30 7c 43 43 2d 42  C-BY-SA-2.0|CC-B
03a0: 59 2d 53 41 2d 34 2e 30 7c 43 44 44 4c 2d 31 2e  Y-SA-4.0|CDDL-1.
03b0: 31 7c 43 50 4c 2d 31 2e 30 7c 45 43 4c 2d 32 2e  1|CPL-1.0|ECL-2.
03c0: 30 7c 45 46 4c 2d 32 2e 30 7c 45 50 4c 2d 32 2e  0|EFL-2.0|EPL-2.
03d0: 30 7c 45 55 50 4c 2d 31 2e 32 7c 47 46 44 4c 2d  0|EUPL-1.2|GFDL-
03e0: 31 2e 31 7c 47 46 44 4c 2d 31 2e 33 2d 6f 6e 6c  1.1|GFDL-1.3-onl
03f0: 79 7c 47 46 44 4c 2d 31 2e 33 2d 6f 72 2d 6c 61  y|GFDL-1.3-or-la
0400: 74 65 72 7c 47 50 4c 2d 31 2e 30 7c 47 50 4c 2d  ter|GPL-1.0|GPL-
0410: 31 2e 30 2b 7c 47 50 4c 2d 32 2e 30 7c 47 50 4c  1.0+|GPL-2.0|GPL
0420: 2d 32 2e 30 2b 7c 47 50 4c 2d 32 2e 30 2d 6f 6e  -2.0+|GPL-2.0-on
0430: 6c 79 7c 47 50 4c 2d 33 2e 30 7c 47 50 4c 2d 33  ly|GPL-3.0|GPL-3
0440: 2e 30 2b 7c 49 50 4c 2d 31 2e 30 7c 49 53 43 7c  .0+|IPL-1.0|ISC|
0450: 4c 47 50 4c 2d 32 2e 30 7c 4c 47 50 4c 2d 32 2e  LGPL-2.0|LGPL-2.
0460: 31 7c 4c 47 50 4c 2d 32 2e 31 2b 7c 4c 47 50 4c  1|LGPL-2.1+|LGPL
0470: 2d 33 2e 30 7c 4c 47 50 4c 2d 33 2e 30 2b 7c 4d  -3.0|LGPL-3.0+|M
0480: 49 54 7c 4d 49 54 2d 30 7c 4d 49 54 2d 4d 6f 64  IT|MIT-0|MIT-Mod
0490: 65 72 6e 2d 56 61 72 69 61 6e 74 7c 4d 50 4c 2d  ern-Variant|MPL-
04a0: 31 2e 30 7c 4d 50 4c 2d 31 2e 31 7c 4d 50 4c 2d  1.0|MPL-1.1|MPL-
04b0: 32 2e 30 7c 4d 53 2d 50 4c 7c 4d 53 2d 52 4c 7c  2.0|MS-PL|MS-RL|
04c0: 4e 50 4c 2d 31 2e 31 7c 4f 46 4c 2d 31 2e 30 7c  NPL-1.1|OFL-1.0|
04d0: 4f 53 4c 2d 32 2e 30 7c 4f 53 4c 2d 33 2e 30 7c  OSL-2.0|OSL-3.0|
04e0: 50 53 46 2d 32 2e 30 7c 50 79 74 68 6f 6e 2d 32  PSF-2.0|Python-2
04f0: 2e 30 7c 53 50 4c 2d 31 2e 30 7c 54 43 4c 7c 55  .0|SPL-1.0|TCL|U
0500: 6e 6c 69 63 65 6e 73 65 7c 57 33 43 7c 57 54 46  nlicense|W3C|WTF
0510: 50 4c 7c 58 31 31 7c 5a 65 6e 64 2d 32 2e 30 7c  PL|X11|Zend-2.0|
0520: 5a 50 4c 2d 32 2e 31 22 2c 20 76 61 6c 75 65 3a  ZPL-2.1", value:
0530: 20 22 22 2c 20 64 65 73 63 72 69 70 74 69 6f 6e   "", description
0540: 3a 20 22 53 6f 75 72 63 65 20 63 6f 64 65 20 6c  : "Source code l
0550: 69 63 65 6e 73 65 20 28 53 50 44 58 20 69 64 65  icense (SPDX ide
0560: 6e 74 69 66 69 65 72 29 22 20 7d 0a 23 20 20 20  ntifier)" }.#   
0570: 20 7b 20 6e 61 6d 65 3a 20 70 72 6f 6a 65 63 74   { name: project
0580: 2d 64 65 73 63 72 69 70 74 69 6f 6e 2c 20 74 79  -description, ty
0590: 70 65 3a 20 74 65 78 74 2c 20 76 61 6c 75 65 3a  pe: text, value:
05a0: 20 22 22 2c 20 64 65 73 63 72 69 70 74 69 6f 6e   "", description
05b0: 3a 20 22 46 6f 73 73 69 6c 20 72 65 70 6f 73 69  : "Fossil reposi
05c0: 74 6f 72 79 20 61 6e 64 20 70 72 6f 6a 65 63 74  tory and project
05d0: 20 64 65 73 63 72 69 70 74 69 6f 6e 22 20 7d 0a   description" }.
05e0: 23 20 6e 65 77 3a 20 2d 0a 23 0a 23 20 52 65 61  # new: -.#.# Rea
05f0: 64 73 20 74 68 65 20 23 63 6f 6e 66 69 67 3a 7b  ds the #config:{
0600: 7d 20 66 69 65 6c 64 73 2c 20 61 6e 64 20 75 70  } fields, and up
0610: 64 61 74 65 73 20 66 6f 73 73 69 6c 73 e2 80 99  dates fossils’
0620: 20 63 6f 6e 66 69 67 20 74 61 62 6c 65 2e 0a 23   config table..#
0630: 20 41 6c 6c 6f 77 73 20 65 78 74 72 6f 6f 74 20   Allows extroot 
0640: 73 63 72 69 70 74 73 20 74 6f 20 70 72 6f 76 69  scripts to provi
0650: 64 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 6f 70  de additional op
0660: 74 69 6f 6e 73 2c 20 6f 72 20 6a 75 73 74 0a 23  tions, or just.#
0670: 20 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 20   an alternative 
0680: 74 6f 20 74 68 65 20 62 75 69 6c 74 69 6e 20 73  to the builtin s
0690: 65 74 74 69 6e 67 73 2e 0a 23 0a 0a 65 72 72 6f  ettings..#..erro
06a0: 72 5f 72 65 70 6f 72 74 69 6e 67 28 45 5f 41 4c  r_reporting(E_AL
06b0: 4c 29 3b 0a 0a 23 2d 2d 20 66 6f 73 73 69 6c 20  L);..#-- fossil 
06c0: 48 54 4d 4c 20 6f 75 74 70 75 74 0a 66 75 6e 63  HTML output.func
06d0: 74 69 6f 6e 20 70 61 67 65 5f 6d 64 28 24 74 65  tion page_md($te
06e0: 78 74 29 20 7b 0a 20 20 20 20 68 65 61 64 65 72  xt) {.    header
06f0: 28 22 43 6f 6e 74 65 6e 74 2d 54 79 70 65 3a 20  ("Content-Type: 
0700: 74 65 78 74 2f 68 74 6d 6c 3b 20 63 68 61 72 73  text/html; chars
0710: 65 74 3d 75 74 66 2d 38 22 29 3b 0a 20 20 20 20  et=utf-8");.    
0720: 70 72 69 6e 74 20 3c 3c 3c 45 4f 46 0a 3c 64 69  print <<<EOF.<di
0730: 76 20 63 6c 61 73 73 3d 27 66 6f 73 73 69 6c 2d  v class='fossil-
0740: 64 6f 63 27 20 64 61 74 61 2d 74 69 74 6c 65 3d  doc' data-title=
0750: 27 45 78 74 72 61 20 63 6f 6e 66 69 67 75 72 61  'Extra configura
0760: 74 69 6f 6e 27 3e 0a 3c 73 74 79 6c 65 3e 0a 20  tion'>.<style>. 
0770: 2e 63 6f 6e 66 69 67 2d 6c 69 73 74 20 6c 61 62  .config-list lab
0780: 65 6c 20 7b 0a 20 20 20 20 64 69 73 70 6c 61 79  el {.    display
0790: 3a 20 62 6c 6f 63 6b 3b 0a 20 20 20 20 6d 61 72  : block;.    mar
07a0: 67 69 6e 2d 62 6f 74 74 6f 6d 3a 20 31 30 70 74  gin-bottom: 10pt
07b0: 3b 0a 20 20 20 20 62 6f 72 64 65 72 2d 6c 65 66  ;.    border-lef
07c0: 74 3a 20 33 70 74 20 23 64 64 64 20 73 6f 6c 69  t: 3pt #ddd soli
07d0: 64 3b 0a 20 20 20 20 62 6f 72 64 65 72 2d 72 61  d;.    border-ra
07e0: 64 69 75 73 3a 20 35 70 74 20 30 20 30 20 35 70  dius: 5pt 0 0 5p
07f0: 74 3b 0a 20 20 20 20 70 61 64 64 69 6e 67 2d 6c  t;.    padding-l
0800: 65 66 74 3a 20 31 30 70 74 3b 0a 20 7d 0a 3c 2f  eft: 10pt;. }.</
0810: 73 74 79 6c 65 3e 0a 24 74 65 78 74 0a 45 4f 46  style>.$text.EOF
0820: 3b 0a 7d 0a 0a 23 2d 2d 20 64 61 74 61 62 61 73  ;.}..#-- databas
0830: 65 20 28 3d 3d 20 66 6f 73 73 69 6c 20 72 65 70  e (== fossil rep
0840: 6f 29 0a 66 75 6e 63 74 69 6f 6e 20 64 62 28 24  o).function db($
0850: 73 71 6c 3d 22 22 2c 20 24 70 61 72 61 6d 73 3d  sql="", $params=
0860: 5b 5d 29 20 7b 0a 20 20 20 20 73 74 61 74 69 63  []) {.    static
0870: 20 24 64 62 3b 0a 20 20 20 20 69 66 20 28 65 6d   $db;.    if (em
0880: 70 74 79 28 24 64 62 29 29 20 7b 0a 20 20 20 20  pty($db)) {.    
0890: 20 20 20 20 24 64 62 20 3d 20 6e 65 77 20 50 44      $db = new PD
08a0: 4f 28 22 73 71 6c 69 74 65 3a 24 5f 53 45 52 56  O("sqlite:$_SERV
08b0: 45 52 5b 46 4f 53 53 49 4c 5f 52 45 50 4f 53 49  ER[FOSSIL_REPOSI
08c0: 54 4f 52 59 5d 22 29 3b 0a 20 20 20 20 7d 0a 20  TORY]");.    }. 
08d0: 20 20 20 69 66 20 28 24 70 61 72 61 6d 73 29 20     if ($params) 
08e0: 7b 0a 20 20 20 20 20 20 20 20 24 73 74 6d 74 20  {.        $stmt 
08f0: 3d 20 24 64 62 2d 3e 70 72 65 70 61 72 65 28 24  = $db->prepare($
0900: 73 71 6c 29 3b 0a 20 20 20 20 20 20 20 20 24 73  sql);.        $s
0910: 74 6d 74 2d 3e 65 78 65 63 75 74 65 28 24 70 61  tmt->execute($pa
0920: 72 61 6d 73 29 3b 0a 20 20 20 20 20 20 20 20 72  rams);.        r
0930: 65 74 75 72 6e 20 24 73 74 6d 74 2d 3e 66 65 74  eturn $stmt->fet
0940: 63 68 41 6c 6c 28 50 44 4f 3a 3a 46 45 54 43 48  chAll(PDO::FETCH
0950: 5f 41 53 53 4f 43 29 3b 0a 20 20 20 20 7d 0a 20  _ASSOC);.    }. 
0960: 20 20 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20     else {.      
0970: 20 20 72 65 74 75 72 6e 20 24 64 62 2d 3e 71 75    return $db->qu
0980: 65 72 79 28 24 73 71 6c 29 2d 3e 66 65 74 63 68  ery($sql)->fetch
0990: 41 6c 6c 28 50 44 4f 3a 3a 46 45 54 43 48 5f 41  All(PDO::FETCH_A
09a0: 53 53 4f 43 29 3b 0a 20 20 20 20 7d 0a 7d 0a 66  SSOC);.    }.}.f
09b0: 75 6e 63 74 69 6f 6e 20 67 65 74 5f 63 6f 6e 66  unction get_conf
09c0: 69 67 28 24 6e 61 6d 65 2c 20 24 64 65 66 61 75  ig($name, $defau
09d0: 6c 74 29 20 7b 0a 20 20 20 20 24 72 20 3d 20 64  lt) {.    $r = d
09e0: 62 28 22 53 45 4c 45 43 54 20 76 61 6c 75 65 20  b("SELECT value 
09f0: 46 52 4f 4d 20 63 6f 6e 66 69 67 20 57 48 45 52  FROM config WHER
0a00: 45 20 6e 61 6d 65 3d 3f 22 2c 20 5b 24 6e 61 6d  E name=?", [$nam
0a10: 65 5d 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  e]);.    return 
0a20: 24 72 20 3f 20 24 72 5b 30 5d 5b 22 76 61 6c 75  $r ? $r[0]["valu
0a30: 65 22 5d 20 3a 20 24 64 65 66 61 75 6c 74 3b 0a  e"] : $default;.
0a40: 7d 0a 66 75 6e 63 74 69 6f 6e 20 68 28 24 73 29  }.function h($s)
0a50: 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 68 74   {.    return ht
0a60: 6d 6c 73 70 65 63 69 61 6c 63 68 61 72 73 28 24  mlspecialchars($
0a70: 73 2c 20 45 4e 54 5f 51 55 4f 54 45 53 2c 20 22  s, ENT_QUOTES, "
0a80: 75 74 66 2d 38 22 29 3b 0a 7d 0a 0a 23 2d 2d 20  utf-8");.}..#-- 
0a90: 66 69 6c 74 65 72 65 64 20 66 69 6c 65 20 6c 69  filtered file li
0aa0: 73 74 0a 66 75 6e 63 74 69 6f 6e 20 6c 73 28 24  st.function ls($
0ab0: 64 69 72 29 20 7b 0a 20 20 20 20 24 6c 73 20 3d  dir) {.    $ls =
0ac0: 20 5b 5d 3b 0a 20 20 20 20 66 6f 72 65 61 63 68   [];.    foreach
0ad0: 20 28 67 6c 6f 62 28 22 24 64 69 72 2f 2a 22 29   (glob("$dir/*")
0ae0: 20 61 73 20 24 66 6e 29 20 7b 0a 20 20 20 20 20   as $fn) {.     
0af0: 20 20 20 69 66 20 28 69 73 5f 66 69 6c 65 28 24     if (is_file($
0b00: 66 6e 29 20 61 6e 64 20 69 73 5f 65 78 65 63 75  fn) and is_execu
0b10: 74 61 62 6c 65 28 24 66 6e 29 20 61 6e 64 20 69  table($fn) and i
0b20: 73 5f 72 65 61 64 61 62 6c 65 28 24 66 6e 29 29  s_readable($fn))
0b30: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 24   {.            $
0b40: 6c 73 5b 5d 20 3d 20 62 61 73 65 6e 61 6d 65 28  ls[] = basename(
0b50: 24 66 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  $fn);.        }.
0b60: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
0b70: 20 24 6c 73 3b 0a 7d 0a 0a 23 2d 2d 20 70 6c 75   $ls;.}..#-- plu
0b80: 67 69 6e 20 6d 65 74 61 20 64 61 74 61 20 72 65  gin meta data re
0b90: 61 64 69 6e 67 20 28 70 6c 75 67 69 6e 63 6f 6e  ading (plugincon
0ba0: 66 20 76 65 72 73 69 6f 6e 29 0a 66 75 6e 63 74  f version).funct
0bb0: 69 6f 6e 20 6d 65 74 61 28 24 66 6e 29 20 7b 0a  ion meta($fn) {.
0bc0: 20 20 20 20 24 73 72 63 20 3d 20 66 69 6c 65 5f      $src = file_
0bd0: 67 65 74 5f 63 6f 6e 74 65 6e 74 73 28 24 66 6e  get_contents($fn
0be0: 2c 20 66 61 6c 73 65 2c 20 4e 55 4c 4c 2c 20 30  , false, NULL, 0
0bf0: 2c 20 34 30 39 36 29 3b 0a 20 20 20 20 24 73 72  , 4096);.    $sr
0c00: 63 20 3d 20 70 72 65 67 5f 72 65 70 6c 61 63 65  c = preg_replace
0c10: 28 22 7e 5c 52 7e 22 2c 20 22 5c 6e 22 2c 20 24  ("~\R~", "\n", $
0c20: 73 72 63 29 3b 0a 20 20 20 20 70 72 65 67 5f 6d  src);.    preg_m
0c30: 61 74 63 68 5f 61 6c 6c 28 22 7e 28 5e 5c 68 7b  atch_all("~(^\h{
0c40: 30 2c 34 7d 28 23 28 3f 21 21 29 7c 2f 2f 7c 2f  0,4}(#(?!!)|//|/
0c50: 3f 5c 2a 29 2e 2a 5c 6e 29 2b 7e 6d 22 2c 20 24  ?\*).*\n)+~m", $
0c60: 73 72 63 2c 20 24 75 75 29 3b 0a 20 20 20 20 24  src, $uu);.    $
0c70: 73 72 63 20 3d 20 69 6d 70 6c 6f 64 65 28 22 22  src = implode(""
0c80: 2c 20 24 75 75 5b 30 5d 29 3b 0a 20 20 20 20 24  , $uu[0]);.    $
0c90: 73 72 63 20 3d 20 70 72 65 67 5f 72 65 70 6c 61  src = preg_repla
0ca0: 63 65 28 22 7e 5e 5c 68 7b 30 2c 34 7d 28 23 7c  ce("~^\h{0,4}(#|
0cb0: 2f 2f 7c 2f 3f 5c 2a 29 5c 68 7b 30 2c 33 7d 5c  //|/?\*)\h{0,3}\
0cc0: 72 2a 7e 6d 22 2c 20 22 22 2c 20 24 73 72 63 29  r*~m", "", $src)
0cd0: 3b 0a 20 20 20 20 70 72 65 67 5f 6d 61 74 63 68  ;.    preg_match
0ce0: 5f 61 6c 6c 28 22 7e 5e 28 5b 5c 77 2d 5d 2b 29  _all("~^([\w-]+)
0cf0: 3a 28 2e 2a 24 5c 5c 6e 28 3f 3a 5c 6e 28 3f 21  :(.*$\\n(?:\n(?!
0d00: 5b 5c 77 2d 5d 2b 3a 29 2e 2b 24 5c 5c 6e 29 2a  [\w-]+:).+$\\n)*
0d10: 29 7e 78 6d 22 2c 20 24 73 72 63 2c 20 24 75 75  )~xm", $src, $uu
0d20: 29 3b 0a 20 20 20 20 24 72 20 3d 20 61 72 72 61  );.    $r = arra
0d30: 79 5f 63 6f 6d 62 69 6e 65 28 24 75 75 5b 31 5d  y_combine($uu[1]
0d40: 2c 20 24 75 75 5b 32 5d 29 3b 0a 20 20 20 20 72  , $uu[2]);.    r
0d50: 65 74 75 72 6e 20 24 72 3b 0a 7d 0a 23 2d 2d 20  eturn $r;.}.#-- 
0d60: 73 70 6c 69 74 20 75 70 20 63 6f 6e 66 69 67 3a  split up config:
0d70: 20 66 69 65 6c 64 0a 66 75 6e 63 74 69 6f 6e 20   field.function 
0d80: 63 6f 6e 66 69 67 28 24 6d 65 74 61 2c 20 24 72  config($meta, $r
0d90: 3d 5b 5d 29 20 7b 0a 20 20 20 20 69 66 20 28 65  =[]) {.    if (e
0da0: 6d 70 74 79 28 24 6d 65 74 61 5b 22 63 6f 6e 66  mpty($meta["conf
0db0: 69 67 22 5d 29 29 20 7b 0a 20 20 20 20 20 20 20  ig"])) {.       
0dc0: 20 72 65 74 75 72 6e 20 5b 5d 3b 0a 20 20 20 20   return [];.    
0dd0: 7d 0a 20 20 20 20 70 72 65 67 5f 6d 61 74 63 68  }.    preg_match
0de0: 5f 61 6c 6c 28 22 7e 5c 7b 20 28 2e 2b 3f 29 20  _all("~\{ (.+?) 
0df0: 5c 7d 20 7c 20 5c 3c 20 28 2e 2b 3f 29 20 5c 3e  \} | \< (.+?) \>
0e00: 7e 78 22 2c 20 24 6d 65 74 61 5b 22 63 6f 6e 66  ~x", $meta["conf
0e10: 69 67 22 5d 2c 20 24 75 75 29 3b 0a 20 20 20 20  ig"], $uu);.    
0e20: 66 6f 72 65 61 63 68 20 28 24 75 75 5b 30 5d 20  foreach ($uu[0] 
0e30: 61 73 20 24 72 6f 77 29 20 7b 0a 20 20 20 20 20  as $row) {.     
0e40: 20 20 20 70 72 65 67 5f 6d 61 74 63 68 5f 61 6c     preg_match_al
0e50: 6c 28 22 7e 20 5b 5c 22 27 3a 24 5d 3f 28 5c 77  l("~ [\"':$]?(\w
0e60: 2a 29 5b 5c 22 27 5d 3f 20 20 20 5c 73 2a 5b 3a  *)[\"']?   \s*[:
0e70: 3d 5d 2b 5c 73 2a 20 20 28 3f 3a 20 5c 22 28 5b  =]+\s*  (?: \"([
0e80: 5e 5c 22 5d 2a 29 5c 22 20 7c 20 27 28 5b 5e 27  ^\"]*)\" | '([^'
0e90: 5d 2a 29 27 20 7c 20 28 5b 5e 2c 5d 2a 29 20 29  ]*)' | ([^,]*) )
0ea0: 7e 78 22 2c 20 24 72 6f 77 2c 20 24 75 75 2c 20  ~x", $row, $uu, 
0eb0: 50 52 45 47 5f 53 45 54 5f 4f 52 44 45 52 29 3b  PREG_SET_ORDER);
0ec0: 0a 20 20 20 20 20 20 20 20 24 6f 70 74 20 3d 20  .        $opt = 
0ed0: 5b 5d 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 65  [];.        fore
0ee0: 61 63 68 20 28 24 75 75 20 61 73 20 24 66 29 20  ach ($uu as $f) 
0ef0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 24 66  {.            $f
0f00: 20 3d 20 61 72 72 61 79 5f 76 61 6c 75 65 73 28   = array_values(
0f10: 61 72 72 61 79 5f 66 69 6c 74 65 72 28 24 66 2c  array_filter($f,
0f20: 20 22 73 74 72 6c 65 6e 22 29 29 3b 0a 20 20 20   "strlen"));.   
0f30: 20 20 20 20 20 20 20 20 20 24 6f 70 74 5b 24 66           $opt[$f
0f40: 5b 31 5d 5d 20 3d 20 69 73 73 65 74 28 24 66 5b  [1]] = isset($f[
0f50: 32 5d 29 20 3f 20 24 66 5b 32 5d 20 3a 20 22 22  2]) ? $f[2] : ""
0f60: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
0f70: 20 20 20 20 24 72 5b 5d 20 3d 20 24 6f 70 74 3b      $r[] = $opt;
0f80: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
0f90: 6e 20 24 72 3b 0a 7d 0a 0a 23 2d 2d 20 72 75 6e  n $r;.}..#-- run
0fa0: 0a 70 61 67 65 5f 6d 64 28 22 3c 64 69 76 20 63  .page_md("<div c
0fb0: 6c 61 73 73 3d 63 6f 6e 66 69 67 2d 6c 69 73 74  lass=config-list
0fc0: 3e 5c 6e 22 29 3b 0a 66 6f 72 65 61 63 68 20 28  >\n");.foreach (
0fd0: 6c 73 28 5f 5f 44 49 52 5f 5f 29 20 61 73 20 24  ls(__DIR__) as $
0fe0: 66 6e 29 20 7b 0a 20 20 20 20 24 6d 65 74 61 20  fn) {.    $meta 
0ff0: 3d 20 6d 65 74 61 28 24 66 6e 29 3b 0a 20 20 20  = meta($fn);.   
1000: 20 24 68 20 3d 20 22 68 22 3b 0a 20 20 20 20 69   $h = "h";.    i
1010: 66 20 28 24 63 6f 6e 66 69 67 20 3d 20 63 6f 6e  f ($config = con
1020: 66 69 67 28 24 6d 65 74 61 29 29 20 7b 0a 20 20  fig($meta)) {.  
1030: 20 20 20 20 20 20 24 74 69 74 6c 65 20 3d 20 24        $title = $
1040: 6d 65 74 61 5b 22 74 69 74 6c 65 22 5d 20 3f 3a  meta["title"] ?:
1050: 20 24 66 6e 3b 0a 20 20 20 20 20 20 20 20 70 72   $fn;.        pr
1060: 69 6e 74 20 22 3c 68 33 3e 24 74 69 74 6c 65 3c  int "<h3>$title<
1070: 2f 68 33 3e 5c 6e 22 3b 0a 20 20 20 20 20 20 20  /h3>\n";.       
1080: 20 66 6f 72 65 61 63 68 20 28 24 63 6f 6e 66 69   foreach ($confi
1090: 67 20 61 73 20 24 6f 70 74 29 20 7b 0a 20 20 20  g as $opt) {.   
10a0: 20 20 20 20 20 20 20 20 20 69 66 20 28 65 6d 70           if (emp
10b0: 74 79 28 24 6f 70 74 5b 22 6e 61 6d 65 22 5d 29  ty($opt["name"])
10c0: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
10d0: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
10e0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
10f0: 20 20 20 20 20 20 20 20 24 6e 61 6d 65 20 3d 20          $name = 
1100: 24 6f 70 74 5b 22 6e 61 6d 65 22 5d 3b 0a 20 20  $opt["name"];.  
1110: 20 20 20 20 20 20 20 20 20 20 24 76 61 6c 75 65            $value
1120: 20 3d 20 67 65 74 5f 63 6f 6e 66 69 67 28 24 6e   = get_config($n
1130: 61 6d 65 2c 20 24 6f 70 74 5b 22 76 61 6c 75 65  ame, $opt["value
1140: 22 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  "]);.           
1150: 20 70 72 69 6e 74 20 22 3c 6c 61 62 65 6c 3e 3c   print "<label><
1160: 62 3e 7b 24 68 28 24 6e 61 6d 65 29 7d 3c 2f 62  b>{$h($name)}</b
1170: 3e 3c 62 72 3e 5c 6e 22 3b 0a 20 20 20 20 20 20  ><br>\n";.      
1180: 20 20 20 20 20 20 73 77 69 74 63 68 20 28 24 6f        switch ($o
1190: 70 74 5b 22 74 79 70 65 22 5d 29 20 7b 0a 20 20  pt["type"]) {.  
11a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 61                ca
11b0: 73 65 20 22 6c 6f 6e 67 22 3a 0a 20 20 20 20 20  se "long":.     
11c0: 20 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20             case 
11d0: 22 74 65 78 74 22 3a 0a 20 20 20 20 20 20 20 20  "text":.        
11e0: 20 20 20 20 20 20 20 20 20 20 20 20 70 72 69 6e              prin
11f0: 74 20 22 3c 74 65 78 74 61 72 65 61 20 6e 61 6d  t "<textarea nam
1200: 65 3d 7b 24 68 28 24 6e 61 6d 65 29 7d 20 72 6f  e={$h($name)} ro
1210: 77 73 3d 34 20 63 6f 6c 73 3d 37 30 3e 7b 24 68  ws=4 cols=70>{$h
1220: 28 24 76 61 6c 75 65 29 7d 3c 2f 74 65 78 74 61  ($value)}</texta
1230: 72 65 61 3e 22 3b 0a 20 20 20 20 20 20 20 20 20  rea>";.         
1240: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
1250: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1260: 20 20 63 61 73 65 20 22 63 68 6f 6f 73 65 22 3a    case "choose":
1270: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1280: 20 63 61 73 65 20 22 73 65 6c 65 63 74 22 3a 0a   case "select":.
1290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12a0: 20 20 20 20 70 72 69 6e 74 20 22 3c 73 65 6c 65      print "<sele
12b0: 63 74 20 6e 61 6d 65 3d 7b 24 68 28 24 6e 61 6d  ct name={$h($nam
12c0: 65 29 7d 3e 5c 6e 22 3b 0a 20 20 20 20 20 20 20  e)}>\n";.       
12d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 24 6f 70               $op
12e0: 74 73 20 3d 20 70 72 65 67 5f 73 70 6c 69 74 28  ts = preg_split(
12f0: 22 7e 5b 7c 3b 2c 5d 7e 22 2c 20 24 6f 70 74 5b  "~[|;,]~", $opt[
1300: 22 73 65 6c 65 63 74 22 5d 29 3b 0a 20 20 20 20  "select"]);.    
1310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1320: 69 66 20 28 21 69 6e 5f 61 72 72 61 79 28 24 76  if (!in_array($v
1330: 61 6c 75 65 2c 20 24 6f 70 74 73 29 29 20 7b 0a  alue, $opts)) {.
1340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1350: 20 20 20 20 20 20 20 20 24 6f 70 74 73 5b 2d 31          $opts[-1
1360: 5d 20 3d 20 24 76 61 6c 75 65 3b 0a 20 20 20 20  ] = $value;.    
1370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1380: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
1390: 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 28 24        foreach ($
13a0: 6f 70 74 73 20 61 73 20 24 6f 29 20 7b 0a 20 20  opts as $o) {.  
13b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c0: 20 20 20 20 20 20 24 73 65 6c 65 63 74 65 64 20        $selected 
13d0: 3d 20 24 6f 20 3d 3d 20 24 76 61 6c 75 65 20 3f  = $o == $value ?
13e0: 20 22 20 73 65 6c 65 63 74 65 64 22 20 3a 20 22   " selected" : "
13f0: 22 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ";.             
1400: 20 20 20 20 20 20 20 20 20 20 20 70 72 69 6e 74             print
1410: 20 22 3c 6f 70 74 69 6f 6e 20 76 61 6c 75 65 3d   "<option value=
1420: 5c 22 7b 24 68 28 24 6f 29 7d 5c 22 24 73 65 6c  \"{$h($o)}\"$sel
1430: 65 63 74 65 64 3e 7b 24 68 28 24 6f 29 7d 3c 2f  ected>{$h($o)}</
1440: 6f 70 74 69 6f 6e 3e 5c 6e 22 3b 0a 20 20 20 20  option>\n";.    
1450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1460: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
1470: 20 20 20 20 20 20 70 72 69 6e 74 20 22 3c 2f 73        print "</s
1480: 65 6c 65 63 74 3e 22 3b 0a 20 20 20 20 20 20 20  elect>";.       
1490: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
14a0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
14b0: 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20      default:.   
14c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d0: 20 70 72 69 6e 74 20 22 3c 69 6e 70 75 74 20 74   print "<input t
14e0: 79 70 65 3d 5c 22 24 6f 70 74 5b 74 79 70 65 5d  ype=\"$opt[type]
14f0: 5c 22 20 6e 61 6d 65 3d 7b 24 68 28 24 6e 61 6d  \" name={$h($nam
1500: 65 29 7d 20 76 61 6c 75 65 3d 5c 22 7b 24 68 28  e)} value=\"{$h(
1510: 24 76 61 6c 75 65 29 7d 5c 22 20 73 69 7a 65 3d  $value)}\" size=
1520: 36 30 3e 22 3b 0a 20 20 20 20 20 20 20 20 20 20  60>";.          
1530: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
1540: 70 72 69 6e 74 20 22 3c 62 72 3e 5c 6e 3c 73 6d  print "<br>\n<sm
1550: 61 6c 6c 3e 7b 24 68 28 24 6f 70 74 5b 27 64 65  all>{$h($opt['de
1560: 73 63 72 69 70 74 69 6f 6e 27 5d 29 7d 3c 2f 73  scription'])}</s
1570: 6d 61 6c 6c 3e 3c 2f 6c 61 62 65 6c 3e 5c 6e 5c  mall></label>\n\
1580: 6e 22 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  n";.        }.  
1590: 20 20 7d 0a 7d 0a 3f 3e 3c 2f 64 69 76 3e          }.}.?></div>