0000: 2f 2a 0a 2a 2a 20 43 6f 70 79 72 69 67 68 74 20 /*.** Copyright
0010: 28 63 29 20 32 30 30 36 2c 32 30 30 37 20 44 2e (c) 2006,2007 D.
0020: 20 52 69 63 68 61 72 64 20 48 69 70 70 0a 2a 2a Richard Hipp.**
0030: 0a 2a 2a 20 54 68 69 73 20 70 72 6f 67 72 61 6d .** This program
0040: 20 69 73 20 66 72 65 65 20 73 6f 66 74 77 61 72 is free softwar
0050: 65 3b 20 79 6f 75 20 63 61 6e 20 72 65 64 69 73 e; you can redis
0060: 74 72 69 62 75 74 65 20 69 74 20 61 6e 64 2f 6f tribute it and/o
0070: 72 0a 2a 2a 20 6d 6f 64 69 66 79 20 69 74 20 75 r.** modify it u
0080: 6e 64 65 72 20 74 68 65 20 74 65 72 6d 73 20 6f nder the terms o
0090: 66 20 74 68 65 20 53 69 6d 70 6c 69 66 69 65 64 f the Simplified
00a0: 20 42 53 44 20 4c 69 63 65 6e 73 65 20 28 61 6c BSD License (al
00b0: 73 6f 0a 2a 2a 20 6b 6e 6f 77 6e 20 61 73 20 74 so.** known as t
00c0: 68 65 20 22 32 2d 43 6c 61 75 73 65 20 4c 69 63 he "2-Clause Lic
00d0: 65 6e 73 65 22 20 6f 72 20 22 46 72 65 65 42 53 ense" or "FreeBS
00e0: 44 20 4c 69 63 65 6e 73 65 22 2e 29 0a 0a 2a 2a D License".)..**
00f0: 20 54 68 69 73 20 70 72 6f 67 72 61 6d 20 69 73 This program is
0100: 20 64 69 73 74 72 69 62 75 74 65 64 20 69 6e 20 distributed in
0110: 74 68 65 20 68 6f 70 65 20 74 68 61 74 20 69 74 the hope that it
0120: 20 77 69 6c 6c 20 62 65 20 75 73 65 66 75 6c 2c will be useful,
0130: 0a 2a 2a 20 62 75 74 20 77 69 74 68 6f 75 74 20 .** but without
0140: 61 6e 79 20 77 61 72 72 61 6e 74 79 3b 20 77 69 any warranty; wi
0150: 74 68 6f 75 74 20 65 76 65 6e 20 74 68 65 20 69 thout even the i
0160: 6d 70 6c 69 65 64 20 77 61 72 72 61 6e 74 79 20 mplied warranty
0170: 6f 66 0a 2a 2a 20 6d 65 72 63 68 61 6e 74 61 62 of.** merchantab
0180: 69 6c 69 74 79 20 6f 72 20 66 69 74 6e 65 73 73 ility or fitness
0190: 20 66 6f 72 20 61 20 70 61 72 74 69 63 75 6c 61 for a particula
01a0: 72 20 70 75 72 70 6f 73 65 2e 0a 2a 2a 0a 2a 2a r purpose..**.**
01b0: 20 41 75 74 68 6f 72 20 63 6f 6e 74 61 63 74 20 Author contact
01c0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 3a 0a 2a 2a 20 information:.**
01d0: 20 20 64 72 68 40 68 77 61 63 69 2e 63 6f 6d 0a drh@hwaci.com.
01e0: 2a 2a 20 20 20 68 74 74 70 3a 2f 2f 77 77 77 2e ** http://www.
01f0: 68 77 61 63 69 2e 63 6f 6d 2f 64 72 68 2f 0a 2a hwaci.com/drh/.*
0200: 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a *.**************
0210: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0220: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0230: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0240: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0250: 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c *.**.** This fil
0260: 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65 20 e contains code
0270: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 to implement the
0280: 20 62 61 73 69 63 20 77 65 62 20 70 61 67 65 20 basic web page
0290: 6c 6f 6f 6b 20 61 6e 64 20 66 65 65 6c 2e 0a 2a look and feel..*
02a0: 2a 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 56 *.*/.#include "V
02b0: 45 52 53 49 4f 4e 2e 68 22 0a 23 69 6e 63 6c 75 ERSION.h".#inclu
02c0: 64 65 20 22 63 6f 6e 66 69 67 2e 68 22 0a 23 69 de "config.h".#i
02d0: 6e 63 6c 75 64 65 20 22 73 74 79 6c 65 2e 68 22 nclude "style.h"
02e0: 0a 0a 2f 2a 0a 2a 2a 20 45 6c 65 6d 65 6e 74 73 ../*.** Elements
02f0: 20 6f 66 20 74 68 65 20 73 75 62 6d 65 6e 75 20 of the submenu
0300: 61 72 65 20 63 6f 6c 6c 65 63 74 65 64 20 69 6e are collected in
0310: 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 to the following
0320: 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 61 6e .** structure an
0330: 64 20 64 69 73 70 6c 61 79 65 64 20 62 65 6c 6f d displayed belo
0340: 77 20 74 68 65 20 6d 61 69 6e 20 6d 65 6e 75 2e w the main menu.
0350: 0a 2a 2a 0a 2a 2a 20 50 6f 70 75 6c 61 74 65 20 .**.** Populate
0360: 74 68 65 73 65 20 73 74 72 75 63 74 75 72 65 20 these structure
0370: 77 69 74 68 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a with calls to.**
0380: 0a 2a 2a 20 20 20 20 20 20 73 74 79 6c 65 5f 73 .** style_s
0390: 75 62 6d 65 6e 75 5f 65 6c 65 6d 65 6e 74 28 29 ubmenu_element()
03a0: 0a 2a 2a 20 20 20 20 20 20 73 74 79 6c 65 5f 73 .** style_s
03b0: 75 62 6d 65 6e 75 5f 65 6e 74 72 79 28 29 0a 2a ubmenu_entry().*
03c0: 2a 20 20 20 20 20 20 73 74 79 6c 65 5f 73 75 62 * style_sub
03d0: 6d 65 6e 75 5f 63 68 65 63 6b 62 6f 78 28 29 0a menu_checkbox().
03e0: 2a 2a 20 20 20 20 20 20 73 74 79 6c 65 5f 73 75 ** style_su
03f0: 62 6d 65 6e 75 5f 62 69 6e 61 72 79 28 29 0a 2a bmenu_binary().*
0400: 2a 20 20 20 20 20 20 73 74 79 6c 65 5f 73 75 62 * style_sub
0410: 6d 65 6e 75 5f 6d 75 6c 74 69 63 68 6f 69 63 65 menu_multichoice
0420: 28 29 0a 2a 2a 20 20 20 20 20 20 73 74 79 6c 65 ().** style
0430: 5f 73 75 62 6d 65 6e 75 5f 73 71 6c 28 29 0a 2a _submenu_sql().*
0440: 2a 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 63 61 *.** prior to ca
0450: 6c 6c 69 6e 67 20 73 74 79 6c 65 5f 66 69 6e 69 lling style_fini
0460: 73 68 5f 70 61 67 65 28 29 2e 20 20 54 68 65 20 sh_page(). The
0470: 73 74 79 6c 65 5f 66 69 6e 69 73 68 5f 70 61 67 style_finish_pag
0480: 65 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 77 e() routine.** w
0490: 69 6c 6c 20 67 65 6e 65 72 61 74 65 20 74 68 65 ill generate the
04a0: 20 61 70 70 72 6f 70 72 69 61 74 65 20 48 54 4d appropriate HTM
04b0: 4c 20 74 65 78 74 20 6a 75 73 74 20 62 65 6c 6f L text just belo
04c0: 77 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6d 65 w the main.** me
04d0: 6e 75 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 nu..*/.static st
04e0: 72 75 63 74 20 53 75 62 6d 65 6e 75 20 7b 0a 20 ruct Submenu {.
04f0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 61 const char *zLa
0500: 62 65 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20 42 bel; /* B
0510: 75 74 74 6f 6e 20 6c 61 62 65 6c 20 2a 2f 0a 20 utton label */.
0520: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 69 const char *zLi
0530: 6e 6b 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4a nk; /* J
0540: 75 6d 70 20 74 6f 20 74 68 69 73 20 6c 69 6e 6b ump to this link
0550: 20 77 68 65 6e 20 62 75 74 74 6f 6e 20 69 73 20 when button is
0560: 70 72 65 73 73 65 64 20 2a 2f 0a 7d 20 61 53 75 pressed */.} aSu
0570: 62 6d 65 6e 75 5b 33 30 5d 3b 0a 73 74 61 74 69 bmenu[30];.stati
0580: 63 20 69 6e 74 20 6e 53 75 62 6d 65 6e 75 20 3d c int nSubmenu =
0590: 20 30 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 0; /* Numbe
05a0: 72 20 6f 66 20 62 75 74 74 6f 6e 73 20 2a 2f 0a r of buttons */.
05b0: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 53 75 static struct Su
05c0: 62 6d 65 6e 75 43 74 72 6c 20 7b 0a 20 20 63 6f bmenuCtrl {. co
05d0: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b nst char *zName;
05e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f /* Fo
05f0: 72 6d 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 rm query paramet
0600: 65 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 er */. const ch
0610: 61 72 20 2a 7a 4c 61 62 65 6c 3b 20 20 20 20 20 ar *zLabel;
0620: 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c 2e 20 20 /* Label.
0630: 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 66 6f Might be NULL fo
0640: 72 20 46 46 5f 4d 55 4c 54 49 20 2a 2f 0a 20 20 r FF_MULTI */.
0650: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 65 54 unsigned char eT
0660: 79 70 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 ype; /*
0670: 46 46 5f 45 4e 54 52 59 2c 20 46 46 5f 4d 55 4c FF_ENTRY, FF_MUL
0680: 54 49 2c 20 46 46 5f 43 48 45 43 4b 42 4f 58 20 TI, FF_CHECKBOX
0690: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 */. unsigned ch
06a0: 61 72 20 65 56 69 73 69 62 6c 65 3b 20 20 20 20 ar eVisible;
06b0: 20 20 2f 2a 20 53 54 59 4c 45 5f 4e 4f 52 4d 41 /* STYLE_NORMA
06c0: 4c 20 6f 72 20 53 54 59 4c 45 5f 44 49 53 41 42 L or STYLE_DISAB
06d0: 4c 45 44 20 2a 2f 0a 20 20 73 68 6f 72 74 20 69 LED */. short i
06e0: 6e 74 20 69 53 69 7a 65 3b 20 20 20 20 20 20 20 nt iSize;
06f0: 20 20 20 20 20 20 2f 2a 20 57 69 64 74 68 20 66 /* Width f
0700: 6f 72 20 46 46 5f 45 4e 54 52 59 2e 20 20 43 6f or FF_ENTRY. Co
0710: 75 6e 74 20 66 6f 72 20 46 46 5f 4d 55 4c 54 49 unt for FF_MULTI
0720: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 */. const char
0730: 20 2a 63 6f 6e 73 74 20 2a 61 7a 43 68 6f 69 63 *const *azChoic
0740: 65 3b 20 2f 2a 20 76 61 6c 75 65 2f 64 69 73 70 e; /* value/disp
0750: 6c 61 79 20 70 61 69 72 73 20 66 6f 72 20 46 46 lay pairs for FF
0760: 5f 4d 55 4c 54 49 20 2a 2f 0a 20 20 63 6f 6e 73 _MULTI */. cons
0770: 74 20 63 68 61 72 20 2a 7a 46 61 6c 73 65 3b 20 t char *zFalse;
0780: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 46 5f 42 /* FF_B
0790: 49 4e 41 52 59 20 6c 61 62 65 6c 20 77 68 65 6e INARY label when
07a0: 20 66 61 6c 73 65 20 2a 2f 0a 20 20 63 6f 6e 73 false */. cons
07b0: 74 20 63 68 61 72 20 2a 7a 4a 53 3b 20 20 20 20 t char *zJS;
07c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 61 76 61 /* Java
07d0: 73 63 72 69 70 74 20 74 6f 20 72 75 6e 20 6f 6e script to run on
07e0: 20 74 6f 67 67 6c 65 20 2a 2f 0a 7d 20 61 53 75 toggle */.} aSu
07f0: 62 6d 65 6e 75 43 74 72 6c 5b 32 30 5d 3b 0a 73 bmenuCtrl[20];.s
0800: 74 61 74 69 63 20 69 6e 74 20 6e 53 75 62 6d 65 tatic int nSubme
0810: 6e 75 43 74 72 6c 20 3d 20 30 3b 0a 23 64 65 66 nuCtrl = 0;.#def
0820: 69 6e 65 20 46 46 5f 45 4e 54 52 59 20 20 20 20 ine FF_ENTRY
0830: 31 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 1 /* Te
0840: 78 74 20 65 6e 74 72 79 20 62 6f 78 20 2a 2f 0a xt entry box */.
0850: 23 64 65 66 69 6e 65 20 46 46 5f 4d 55 4c 54 49 #define FF_MULTI
0860: 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20 2f 2 /
0870: 2a 20 43 6f 6d 62 6f 62 6f 78 2e 20 20 4d 75 6c * Combobox. Mul
0880: 74 69 70 6c 65 20 63 68 6f 69 63 65 73 2e 20 2a tiple choices. *
0890: 2f 0a 23 64 65 66 69 6e 65 20 46 46 5f 42 49 4e /.#define FF_BIN
08a0: 41 52 59 20 20 20 33 20 20 20 20 20 20 20 20 20 ARY 3
08b0: 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 66 6f 72 20 /* Control for
08c0: 62 69 6e 61 72 79 20 71 75 65 72 79 20 70 61 72 binary query par
08d0: 61 6d 65 74 65 72 20 2a 2f 0a 23 64 65 66 69 6e ameter */.#defin
08e0: 65 20 46 46 5f 43 48 45 43 4b 42 4f 58 20 34 20 e FF_CHECKBOX 4
08f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 /* Chec
0900: 6b 2d 62 6f 78 20 2a 2f 0a 0a 23 69 66 20 49 4e k-box */..#if IN
0910: 54 45 52 46 41 43 45 0a 23 64 65 66 69 6e 65 20 TERFACE.#define
0920: 53 54 59 4c 45 5f 4e 4f 52 4d 41 4c 20 20 20 30 STYLE_NORMAL 0
0930: 20 20 20 20 20 20 20 2f 2a 20 4e 6f 72 6d 61 6c /* Normal
0940: 20 64 69 73 70 6c 61 79 20 6f 66 20 63 6f 6e 74 display of cont
0950: 72 6f 6c 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53 rol */.#define S
0960: 54 59 4c 45 5f 44 49 53 41 42 4c 45 44 20 31 20 TYLE_DISABLED 1
0970: 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c /* Control
0980: 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a is disabled */.
0990: 23 65 6e 64 69 66 20 2f 2a 20 49 4e 54 45 52 46 #endif /* INTERF
09a0: 41 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 ACE */../*.** Re
09b0: 6d 65 6d 62 65 72 20 74 68 61 74 20 74 68 65 20 member that the
09c0: 68 65 61 64 65 72 20 68 61 73 20 62 65 65 6e 20 header has been
09d0: 67 65 6e 65 72 61 74 65 64 2e 20 20 54 68 65 20 generated. The
09e0: 66 6f 6f 74 65 72 20 69 73 20 6f 6d 69 74 74 65 footer is omitte
09f0: 64 0a 2a 2a 20 69 66 20 61 6e 20 65 72 72 6f 72 d.** if an error
0a00: 20 6f 63 63 75 72 73 20 62 65 66 6f 72 65 20 74 occurs before t
0a10: 68 65 20 68 65 61 64 65 72 2e 0a 2a 2f 0a 73 74 he header..*/.st
0a20: 61 74 69 63 20 69 6e 74 20 68 65 61 64 65 72 48 atic int headerH
0a30: 61 73 42 65 65 6e 47 65 6e 65 72 61 74 65 64 20 asBeenGenerated
0a40: 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 72 65 6d 65 = 0;../*.** reme
0a50: 6d 62 65 72 2c 20 69 66 20 61 20 73 69 64 65 62 mber, if a sideb
0a60: 6f 78 20 77 61 73 20 75 73 65 64 0a 2a 2f 0a 73 ox was used.*/.s
0a70: 74 61 74 69 63 20 69 6e 74 20 73 69 64 65 62 6f tatic int sidebo
0a80: 78 55 73 65 64 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a xUsed = 0;../*.*
0a90: 2a 20 41 64 2d 75 6e 69 74 20 73 74 79 6c 65 73 * Ad-unit styles
0aa0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 6e 73 69 ..*/.static unsi
0ab0: 67 6e 65 64 20 61 64 55 6e 69 74 46 6c 61 67 73 gned adUnitFlags
0ac0: 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 53 75 62 = 0;../*.** Sub
0ad0: 6d 65 6e 75 20 64 69 73 61 62 6c 65 20 66 6c 61 menu disable fla
0ae0: 67 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 g.*/.static int
0af0: 73 75 62 6d 65 6e 75 45 6e 61 62 6c 65 20 3d 20 submenuEnable =
0b00: 31 3b 0a 0a 2f 2a 0a 2a 2a 20 46 6c 61 67 73 20 1;../*.** Flags
0b10: 66 6f 72 20 76 61 72 69 6f 75 73 20 6a 61 76 61 for various java
0b20: 73 63 72 69 70 74 20 66 69 6c 65 73 20 6e 65 65 script files nee
0b30: 64 65 64 20 70 72 69 6f 72 20 74 6f 20 3c 2f 62 ded prior to </b
0b40: 6f 64 79 3e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 ody>.*/.static i
0b50: 6e 74 20 6e 65 65 64 48 72 65 66 4a 73 20 3d 20 nt needHrefJs =
0b60: 30 3b 20 20 20 20 20 20 2f 2a 20 68 72 65 66 2e 0; /* href.
0b70: 6a 73 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 js */../*.** Ext
0b80: 72 61 20 4a 53 20 61 64 64 65 64 20 74 6f 20 74 ra JS added to t
0b90: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 he end of the fi
0ba0: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42 6c le..*/.static Bl
0bb0: 6f 62 20 62 6c 6f 62 4f 6e 4c 6f 61 64 20 3d 20 ob blobOnLoad =
0bc0: 42 4c 4f 42 5f 49 4e 49 54 49 41 4c 49 5a 45 52 BLOB_INITIALIZER
0bd0: 3b 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 ;../*.** Generat
0be0: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 6e 20 e and return an
0bf0: 61 6e 63 68 6f 72 20 74 61 67 20 6c 69 6b 65 20 anchor tag like
0c00: 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 this:.**.**
0c10: 20 20 20 3c 61 20 68 72 65 66 3d 22 55 52 4c 22 <a href="URL"
0c20: 3e 0a 2a 2a 20 20 6f 72 20 20 20 20 3c 61 20 69 >.** or <a i
0c30: 64 3d 22 49 44 22 3e 0a 2a 2a 0a 2a 2a 20 54 68 d="ID">.**.** Th
0c40: 65 20 66 6f 72 6d 20 6f 66 20 74 68 65 20 61 6e e form of the an
0c50: 63 68 6f 72 20 74 61 67 20 69 73 20 64 65 74 65 chor tag is dete
0c60: 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 67 2e rmined by the g.
0c70: 6a 73 48 72 65 66 0a 2a 2a 20 61 6e 64 20 67 2e jsHref.** and g.
0c80: 70 65 72 6d 2e 48 79 70 65 72 6c 69 6e 6b 20 76 perm.Hyperlink v
0c90: 61 72 69 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 ariables..**.**
0ca0: 20 20 67 2e 70 65 72 6d 2e 48 79 70 65 72 6c 69 g.perm.Hyperli
0cb0: 6e 6b 20 20 67 2e 6a 73 48 72 65 66 20 20 20 20 nk g.jsHref
0cc0: 20 20 20 20 52 65 74 75 72 6e 65 64 20 61 6e 63 Returned anc
0cd0: 68 6f 72 20 66 6f 72 6d 61 74 0a 2a 2a 20 20 20 hor format.**
0ce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0cf0: 20 20 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 20 --------
0d00: 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d --------------
0d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 ----------.**
0d20: 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20 0
0d30: 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 0
0d40: 20 20 20 20 28 65 6d 70 74 79 20 73 74 72 69 6e (empty strin
0d50: 67 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 30 g).** 0
0d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 31 20 20 1
0d70: 20 20 20 20 20 20 20 20 20 20 20 20 28 65 6d 70 (emp
0d80: 74 79 20 73 74 72 69 6e 67 29 0a 2a 2a 20 20 20 ty string).**
0d90: 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20 1
0da0: 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 0
0db0: 20 20 20 20 3c 61 20 68 72 65 66 3d 22 55 52 4c <a href="URL
0dc0: 22 3e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 31 ">.** 1
0dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 31 20 20 1
0de0: 20 20 20 20 20 20 20 20 20 20 20 20 3c 61 20 64 <a d
0df0: 61 74 61 2d 68 72 65 66 3d 22 55 52 4c 22 3e 0a ata-href="URL">.
0e00: 2a 2a 0a 2a 2a 20 4e 6f 20 61 6e 63 68 6f 72 20 **.** No anchor
0e10: 74 61 67 20 69 73 20 67 65 6e 65 72 61 74 65 64 tag is generated
0e20: 20 69 66 20 67 2e 70 65 72 6d 2e 48 79 70 65 72 if g.perm.Hyper
0e30: 6c 69 6e 6b 20 69 73 20 66 61 6c 73 65 2e 0a 2a link is false..*
0e40: 2a 20 54 68 65 20 68 72 65 66 3d 22 55 52 4c 22 * The href="URL"
0e50: 20 66 6f 72 6d 20 69 73 20 75 73 65 64 20 69 66 form is used if
0e60: 20 67 2e 6a 73 48 72 65 66 20 69 73 20 66 61 6c g.jsHref is fal
0e70: 73 65 2e 0a 2a 2a 20 49 66 20 67 2e 6a 73 48 72 se..** If g.jsHr
0e80: 65 66 20 69 73 20 74 72 75 65 20 74 68 65 6e 20 ef is true then
0e90: 74 68 65 20 64 61 74 61 2d 68 72 65 66 3d 22 55 the data-href="U
0ea0: 52 4c 22 20 61 6e 64 0a 2a 2a 20 68 72 65 66 3d RL" and.** href=
0eb0: 22 2f 68 6f 6e 65 79 70 6f 74 22 20 69 73 20 67 "/honeypot" is g
0ec0: 65 6e 65 72 61 74 65 64 20 61 6e 64 20 6a 61 76 enerated and jav
0ed0: 61 73 63 72 69 70 74 20 69 73 20 61 64 64 65 64 ascript is added
0ee0: 20 74 6f 20 74 68 65 20 66 6f 6f 74 65 72 0a 2a to the footer.*
0ef0: 2a 20 74 6f 20 63 61 75 73 65 20 64 61 74 61 2d * to cause data-
0f00: 68 72 65 66 20 76 61 6c 75 65 73 20 74 6f 20 62 href values to b
0f10: 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 e inserted into
0f20: 68 72 65 66 0a 2a 2a 20 61 66 74 65 72 20 74 68 href.** after th
0f30: 65 20 70 61 67 65 20 68 61 73 20 6c 6f 61 64 65 e page has loade
0f40: 64 2e 20 54 68 65 20 75 73 65 20 6f 66 20 74 68 d. The use of th
0f50: 65 20 64 61 74 61 2d 68 72 65 66 3d 22 55 52 4c e data-href="URL
0f60: 22 20 66 6f 72 6d 0a 2a 2a 20 69 6e 73 74 65 61 " form.** instea
0f70: 64 20 6f 66 20 68 72 65 66 3d 22 55 52 4c 22 20 d of href="URL"
0f80: 69 73 20 61 20 64 65 66 65 6e 73 65 20 61 67 61 is a defense aga
0f90: 69 6e 73 74 20 62 6f 74 73 2e 0a 2a 2a 0a 2a 2a inst bots..**.**
0fa0: 20 49 66 20 74 68 65 20 75 73 65 72 20 6c 61 63 If the user lac
0fb0: 6b 73 20 74 68 65 20 48 79 70 65 72 6c 69 6e 6b ks the Hyperlink
0fc0: 20 28 68 29 20 70 72 6f 70 65 72 74 79 20 61 6e (h) property an
0fd0: 64 20 74 68 65 20 22 61 75 74 6f 2d 68 79 70 65 d the "auto-hype
0fe0: 72 6c 69 6e 6b 22 0a 2a 2a 20 73 65 74 74 69 6e rlink".** settin
0ff0: 67 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 g is true, then
1000: 67 2e 70 65 72 6d 2e 48 79 70 65 72 6c 69 6e 6b g.perm.Hyperlink
1010: 20 69 73 20 63 68 61 6e 67 65 64 20 66 72 6f 6d is changed from
1020: 20 30 20 74 6f 20 31 20 61 6e 64 0a 2a 2a 20 67 0 to 1 and.** g
1030: 2e 6a 73 48 72 65 66 20 69 73 20 73 65 74 20 74 .jsHref is set t
1040: 6f 20 31 20 62 79 20 6c 6f 67 69 6e 5f 63 68 65 o 1 by login_che
1050: 63 6b 5f 63 72 65 64 65 6e 74 69 61 6c 73 28 29 ck_credentials()
1060: 2e 20 20 54 68 75 73 0a 2a 2a 20 74 68 65 20 67 . Thus.** the g
1070: 2e 70 65 72 6d 2e 48 79 70 65 72 6c 69 6e 6b 20 .perm.Hyperlink
1080: 70 72 6f 70 65 72 74 79 20 77 69 6c 6c 20 62 65 property will be
1090: 20 74 72 75 65 20 65 76 65 6e 20 69 66 20 74 68 true even if th
10a0: 65 20 75 73 65 72 20 64 6f 65 73 20 6e 6f 74 0a e user does not.
10b0: 2a 2a 20 68 61 76 65 20 74 68 65 20 22 68 22 20 ** have the "h"
10c0: 70 72 69 76 69 6c 65 67 65 20 69 66 20 74 68 65 privilege if the
10d0: 20 22 61 75 74 6f 2d 68 79 70 65 72 6c 69 6e 6b "auto-hyperlink
10e0: 22 20 73 65 74 74 69 6e 67 20 69 73 20 74 72 75 " setting is tru
10f0: 65 2e 0a 2a 2a 0a 2a 2a 20 20 55 73 65 72 20 68 e..**.** User h
1100: 61 73 20 22 68 22 20 20 61 75 74 6f 2d 68 79 70 as "h" auto-hyp
1110: 65 72 6c 69 6e 6b 20 20 20 20 20 20 67 2e 70 65 erlink g.pe
1120: 72 6d 2e 48 79 70 65 72 6c 69 6e 6b 20 20 67 2e rm.Hyperlink g.
1130: 6a 73 48 72 65 66 0a 2a 2a 20 20 2d 2d 2d 2d 2d jsHref.** -----
1140: 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d ------- -------
1150: 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 20 2d 2d 2d ------- ---
1160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d ------------- -
1170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1180: 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 20 20 20 30 ----.** 0
1190: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20 0
11a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
11b0: 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 0
11c0: 20 20 20 20 20 20 20 30 0a 2a 2a 20 20 20 20 20 0.**
11d0: 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20 1
11e0: 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0
11f0: 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20 1
1200: 20 20 20 20 20 20 20 20 20 20 20 30 0a 2a 2a 20 0.**
1210: 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20 0
1220: 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20 1
1230: 20 20 20 20 20 20 20 20 20 20 31 20 20 20 20 20 1
1240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 1
1250: 0a 2a 2a 20 20 20 20 20 20 20 20 31 20 20 20 20 .** 1
1260: 20 20 20 20 20 20 20 20 20 31 20 20 20 20 20 20 1
1270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 20 1
1280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1290: 20 20 20 30 0a 2a 2a 0a 2a 2a 20 53 6f 2c 20 69 0.**.** So, i
12a0: 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74 n other words, t
12b0: 72 61 63 69 6e 67 20 69 6e 70 75 74 20 63 6f 6e racing input con
12c0: 66 69 67 75 72 61 74 69 6f 6e 20 74 6f 20 66 69 figuration to fi
12d0: 6e 61 6c 20 61 63 74 69 6f 6e 73 20 77 65 20 68 nal actions we h
12e0: 61 76 65 3a 0a 2a 2a 0a 2a 2a 20 20 55 73 65 72 ave:.**.** User
12f0: 20 68 61 73 20 22 68 22 20 20 61 75 74 6f 2d 68 has "h" auto-h
1300: 79 70 65 72 6c 69 6e 6b 20 20 20 20 20 20 52 65 yperlink Re
1310: 74 75 72 6e 65 64 20 61 6e 63 68 6f 72 20 66 6f turned anchor fo
1320: 72 6d 61 74 0a 2a 2a 20 20 2d 2d 2d 2d 2d 2d 2d rmat.** -------
1330: 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d ----- ---------
1340: 2d 2d 2d 2d 2d 20 20 20 20 20 20 2d 2d 2d 2d 2d ----- -----
1350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1360: 2d 0a 2a 2a 20 20 20 20 20 20 20 20 30 20 20 20 -.** 0
1370: 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20 0
1380: 20 20 20 20 20 20 20 20 28 65 6d 70 74 79 20 73 (empty s
1390: 74 72 69 6e 67 29 0a 2a 2a 20 20 20 20 20 20 20 tring).**
13a0: 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20 30 1 0
13b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 3c 61 20 <a
13c0: 68 72 65 66 3d 22 55 52 4c 22 3e 0a 2a 2a 20 20 href="URL">.**
13d0: 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20 0
13e0: 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20 1
13f0: 20 20 3c 61 20 64 61 74 61 2d 68 72 65 66 3d 22 <a data-href="
1400: 55 52 4c 22 3e 0a 2a 2a 20 20 20 20 20 20 20 20 URL">.**
1410: 31 20 20 20 20 20 20 20 20 20 20 20 20 20 31 20 1 1
1420: 20 20 20 20 20 20 20 20 20 20 20 20 3c 61 20 68 <a h
1430: 72 65 66 3d 22 55 52 4c 22 3e 0a 2a 2a 0a 2a 2a ref="URL">.**.**
1440: 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 The name of the
1450: 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 se routines are
1460: 64 65 6c 69 62 65 72 61 74 65 6c 79 20 6b 65 70 deliberately kep
1470: 74 20 73 68 6f 72 74 20 73 6f 20 74 68 61 74 20 t short so that
1480: 63 61 6e 20 62 65 0a 2a 2a 20 65 61 73 69 6c 79 can be.** easily
1490: 20 75 73 65 64 20 77 69 74 68 69 6e 20 40 2d 6c used within @-l
14a0: 69 6e 65 73 2e 20 20 45 78 61 6d 70 6c 65 3a 0a ines. Example:.
14b0: 2a 2a 0a 2a 2a 20 20 20 20 20 20 40 20 25 7a 28 **.** @ %z(
14c0: 68 72 65 66 28 22 25 52 2f 61 72 74 69 66 61 63 href("%R/artifac
14d0: 74 2f 25 73 22 2c 7a 55 75 69 64 29 29 25 68 28 t/%s",zUuid))%h(
14e0: 7a 46 4e 29 3c 2f 61 3e 0a 2a 2a 0a 2a 2a 20 4e zFN)</a>.**.** N
14f0: 6f 74 65 20 25 7a 20 66 6f 72 6d 61 74 2e 20 20 ote %z format.
1500: 54 68 65 20 73 74 72 69 6e 67 20 72 65 74 75 72 The string retur
1510: 6e 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 ned by this func
1520: 74 69 6f 6e 20 69 73 20 61 6c 77 61 79 73 0a 2a tion is always.*
1530: 2a 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 * obtained from
1540: 66 6f 73 73 69 6c 5f 6d 61 6c 6c 6f 63 28 29 20 fossil_malloc()
1550: 73 6f 20 72 65 6e 64 65 72 69 6e 67 20 69 74 20 so rendering it
1560: 77 69 74 68 20 25 7a 20 77 69 6c 6c 20 72 65 63 with %z will rec
1570: 6c 61 69 6d 0a 2a 2a 20 74 68 61 74 20 6d 65 6d laim.** that mem
1580: 6f 72 79 20 73 70 61 63 65 2e 0a 2a 2a 0a 2a 2a ory space..**.**
1590: 20 54 68 65 72 65 20 61 72 65 20 74 68 72 65 65 There are three
15a0: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 69 versions of thi
15b0: 73 20 72 6f 75 74 69 6e 65 3a 0a 2a 2a 0a 2a 2a s routine:.**.**
15c0: 20 20 20 20 28 31 29 20 20 20 68 72 65 66 28 29 (1) href()
15d0: 20 64 6f 65 73 20 61 20 70 6c 61 69 6e 20 68 79 does a plain hy
15e0: 70 65 72 6c 69 6e 6b 0a 2a 2a 20 20 20 20 28 32 perlink.** (2
15f0: 29 20 20 20 78 68 72 65 66 28 29 20 61 64 64 73 ) xhref() adds
1600: 20 65 78 74 72 61 20 61 74 74 72 69 62 75 74 65 extra attribute
1610: 20 74 65 78 74 0a 2a 2a 20 20 20 20 28 33 29 20 text.** (3)
1620: 20 20 63 68 72 65 66 28 29 20 61 64 64 73 20 61 chref() adds a
1630: 20 63 6c 61 73 73 20 6e 61 6d 65 0a 2a 2a 0a 2a class name.**.*
1640: 2a 20 67 2e 70 65 72 6d 2e 48 79 70 65 72 6c 69 * g.perm.Hyperli
1650: 6e 6b 20 69 73 20 74 72 75 65 20 69 66 20 74 68 nk is true if th
1660: 65 20 75 73 65 72 20 68 61 73 20 74 68 65 20 48 e user has the H
1670: 79 70 65 72 6c 69 6e 6b 20 28 68 29 20 70 72 6f yperlink (h) pro
1680: 70 65 72 74 79 2e 0a 2a 2a 20 4d 6f 73 74 20 6c perty..** Most l
1690: 6f 67 67 65 64 20 69 6e 20 75 73 65 72 73 20 73 ogged in users s
16a0: 68 6f 75 6c 64 20 68 61 76 65 20 74 68 69 73 20 hould have this
16b0: 70 72 6f 70 65 72 74 79 2c 20 73 69 6e 63 65 20 property, since
16c0: 77 65 20 63 61 6e 20 61 73 73 75 6d 65 0a 2a 2a we can assume.**
16d0: 20 74 68 61 74 20 61 20 6c 6f 67 67 65 64 20 69 that a logged i
16e0: 6e 20 75 73 65 72 20 69 73 20 6e 6f 74 20 61 20 n user is not a
16f0: 62 6f 74 2e 20 20 4f 6e 6c 79 20 22 6e 6f 62 6f bot. Only "nobo
1700: 64 79 22 20 6c 61 63 6b 73 20 67 2e 70 65 72 6d dy" lacks g.perm
1710: 2e 48 79 70 65 72 6c 69 6e 6b 2c 0a 2a 2a 20 74 .Hyperlink,.** t
1720: 79 70 69 63 61 6c 6c 79 2e 0a 2a 2f 0a 63 68 61 ypically..*/.cha
1730: 72 20 2a 78 68 72 65 66 28 63 6f 6e 73 74 20 63 r *xhref(const c
1740: 68 61 72 20 2a 7a 45 78 74 72 61 2c 20 63 6f 6e har *zExtra, con
1750: 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 st char *zFormat
1760: 2c 20 2e 2e 2e 29 7b 0a 20 20 63 68 61 72 20 2a , ...){. char *
1770: 7a 55 72 6c 3b 0a 20 20 76 61 5f 6c 69 73 74 20 zUrl;. va_list
1780: 61 70 3b 0a 20 20 69 66 28 20 21 67 2e 70 65 72 ap;. if( !g.per
1790: 6d 2e 48 79 70 65 72 6c 69 6e 6b 20 29 20 72 65 m.Hyperlink ) re
17a0: 74 75 72 6e 20 66 6f 73 73 69 6c 5f 73 74 72 64 turn fossil_strd
17b0: 75 70 28 22 22 29 3b 0a 20 20 76 61 5f 73 74 61 up("");. va_sta
17c0: 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b rt(ap, zFormat);
17d0: 0a 20 20 7a 55 72 6c 20 3d 20 76 6d 70 72 69 6e . zUrl = vmprin
17e0: 74 66 28 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b tf(zFormat, ap);
17f0: 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 . va_end(ap);.
1800: 20 69 66 28 20 21 67 2e 6a 73 48 72 65 66 20 29 if( !g.jsHref )
1810: 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 48 55 72 {. char *zHUr
1820: 6c 3b 0a 20 20 20 20 69 66 28 20 7a 45 78 74 72 l;. if( zExtr
1830: 61 20 29 7b 0a 20 20 20 20 20 20 7a 48 55 72 6c a ){. zHUrl
1840: 20 3d 20 6d 70 72 69 6e 74 66 28 22 3c 61 20 25 = mprintf("<a %
1850: 73 20 68 72 65 66 3d 5c 22 25 68 5c 22 3e 22 2c s href=\"%h\">",
1860: 20 7a 45 78 74 72 61 2c 20 7a 55 72 6c 29 3b 0a zExtra, zUrl);.
1870: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 }else{.
1880: 20 7a 48 55 72 6c 20 3d 20 6d 70 72 69 6e 74 66 zHUrl = mprintf
1890: 28 22 3c 61 20 68 72 65 66 3d 5c 22 25 68 5c 22 ("<a href=\"%h\"
18a0: 3e 22 2c 20 7a 55 72 6c 29 3b 0a 20 20 20 20 7d >", zUrl);. }
18b0: 0a 20 20 20 20 66 6f 73 73 69 6c 5f 66 72 65 65 . fossil_free
18c0: 28 7a 55 72 6c 29 3b 0a 20 20 20 20 72 65 74 75 (zUrl);. retu
18d0: 72 6e 20 7a 48 55 72 6c 3b 0a 20 20 7d 0a 20 20 rn zHUrl;. }.
18e0: 6e 65 65 64 48 72 65 66 4a 73 20 3d 20 31 3b 0a needHrefJs = 1;.
18f0: 20 20 69 66 28 20 7a 45 78 74 72 61 3d 3d 30 20 if( zExtra==0
1900: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 70 ){. return mp
1910: 72 69 6e 74 66 28 22 3c 61 20 64 61 74 61 2d 68 rintf("<a data-h
1920: 72 65 66 3d 27 25 7a 27 20 68 72 65 66 3d 27 25 ref='%z' href='%
1930: 52 2f 68 6f 6e 65 79 70 6f 74 27 3e 22 2c 20 7a R/honeypot'>", z
1940: 55 72 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 Url);. }else{.
1950: 20 20 20 72 65 74 75 72 6e 20 6d 70 72 69 6e 74 return mprint
1960: 66 28 22 3c 61 20 25 73 20 64 61 74 61 2d 68 72 f("<a %s data-hr
1970: 65 66 3d 27 25 7a 27 20 68 72 65 66 3d 27 25 52 ef='%z' href='%R
1980: 2f 68 6f 6e 65 79 70 6f 74 27 3e 22 2c 0a 20 20 /honeypot'>",.
1990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
19a0: 20 7a 45 78 74 72 61 2c 20 7a 55 72 6c 29 3b 0a zExtra, zUrl);.
19b0: 20 20 7d 0a 7d 0a 63 68 61 72 20 2a 63 68 72 65 }.}.char *chre
19c0: 66 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 f(const char *zE
19d0: 78 74 72 61 2c 20 63 6f 6e 73 74 20 63 68 61 72 xtra, const char
19e0: 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b *zFormat, ...){
19f0: 0a 20 20 63 68 61 72 20 2a 7a 55 72 6c 3b 0a 20 . char *zUrl;.
1a00: 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 va_list ap;. i
1a10: 66 28 20 21 67 2e 70 65 72 6d 2e 48 79 70 65 72 f( !g.perm.Hyper
1a20: 6c 69 6e 6b 20 29 20 72 65 74 75 72 6e 20 66 6f link ) return fo
1a30: 73 73 69 6c 5f 73 74 72 64 75 70 28 22 22 29 3b ssil_strdup("");
1a40: 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 . va_start(ap,
1a50: 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 7a 55 72 6c zFormat);. zUrl
1a60: 20 3d 20 76 6d 70 72 69 6e 74 66 28 7a 46 6f 72 = vmprintf(zFor
1a70: 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 mat, ap);. va_e
1a80: 6e 64 28 61 70 29 3b 0a 20 20 69 66 28 20 21 67 nd(ap);. if( !g
1a90: 2e 6a 73 48 72 65 66 20 29 7b 0a 20 20 20 20 63 .jsHref ){. c
1aa0: 68 61 72 20 2a 7a 48 55 72 6c 20 3d 20 6d 70 72 har *zHUrl = mpr
1ab0: 69 6e 74 66 28 22 3c 61 20 63 6c 61 73 73 3d 5c intf("<a class=\
1ac0: 22 25 73 5c 22 20 68 72 65 66 3d 5c 22 25 68 5c "%s\" href=\"%h\
1ad0: 22 3e 22 2c 20 7a 45 78 74 72 61 2c 20 7a 55 72 ">", zExtra, zUr
1ae0: 6c 29 3b 0a 20 20 20 20 66 6f 73 73 69 6c 5f 66 l);. fossil_f
1af0: 72 65 65 28 7a 55 72 6c 29 3b 0a 20 20 20 20 72 ree(zUrl);. r
1b00: 65 74 75 72 6e 20 7a 48 55 72 6c 3b 0a 20 20 7d eturn zHUrl;. }
1b10: 0a 20 20 6e 65 65 64 48 72 65 66 4a 73 20 3d 20 . needHrefJs =
1b20: 31 3b 0a 20 20 72 65 74 75 72 6e 20 6d 70 72 69 1;. return mpri
1b30: 6e 74 66 28 22 3c 61 20 63 6c 61 73 73 3d 27 25 ntf("<a class='%
1b40: 73 27 20 64 61 74 61 2d 68 72 65 66 3d 27 25 7a s' data-href='%z
1b50: 27 20 68 72 65 66 3d 27 25 52 2f 68 6f 6e 65 79 ' href='%R/honey
1b60: 70 6f 74 27 3e 22 2c 0a 20 20 20 20 20 20 20 20 pot'>",.
1b70: 20 20 20 20 20 20 20 20 20 7a 45 78 74 72 61 2c zExtra,
1b80: 20 7a 55 72 6c 29 3b 0a 7d 0a 63 68 61 72 20 2a zUrl);.}.char *
1b90: 68 72 65 66 28 63 6f 6e 73 74 20 63 68 61 72 20 href(const char
1ba0: 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a *zFormat, ...){.
1bb0: 20 20 63 68 61 72 20 2a 7a 55 72 6c 3b 0a 20 20 char *zUrl;.
1bc0: 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 66 va_list ap;. if
1bd0: 28 20 21 67 2e 70 65 72 6d 2e 48 79 70 65 72 6c ( !g.perm.Hyperl
1be0: 69 6e 6b 20 29 20 72 65 74 75 72 6e 20 66 6f 73 ink ) return fos
1bf0: 73 69 6c 5f 73 74 72 64 75 70 28 22 22 29 3b 0a sil_strdup("");.
1c00: 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a va_start(ap, z
1c10: 46 6f 72 6d 61 74 29 3b 0a 20 20 7a 55 72 6c 20 Format);. zUrl
1c20: 3d 20 76 6d 70 72 69 6e 74 66 28 7a 46 6f 72 6d = vmprintf(zForm
1c30: 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e at, ap);. va_en
1c40: 64 28 61 70 29 3b 0a 20 20 69 66 28 20 21 67 2e d(ap);. if( !g.
1c50: 6a 73 48 72 65 66 20 29 7b 0a 20 20 20 20 63 68 jsHref ){. ch
1c60: 61 72 20 2a 7a 48 55 72 6c 20 3d 20 6d 70 72 69 ar *zHUrl = mpri
1c70: 6e 74 66 28 22 3c 61 20 68 72 65 66 3d 5c 22 25 ntf("<a href=\"%
1c80: 68 5c 22 3e 22 2c 20 7a 55 72 6c 29 3b 0a 20 20 h\">", zUrl);.
1c90: 20 20 66 6f 73 73 69 6c 5f 66 72 65 65 28 7a 55 fossil_free(zU
1ca0: 72 6c 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 rl);. return
1cb0: 7a 48 55 72 6c 3b 0a 20 20 7d 0a 20 20 6e 65 65 zHUrl;. }. nee
1cc0: 64 48 72 65 66 4a 73 20 3d 20 31 3b 0a 20 20 72 dHrefJs = 1;. r
1cd0: 65 74 75 72 6e 20 6d 70 72 69 6e 74 66 28 22 3c eturn mprintf("<
1ce0: 61 20 64 61 74 61 2d 68 72 65 66 3d 27 25 73 27 a data-href='%s'
1cf0: 20 68 72 65 66 3d 27 25 52 2f 68 6f 6e 65 79 70 href='%R/honeyp
1d00: 6f 74 27 3e 22 2c 0a 20 20 20 20 20 20 20 20 20 ot'>",.
1d10: 20 20 20 20 20 20 20 20 20 7a 55 72 6c 29 3b 0a zUrl);.
1d20: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 }../*.** Generat
1d30: 65 20 3c 66 6f 72 6d 20 6d 65 74 68 6f 64 3d 22 e <form method="
1d40: 70 6f 73 74 22 20 61 63 74 69 6f 6e 3d 41 52 47 post" action=ARG
1d50: 3e 2e 20 20 54 68 65 20 41 52 47 20 76 61 6c 75 >. The ARG valu
1d60: 65 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 0a e is determined.
1d70: 2a 2a 20 62 79 20 74 68 65 20 61 72 67 75 6d 65 ** by the argume
1d80: 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 41 73 20 61 20 nts..**.** As a
1d90: 64 65 66 65 6e 73 65 20 61 67 61 69 6e 73 74 20 defense against
1da0: 72 6f 62 6f 74 73 2c 20 74 68 65 20 61 63 74 69 robots, the acti
1db0: 6f 6e 3d 41 52 47 20 6d 69 67 68 74 20 69 6e 73 on=ARG might ins
1dc0: 74 65 61 64 20 62 79 20 64 61 74 61 2d 61 63 74 tead by data-act
1dd0: 69 6f 6e 3d 41 52 47 0a 2a 2a 20 61 6e 64 20 6a ion=ARG.** and j
1de0: 61 76 61 73 63 72 69 70 74 20 28 68 72 65 66 2e avascript (href.
1df0: 6a 73 29 20 61 64 64 65 64 20 74 6f 20 74 68 65 js) added to the
1e00: 20 70 61 67 65 20 73 6f 20 74 68 61 74 20 74 68 page so that th
1e10: 65 20 64 61 74 61 2d 61 63 74 69 6f 6e 3d 20 69 e data-action= i
1e20: 73 0a 2a 2a 20 63 68 61 6e 67 65 64 20 69 6e 74 s.** changed int
1e30: 6f 20 61 63 74 69 6f 6e 3d 20 61 66 74 65 72 20 o action= after
1e40: 74 68 65 20 70 61 67 65 20 6c 6f 61 64 73 2e 20 the page loads.
1e50: 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 Whether or not
1e60: 74 68 69 73 20 68 61 70 70 65 6e 73 0a 2a 2a 20 this happens.**
1e70: 64 65 70 65 6e 64 73 20 6f 6e 20 69 66 20 74 68 depends on if th
1e80: 65 20 75 73 65 72 20 68 61 73 20 74 68 65 20 22 e user has the "
1e90: 68 22 20 70 72 69 76 69 6c 65 67 65 20 61 6e 64 h" privilege and
1ea0: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 whether or not
1eb0: 74 68 65 0a 2a 2a 20 61 75 74 6f 2d 68 79 70 65 the.** auto-hype
1ec0: 72 6c 69 6e 6b 20 73 65 74 74 69 6e 67 20 69 73 rlink setting is
1ed0: 20 6f 6e 2e 20 20 54 68 65 73 65 20 73 65 74 69 on. These seti
1ee0: 6e 67 73 20 64 65 74 65 72 6d 69 6e 65 20 74 68 ngs determine th
1ef0: 65 20 76 61 6c 75 65 73 20 6f 66 0a 2a 2a 20 76 e values of.** v
1f00: 61 72 69 61 62 6c 65 73 20 67 2e 70 65 72 6d 2e ariables g.perm.
1f10: 48 79 70 65 72 6c 69 6e 6b 20 61 6e 64 20 67 2e Hyperlink and g.
1f20: 6a 73 48 72 65 66 2e 0a 2a 2a 0a 2a 2a 20 20 20 jsHref..**.**
1f30: 20 55 73 65 72 20 68 61 73 20 22 68 22 20 20 61 User has "h" a
1f40: 75 74 6f 2d 68 79 70 65 72 6c 69 6e 6b 20 20 20 uto-hyperlink
1f50: 20 20 20 67 2e 70 65 72 6d 2e 48 79 70 65 72 6c g.perm.Hyperl
1f60: 69 6e 6b 20 20 67 2e 6a 73 48 72 65 66 0a 2a 2a ink g.jsHref.**
1f70: 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ------------
1f80: 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d --------------
1f90: 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------
1fa0: 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d ------ --------
1fb0: 0a 2a 2a 20 20 31 3a 20 20 20 20 20 20 30 20 20 .** 1: 0
1fc0: 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20 0
1fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1fe0: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 30 0a 0 0.
1ff0: 2a 2a 20 20 32 3a 20 20 20 20 20 20 31 20 20 20 ** 2: 1
2000: 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20 0
2010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 1
2020: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 0a 2a 0.*
2030: 2a 20 20 33 3a 20 20 20 20 20 20 30 20 20 20 20 * 3: 0
2040: 20 20 20 20 20 20 20 20 20 31 20 20 20 20 20 20 1
2050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 20 1
2060: 20 20 20 20 20 20 20 20 20 20 20 20 31 0a 2a 2a 1.**
2070: 20 20 34 3a 20 20 20 20 20 20 31 20 20 20 20 20 4: 1
2080: 20 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20 1
2090: 20 20 20 20 20 20 20 20 20 20 20 20 20 31 20 20 1
20a0: 20 20 20 20 20 20 20 20 20 20 20 30 0a 2a 2a 0a 0.**.
20b0: 2a 2a 20 54 68 65 20 64 61 74 61 2d 61 63 74 69 ** The data-acti
20c0: 6f 6e 3d 41 52 47 20 66 6f 72 6d 20 69 73 20 75 on=ARG form is u
20d0: 73 65 64 20 66 6f 72 20 63 61 73 65 73 20 31 20 sed for cases 1
20e0: 61 6e 64 20 33 2e 20 20 49 6e 20 63 61 73 65 20 and 3. In case
20f0: 31 2c 20 74 68 65 20 68 72 65 66 2e 6a 73 0a 2a 1, the href.js.*
2100: 2a 20 6a 61 76 61 73 63 72 69 70 74 20 69 73 20 * javascript is
2110: 6f 6d 69 74 74 65 64 20 61 6e 64 20 73 6f 20 74 omitted and so t
2120: 68 65 20 66 6f 72 6d 20 69 73 20 65 66 66 65 63 he form is effec
2130: 74 69 76 65 6c 79 20 64 69 73 61 62 6c 65 64 2e tively disabled.
2140: 0a 2a 2f 0a 76 6f 69 64 20 66 6f 72 6d 5f 62 65 .*/.void form_be
2150: 67 69 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a gin(const char *
2160: 7a 4f 74 68 65 72 41 72 67 73 2c 20 63 6f 6e 73 zOtherArgs, cons
2170: 74 20 63 68 61 72 20 2a 7a 41 63 74 69 6f 6e 2c t char *zAction,
2180: 20 2e 2e 2e 29 7b 0a 20 20 63 68 61 72 20 2a 7a ...){. char *z
2190: 4c 69 6e 6b 3b 0a 20 20 76 61 5f 6c 69 73 74 20 Link;. va_list
21a0: 61 70 3b 0a 20 20 69 66 28 20 7a 4f 74 68 65 72 ap;. if( zOther
21b0: 41 72 67 73 3d 3d 30 20 29 20 7a 4f 74 68 65 72 Args==0 ) zOther
21c0: 41 72 67 73 20 3d 20 22 22 3b 0a 20 20 76 61 5f Args = "";. va_
21d0: 73 74 61 72 74 28 61 70 2c 20 7a 41 63 74 69 6f start(ap, zActio
21e0: 6e 29 3b 0a 20 20 7a 4c 69 6e 6b 20 3d 20 76 6d n);. zLink = vm
21f0: 70 72 69 6e 74 66 28 7a 41 63 74 69 6f 6e 2c 20 printf(zAction,
2200: 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 ap);. va_end(ap
2210: 29 3b 0a 20 20 69 66 28 20 67 2e 70 65 72 6d 2e );. if( g.perm.
2220: 48 79 70 65 72 6c 69 6e 6b 20 29 7b 0a 20 20 20 Hyperlink ){.
2230: 20 40 20 3c 66 6f 72 6d 20 6d 65 74 68 6f 64 3d @ <form method=
2240: 22 50 4f 53 54 22 20 61 63 74 69 6f 6e 3d 22 25 "POST" action="%
2250: 7a 28 7a 4c 69 6e 6b 29 22 20 25 73 28 7a 4f 74 z(zLink)" %s(zOt
2260: 68 65 72 41 72 67 73 29 3e 0a 20 20 7d 65 6c 73 herArgs)>. }els
2270: 65 7b 0a 20 20 20 20 6e 65 65 64 48 72 65 66 4a e{. needHrefJ
2280: 73 20 3d 20 31 3b 0a 20 20 20 20 40 20 3c 66 6f s = 1;. @ <fo
2290: 72 6d 20 6d 65 74 68 6f 64 3d 22 50 4f 53 54 22 rm method="POST"
22a0: 20 64 61 74 61 2d 61 63 74 69 6f 6e 3d 27 25 73 data-action='%s
22b0: 28 7a 4c 69 6e 6b 29 27 20 61 63 74 69 6f 6e 3d (zLink)' action=
22c0: 27 25 52 2f 6c 6f 67 69 6e 27 20 5c 0a 20 20 20 '%R/login' \.
22d0: 20 40 20 25 73 28 7a 4f 74 68 65 72 41 72 67 73 @ %s(zOtherArgs
22e0: 29 3e 0a 20 20 7d 0a 20 20 6c 6f 67 69 6e 5f 69 )>. }. login_i
22f0: 6e 73 65 72 74 5f 63 73 72 66 5f 73 65 63 72 65 nsert_csrf_secre
2300: 74 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 t();.}../*.** Ad
2310: 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 d a new element
2320: 74 6f 20 74 68 65 20 73 75 62 6d 65 6e 75 0a 2a to the submenu.*
2330: 2f 0a 76 6f 69 64 20 73 74 79 6c 65 5f 73 75 62 /.void style_sub
2340: 6d 65 6e 75 5f 65 6c 65 6d 65 6e 74 28 0a 20 20 menu_element(.
2350: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 61 62 const char *zLab
2360: 65 6c 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 el,. const char
2370: 20 2a 7a 4c 69 6e 6b 2c 0a 20 20 2e 2e 2e 0a 29 *zLink,. ....)
2380: 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a {. va_list ap;.
2390: 20 20 61 73 73 65 72 74 28 20 6e 53 75 62 6d 65 assert( nSubme
23a0: 6e 75 20 3c 20 63 6f 75 6e 74 28 61 53 75 62 6d nu < count(aSubm
23b0: 65 6e 75 29 20 29 3b 0a 20 20 61 53 75 62 6d 65 enu) );. aSubme
23c0: 6e 75 5b 6e 53 75 62 6d 65 6e 75 5d 2e 7a 4c 61 nu[nSubmenu].zLa
23d0: 62 65 6c 20 3d 20 7a 4c 61 62 65 6c 3b 0a 20 20 bel = zLabel;.
23e0: 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 4c 69 va_start(ap, zLi
23f0: 6e 6b 29 3b 0a 20 20 61 53 75 62 6d 65 6e 75 5b nk);. aSubmenu[
2400: 6e 53 75 62 6d 65 6e 75 5d 2e 7a 4c 69 6e 6b 20 nSubmenu].zLink
2410: 3d 20 76 6d 70 72 69 6e 74 66 28 7a 4c 69 6e 6b = vmprintf(zLink
2420: 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 , ap);. va_end(
2430: 61 70 29 3b 0a 20 20 6e 53 75 62 6d 65 6e 75 2b ap);. nSubmenu+
2440: 2b 3b 0a 7d 0a 76 6f 69 64 20 73 74 79 6c 65 5f +;.}.void style_
2450: 73 75 62 6d 65 6e 75 5f 65 6e 74 72 79 28 0a 20 submenu_entry(.
2460: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 const char *zNa
2470: 6d 65 2c 20 20 20 20 20 20 20 2f 2a 20 51 75 65 me, /* Que
2480: 72 79 20 70 61 72 61 6d 65 74 65 72 20 6e 61 6d ry parameter nam
2490: 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 e */. const cha
24a0: 72 20 2a 7a 4c 61 62 65 6c 2c 20 20 20 20 20 20 r *zLabel,
24b0: 2f 2a 20 4c 61 62 65 6c 20 62 65 66 6f 72 65 20 /* Label before
24c0: 74 68 65 20 65 6e 74 72 79 20 62 6f 78 20 2a 2f the entry box */
24d0: 0a 20 20 69 6e 74 20 69 53 69 7a 65 2c 20 20 20 . int iSize,
24e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 /* S
24f0: 69 7a 65 20 6f 66 20 74 68 65 20 65 6e 74 72 79 ize of the entry
2500: 20 62 6f 78 20 2a 2f 0a 20 20 69 6e 74 20 65 56 box */. int eV
2510: 69 73 69 62 6c 65 20 20 20 20 20 20 20 20 20 20 isible
2520: 20 20 20 2f 2a 20 56 69 73 69 62 6c 65 20 6f 72 /* Visible or
2530: 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 29 7b 0a disabled */.){.
2540: 20 20 61 73 73 65 72 74 28 20 6e 53 75 62 6d 65 assert( nSubme
2550: 6e 75 43 74 72 6c 20 3c 20 63 6f 75 6e 74 28 61 nuCtrl < count(a
2560: 53 75 62 6d 65 6e 75 43 74 72 6c 29 20 29 3b 0a SubmenuCtrl) );.
2570: 20 20 61 53 75 62 6d 65 6e 75 43 74 72 6c 5b 6e aSubmenuCtrl[n
2580: 53 75 62 6d 65 6e 75 43 74 72 6c 5d 2e 7a 4e 61 SubmenuCtrl].zNa
2590: 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 61 53 me = zName;. aS
25a0: 75 62 6d 65 6e 75 43 74 72 6c 5b 6e 53 75 62 6d ubmenuCtrl[nSubm
25b0: 65 6e 75 43 74 72 6c 5d 2e 7a 4c 61 62 65 6c 20 enuCtrl].zLabel
25c0: 3d 20 7a 4c 61 62 65 6c 3b 0a 20 20 61 53 75 62 = zLabel;. aSub
25d0: 6d 65 6e 75 43 74 72 6c 5b 6e 53 75 62 6d 65 6e menuCtrl[nSubmen
25e0: 75 43 74 72 6c 5d 2e 69 53 69 7a 65 20 3d 20 69 uCtrl].iSize = i
25f0: 53 69 7a 65 3b 0a 20 20 61 53 75 62 6d 65 6e 75 Size;. aSubmenu
2600: 43 74 72 6c 5b 6e 53 75 62 6d 65 6e 75 43 74 72 Ctrl[nSubmenuCtr
2610: 6c 5d 2e 65 56 69 73 69 62 6c 65 20 3d 20 65 56 l].eVisible = eV
2620: 69 73 69 62 6c 65 3b 0a 20 20 61 53 75 62 6d 65 isible;. aSubme
2630: 6e 75 43 74 72 6c 5b 6e 53 75 62 6d 65 6e 75 43 nuCtrl[nSubmenuC
2640: 74 72 6c 5d 2e 65 54 79 70 65 20 3d 20 46 46 5f trl].eType = FF_
2650: 45 4e 54 52 59 3b 0a 20 20 6e 53 75 62 6d 65 6e ENTRY;. nSubmen
2660: 75 43 74 72 6c 2b 2b 3b 0a 7d 0a 76 6f 69 64 20 uCtrl++;.}.void
2670: 73 74 79 6c 65 5f 73 75 62 6d 65 6e 75 5f 63 68 style_submenu_ch
2680: 65 63 6b 62 6f 78 28 0a 20 20 63 6f 6e 73 74 20 eckbox(. const
2690: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 char *zName,
26a0: 20 20 20 2f 2a 20 51 75 65 72 79 20 70 61 72 61 /* Query para
26b0: 6d 65 74 65 72 20 6e 61 6d 65 20 2a 2f 0a 20 20 meter name */.
26c0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 61 62 const char *zLab
26d0: 65 6c 2c 20 20 20 20 20 20 2f 2a 20 4c 61 62 65 el, /* Labe
26e0: 6c 20 74 6f 20 64 69 73 70 6c 61 79 20 61 66 74 l to display aft
26f0: 65 72 20 74 68 65 20 63 68 65 63 6b 62 6f 78 20 er the checkbox
2700: 2a 2f 0a 20 20 69 6e 74 20 65 56 69 73 69 62 6c */. int eVisibl
2710: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a e, /*
2720: 20 56 69 73 69 62 6c 65 20 6f 72 20 64 69 73 61 Visible or disa
2730: 62 6c 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 bled */. const
2740: 63 68 61 72 20 2a 7a 4a 53 20 20 20 20 20 20 20 char *zJS
2750: 20 20 20 2f 2a 20 4f 70 74 69 6f 6e 61 6c 20 6a /* Optional j
2760: 61 76 61 73 63 72 69 70 74 20 74 6f 20 72 75 6e avascript to run
2770: 20 6f 6e 20 74 6f 67 67 6c 65 20 2a 2f 0a 29 7b on toggle */.){
2780: 0a 20 20 61 73 73 65 72 74 28 20 6e 53 75 62 6d . assert( nSubm
2790: 65 6e 75 43 74 72 6c 20 3c 20 63 6f 75 6e 74 28 enuCtrl < count(
27a0: 61 53 75 62 6d 65 6e 75 43 74 72 6c 29 20 29 3b aSubmenuCtrl) );
27b0: 0a 20 20 61 53 75 62 6d 65 6e 75 43 74 72 6c 5b . aSubmenuCtrl[
27c0: 6e 53 75 62 6d 65 6e 75 43 74 72 6c 5d 2e 7a 4e nSubmenuCtrl].zN
27d0: 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 61 ame = zName;. a
27e0: 53 75 62 6d 65 6e 75 43 74 72 6c 5b 6e 53 75 62 SubmenuCtrl[nSub
27f0: 6d 65 6e 75 43 74 72 6c 5d 2e 7a 4c 61 62 65 6c menuCtrl].zLabel
2800: 20 3d 20 7a 4c 61 62 65 6c 3b 0a 20 20 61 53 75 = zLabel;. aSu
2810: 62 6d 65 6e 75 43 74 72 6c 5b 6e 53 75 62 6d 65 bmenuCtrl[nSubme
2820: 6e 75 43 74 72 6c 5d 2e 65 56 69 73 69 62 6c 65 nuCtrl].eVisible
2830: 20 3d 20 65 56 69 73 69 62 6c 65 3b 0a 20 20 61 = eVisible;. a
2840: 53 75 62 6d 65 6e 75 43 74 72 6c 5b 6e 53 75 62 SubmenuCtrl[nSub
2850: 6d 65 6e 75 43 74 72 6c 5d 2e 7a 4a 53 20 3d 20 menuCtrl].zJS =
2860: 7a 4a 53 3b 0a 20 20 61 53 75 62 6d 65 6e 75 43 zJS;. aSubmenuC
2870: 74 72 6c 5b 6e 53 75 62 6d 65 6e 75 43 74 72 6c trl[nSubmenuCtrl
2880: 5d 2e 65 54 79 70 65 20 3d 20 46 46 5f 43 48 45 ].eType = FF_CHE
2890: 43 4b 42 4f 58 3b 0a 20 20 6e 53 75 62 6d 65 6e CKBOX;. nSubmen
28a0: 75 43 74 72 6c 2b 2b 3b 0a 7d 0a 76 6f 69 64 20 uCtrl++;.}.void
28b0: 73 74 79 6c 65 5f 73 75 62 6d 65 6e 75 5f 62 69 style_submenu_bi
28c0: 6e 61 72 79 28 0a 20 20 63 6f 6e 73 74 20 63 68 nary(. const ch
28d0: 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 ar *zName,
28e0: 20 2f 2a 20 51 75 65 72 79 20 70 61 72 61 6d 65 /* Query parame
28f0: 74 65 72 20 6e 61 6d 65 20 2a 2f 0a 20 20 63 6f ter name */. co
2900: 6e 73 74 20 63 68 61 72 20 2a 7a 54 72 75 65 2c nst char *zTrue,
2910: 20 20 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20 /* Label
2920: 74 6f 20 73 68 6f 77 20 77 68 65 6e 20 70 61 72 to show when par
2930: 61 6d 65 74 65 72 20 69 73 20 74 72 75 65 20 2a ameter is true *
2940: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a /. const char *
2950: 7a 46 61 6c 73 65 2c 20 20 20 20 20 20 2f 2a 20 zFalse, /*
2960: 4c 61 62 65 6c 20 74 6f 20 73 68 6f 77 20 77 68 Label to show wh
2970: 65 6e 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 en the parameter
2980: 20 69 73 20 66 61 6c 73 65 20 2a 2f 0a 20 20 69 is false */. i
2990: 6e 74 20 65 56 69 73 69 62 6c 65 20 20 20 20 20 nt eVisible
29a0: 20 20 20 20 20 20 20 20 2f 2a 20 56 69 73 69 62 /* Visib
29b0: 6c 65 20 6f 72 20 64 69 73 61 62 6c 65 64 20 2a le or disabled *
29c0: 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 6e /.){. assert( n
29d0: 53 75 62 6d 65 6e 75 43 74 72 6c 20 3c 20 63 6f SubmenuCtrl < co
29e0: 75 6e 74 28 61 53 75 62 6d 65 6e 75 43 74 72 6c unt(aSubmenuCtrl
29f0: 29 20 29 3b 0a 20 20 61 53 75 62 6d 65 6e 75 43 ) );. aSubmenuC
2a00: 74 72 6c 5b 6e 53 75 62 6d 65 6e 75 43 74 72 6c trl[nSubmenuCtrl
2a10: 5d 2e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b ].zName = zName;
2a20: 0a 20 20 61 53 75 62 6d 65 6e 75 43 74 72 6c 5b . aSubmenuCtrl[
2a30: 6e 53 75 62 6d 65 6e 75 43 74 72 6c 5d 2e 7a 4c nSubmenuCtrl].zL
2a40: 61 62 65 6c 20 3d 20 7a 54 72 75 65 3b 0a 20 20 abel = zTrue;.
2a50: 61 53 75 62 6d 65 6e 75 43 74 72 6c 5b 6e 53 75 aSubmenuCtrl[nSu
2a60: 62 6d 65 6e 75 43 74 72 6c 5d 2e 7a 46 61 6c 73 bmenuCtrl].zFals
2a70: 65 20 3d 20 7a 46 61 6c 73 65 3b 0a 20 20 61 53 e = zFalse;. aS
2a80: 75 62 6d 65 6e 75 43 74 72 6c 5b 6e 53 75 62 6d ubmenuCtrl[nSubm
2a90: 65 6e 75 43 74 72 6c 5d 2e 65 56 69 73 69 62 6c enuCtrl].eVisibl
2aa0: 65 20 3d 20 65 56 69 73 69 62 6c 65 3b 0a 20 20 e = eVisible;.
2ab0: 61 53 75 62 6d 65 6e 75 43 74 72 6c 5b 6e 53 75 aSubmenuCtrl[nSu
2ac0: 62 6d 65 6e 75 43 74 72 6c 5d 2e 65 54 79 70 65 bmenuCtrl].eType
2ad0: 20 3d 20 46 46 5f 42 49 4e 41 52 59 3b 0a 20 20 = FF_BINARY;.
2ae0: 6e 53 75 62 6d 65 6e 75 43 74 72 6c 2b 2b 3b 0a nSubmenuCtrl++;.
2af0: 7d 0a 76 6f 69 64 20 73 74 79 6c 65 5f 73 75 62 }.void style_sub
2b00: 6d 65 6e 75 5f 6d 75 6c 74 69 63 68 6f 69 63 65 menu_multichoice
2b10: 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a (. const char *
2b20: 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20 zName,
2b30: 20 2f 2a 20 51 75 65 72 79 20 70 61 72 61 6d 65 /* Query parame
2b40: 74 65 72 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e ter name */. in
2b50: 74 20 6e 43 68 6f 69 63 65 2c 20 20 20 20 20 20 t nChoice,
2b60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 /* Nu
2b70: 6d 62 65 72 20 6f 66 20 6f 70 74 69 6f 6e 73 20 mber of options
2b80: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 */. const char
2b90: 2a 63 6f 6e 73 74 20 2a 61 7a 43 68 6f 69 63 65 *const *azChoice
2ba0: 2c 20 2f 2a 20 76 61 6c 75 65 2f 64 69 73 70 6c , /* value/displ
2bb0: 61 79 20 70 61 69 72 73 2e 20 20 32 2a 6e 43 68 ay pairs. 2*nCh
2bc0: 6f 69 63 65 20 65 6e 74 72 69 65 73 20 2a 2f 0a oice entries */.
2bd0: 20 20 69 6e 74 20 65 56 69 73 69 62 6c 65 20 20 int eVisible
2be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
2bf0: 2a 20 56 69 73 69 62 6c 65 20 6f 72 20 64 69 73 * Visible or dis
2c00: 61 62 6c 65 64 20 2a 2f 0a 29 7b 0a 20 20 61 73 abled */.){. as
2c10: 73 65 72 74 28 20 6e 53 75 62 6d 65 6e 75 43 74 sert( nSubmenuCt
2c20: 72 6c 20 3c 20 63 6f 75 6e 74 28 61 53 75 62 6d rl < count(aSubm
2c30: 65 6e 75 43 74 72 6c 29 20 29 3b 0a 20 20 61 53 enuCtrl) );. aS
2c40: 75 62 6d 65 6e 75 43 74 72 6c 5b 6e 53 75 62 6d ubmenuCtrl[nSubm
2c50: 65 6e 75 43 74 72 6c 5d 2e 7a 4e 61 6d 65 20 3d enuCtrl].zName =
2c60: 20 7a 4e 61 6d 65 3b 0a 20 20 61 53 75 62 6d 65 zName;. aSubme
2c70: 6e 75 43 74 72 6c 5b 6e 53 75 62 6d 65 6e 75 43 nuCtrl[nSubmenuC
2c80: 74 72 6c 5d 2e 69 53 69 7a 65 20 3d 20 6e 43 68 trl].iSize = nCh
2c90: 6f 69 63 65 3b 0a 20 20 61 53 75 62 6d 65 6e 75 oice;. aSubmenu
2ca0: 43 74 72 6c 5b 6e 53 75 62 6d 65 6e 75 43 74 72 Ctrl[nSubmenuCtr
2cb0: 6c 5d 2e 61 7a 43 68 6f 69 63 65 20 3d 20 61 7a l].azChoice = az
2cc0: 43 68 6f 69 63 65 3b 0a 20 20 61 53 75 62 6d 65 Choice;. aSubme
2cd0: 6e 75 43 74 72 6c 5b 6e 53 75 62 6d 65 6e 75 43 nuCtrl[nSubmenuC
2ce0: 74 72 6c 5d 2e 65 56 69 73 69 62 6c 65 20 3d 20 trl].eVisible =
2cf0: 65 56 69 73 69 62 6c 65 3b 0a 20 20 61 53 75 62 eVisible;. aSub
2d00: 6d 65 6e 75 43 74 72 6c 5b 6e 53 75 62 6d 65 6e menuCtrl[nSubmen
2d10: 75 43 74 72 6c 5d 2e 65 54 79 70 65 20 3d 20 46 uCtrl].eType = F
2d20: 46 5f 4d 55 4c 54 49 3b 0a 20 20 6e 53 75 62 6d F_MULTI;. nSubm
2d30: 65 6e 75 43 74 72 6c 2b 2b 3b 0a 7d 0a 76 6f 69 enuCtrl++;.}.voi
2d40: 64 20 73 74 79 6c 65 5f 73 75 62 6d 65 6e 75 5f d style_submenu_
2d50: 73 71 6c 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 sql(. const cha
2d60: 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 r *zName,
2d70: 2f 2a 20 51 75 65 72 79 20 70 61 72 61 6d 65 74 /* Query paramet
2d80: 65 72 20 6e 61 6d 65 20 2a 2f 0a 20 20 63 6f 6e er name */. con
2d90: 73 74 20 63 68 61 72 20 2a 7a 4c 61 62 65 6c 2c st char *zLabel,
2da0: 20 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20 6f /* Label o
2db0: 6e 20 74 68 65 20 63 6f 6e 74 72 6f 6c 20 2a 2f n the control */
2dc0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a . const char *z
2dd0: 46 6f 72 6d 61 74 2c 20 20 20 20 20 2f 2a 20 46 Format, /* F
2de0: 6f 72 6d 61 74 20 73 74 72 69 6e 67 20 66 6f 72 ormat string for
2df0: 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 20 66 6f 72 SQL command for
2e00: 20 63 68 6f 69 63 65 73 20 2a 2f 0a 20 20 2e 2e choices */. ..
2e10: 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
2e20: 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 /* Argume
2e30: 6e 74 73 20 74 6f 20 74 68 65 20 66 6f 72 6d 61 nts to the forma
2e40: 74 20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20 t string */.){.
2e50: 20 53 74 6d 74 20 71 3b 0a 20 20 69 6e 74 20 6e Stmt q;. int n
2e60: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 41 6c 6c = 0;. int nAll
2e70: 6f 63 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a oc = 0;. char *
2e80: 2a 61 7a 20 3d 20 30 3b 0a 20 20 76 61 5f 6c 69 *az = 0;. va_li
2e90: 73 74 20 61 70 3b 0a 0a 20 20 76 61 5f 73 74 61 st ap;.. va_sta
2ea0: 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b rt(ap, zFormat);
2eb0: 0a 20 20 64 62 5f 76 70 72 65 70 61 72 65 28 26 . db_vprepare(&
2ec0: 71 2c 20 30 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 q, 0, zFormat, a
2ed0: 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 p);. va_end(ap)
2ee0: 3b 0a 20 20 77 68 69 6c 65 28 20 53 51 4c 49 54 ;. while( SQLIT
2ef0: 45 5f 52 4f 57 3d 3d 64 62 5f 73 74 65 70 28 26 E_ROW==db_step(&
2f00: 71 29 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 2b q) ){. if( n+
2f10: 32 3e 3d 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 2>=nAlloc ){.
2f20: 20 20 20 6e 41 6c 6c 6f 63 20 2b 3d 20 6e 41 6c nAlloc += nAl
2f30: 6c 6f 63 20 2b 20 32 30 3b 0a 20 20 20 20 20 20 loc + 20;.
2f40: 61 7a 20 3d 20 66 6f 73 73 69 6c 5f 72 65 61 6c az = fossil_real
2f50: 6c 6f 63 28 61 7a 2c 20 73 69 7a 65 6f 66 28 63 loc(az, sizeof(c
2f60: 68 61 72 2a 29 2a 6e 41 6c 6c 6f 63 29 3b 0a 20 har*)*nAlloc);.
2f70: 20 20 20 7d 0a 20 20 20 20 61 7a 5b 6e 2b 2b 5d }. az[n++]
2f80: 20 3d 20 66 6f 73 73 69 6c 5f 73 74 72 64 75 70 = fossil_strdup
2f90: 28 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 (db_column_text(
2fa0: 26 71 2c 30 29 29 3b 0a 20 20 20 20 61 7a 5b 6e &q,0));. az[n
2fb0: 2b 2b 5d 20 3d 20 66 6f 73 73 69 6c 5f 73 74 72 ++] = fossil_str
2fc0: 64 75 70 28 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 dup(db_column_te
2fd0: 78 74 28 26 71 2c 31 29 29 3b 0a 20 20 7d 0a 20 xt(&q,1));. }.
2fe0: 20 64 62 5f 66 69 6e 61 6c 69 7a 65 28 26 71 29 db_finalize(&q)
2ff0: 3b 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20 ;. if( n>0 ){.
3000: 20 20 20 61 53 75 62 6d 65 6e 75 43 74 72 6c 5b aSubmenuCtrl[
3010: 6e 53 75 62 6d 65 6e 75 43 74 72 6c 5d 2e 7a 4e nSubmenuCtrl].zN
3020: 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 ame = zName;.
3030: 20 61 53 75 62 6d 65 6e 75 43 74 72 6c 5b 6e 53 aSubmenuCtrl[nS
3040: 75 62 6d 65 6e 75 43 74 72 6c 5d 2e 7a 4c 61 62 ubmenuCtrl].zLab
3050: 65 6c 20 3d 20 7a 4c 61 62 65 6c 3b 0a 20 20 20 el = zLabel;.
3060: 20 61 53 75 62 6d 65 6e 75 43 74 72 6c 5b 6e 53 aSubmenuCtrl[nS
3070: 75 62 6d 65 6e 75 43 74 72 6c 5d 2e 69 53 69 7a ubmenuCtrl].iSiz
3080: 65 20 3d 20 6e 2f 32 3b 0a 20 20 20 20 61 53 75 e = n/2;. aSu
3090: 62 6d 65 6e 75 43 74 72 6c 5b 6e 53 75 62 6d 65 bmenuCtrl[nSubme
30a0: 6e 75 43 74 72 6c 5d 2e 61 7a 43 68 6f 69 63 65 nuCtrl].azChoice
30b0: 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a = (const char *
30c0: 63 6f 6e 73 74 20 2a 29 61 7a 3b 0a 20 20 20 20 const *)az;.
30d0: 61 53 75 62 6d 65 6e 75 43 74 72 6c 5b 6e 53 75 aSubmenuCtrl[nSu
30e0: 62 6d 65 6e 75 43 74 72 6c 5d 2e 65 56 69 73 69 bmenuCtrl].eVisi
30f0: 62 6c 65 20 3d 20 53 54 59 4c 45 5f 4e 4f 52 4d ble = STYLE_NORM
3100: 41 4c 3b 0a 20 20 20 20 61 53 75 62 6d 65 6e 75 AL;. aSubmenu
3110: 43 74 72 6c 5b 6e 53 75 62 6d 65 6e 75 43 74 72 Ctrl[nSubmenuCtr
3120: 6c 5d 2e 65 54 79 70 65 20 3d 20 46 46 5f 4d 55 l].eType = FF_MU
3130: 4c 54 49 3b 0a 20 20 20 20 6e 53 75 62 6d 65 6e LTI;. nSubmen
3140: 75 43 74 72 6c 2b 2b 3b 0a 20 20 7d 0a 7d 0a 0a uCtrl++;. }.}..
3150: 2f 2a 0a 2a 2a 20 44 69 73 61 62 6c 65 20 6f 72 /*.** Disable or
3160: 20 65 6e 61 62 6c 65 20 74 68 65 20 73 75 62 6d enable the subm
3170: 65 6e 75 0a 2a 2f 0a 76 6f 69 64 20 73 74 79 6c enu.*/.void styl
3180: 65 5f 73 75 62 6d 65 6e 75 5f 65 6e 61 62 6c 65 e_submenu_enable
3190: 28 69 6e 74 20 6f 6e 4f 66 66 29 7b 0a 20 20 73 (int onOff){. s
31a0: 75 62 6d 65 6e 75 45 6e 61 62 6c 65 20 3d 20 6f ubmenuEnable = o
31b0: 6e 4f 66 66 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 nOff;.}.../*.**
31c0: 43 6f 6d 70 61 72 65 20 74 77 6f 20 73 75 62 6d Compare two subm
31d0: 65 6e 75 20 69 74 65 6d 73 20 66 6f 72 20 73 6f enu items for so
31e0: 72 74 69 6e 67 20 70 75 72 70 6f 73 65 73 0a 2a rting purposes.*
31f0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75 62 /.static int sub
3200: 6d 65 6e 75 43 6f 6d 70 61 72 65 28 63 6f 6e 73 menuCompare(cons
3210: 74 20 76 6f 69 64 20 2a 61 2c 20 63 6f 6e 73 74 t void *a, const
3220: 20 76 6f 69 64 20 2a 62 29 7b 0a 20 20 63 6f 6e void *b){. con
3230: 73 74 20 73 74 72 75 63 74 20 53 75 62 6d 65 6e st struct Submen
3240: 75 20 2a 41 20 3d 20 28 63 6f 6e 73 74 20 73 74 u *A = (const st
3250: 72 75 63 74 20 53 75 62 6d 65 6e 75 2a 29 61 3b ruct Submenu*)a;
3260: 0a 20 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 . const struct
3270: 53 75 62 6d 65 6e 75 20 2a 42 20 3d 20 28 63 6f Submenu *B = (co
3280: 6e 73 74 20 73 74 72 75 63 74 20 53 75 62 6d 65 nst struct Subme
3290: 6e 75 2a 29 62 3b 0a 20 20 72 65 74 75 72 6e 20 nu*)b;. return
32a0: 66 6f 73 73 69 6c 5f 73 74 72 63 6d 70 28 41 2d fossil_strcmp(A-
32b0: 3e 7a 4c 61 62 65 6c 2c 20 42 2d 3e 7a 4c 61 62 >zLabel, B->zLab
32c0: 65 6c 29 3b 0a 7d 0a 0a 2f 2a 20 55 73 65 20 74 el);.}../* Use t
32d0: 68 69 73 20 66 6f 72 20 74 68 65 20 24 63 75 72 his for the $cur
32e0: 72 65 6e 74 5f 70 61 67 65 20 76 61 72 69 61 62 rent_page variab
32f0: 6c 65 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 le if it is not
3300: 4e 55 4c 4c 2e 20 20 49 66 20 69 74 0a 2a 2a 20 NULL. If it.**
3310: 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 75 73 65 is NULL then use
3320: 20 67 2e 7a 50 61 74 68 2e 0a 2a 2f 0a 73 74 61 g.zPath..*/.sta
3330: 74 69 63 20 63 68 61 72 20 2a 6c 6f 63 61 6c 5f tic char *local_
3340: 7a 43 75 72 72 65 6e 74 50 61 67 65 20 3d 20 30 zCurrentPage = 0
3350: 3b 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 ;../*.** Set the
3360: 20 64 65 73 69 72 65 64 20 24 63 75 72 72 65 6e desired $curren
3370: 74 5f 70 61 67 65 20 74 6f 20 73 6f 6d 65 74 68 t_page to someth
3380: 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20 67 ing other than g
3390: 2e 7a 50 61 74 68 0a 2a 2f 0a 76 6f 69 64 20 73 .zPath.*/.void s
33a0: 74 79 6c 65 5f 73 65 74 5f 63 75 72 72 65 6e 74 tyle_set_current
33b0: 5f 70 61 67 65 28 63 6f 6e 73 74 20 63 68 61 72 _page(const char
33c0: 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b *zFormat, ...){
33d0: 0a 20 20 66 6f 73 73 69 6c 5f 66 72 65 65 28 6c . fossil_free(l
33e0: 6f 63 61 6c 5f 7a 43 75 72 72 65 6e 74 50 61 67 ocal_zCurrentPag
33f0: 65 29 3b 0a 20 20 69 66 28 20 7a 46 6f 72 6d 61 e);. if( zForma
3400: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 6c 6f 63 61 t==0 ){. loca
3410: 6c 5f 7a 43 75 72 72 65 6e 74 50 61 67 65 20 3d l_zCurrentPage =
3420: 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 0;. }else{.
3430: 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 20 va_list ap;.
3440: 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 va_start(ap, zF
3450: 6f 72 6d 61 74 29 3b 0a 20 20 20 20 6c 6f 63 61 ormat);. loca
3460: 6c 5f 7a 43 75 72 72 65 6e 74 50 61 67 65 20 3d l_zCurrentPage =
3470: 20 76 6d 70 72 69 6e 74 66 28 7a 46 6f 72 6d 61 vmprintf(zForma
3480: 74 2c 20 61 70 29 3b 0a 20 20 20 20 76 61 5f 65 t, ap);. va_e
3490: 6e 64 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f nd(ap);. }.}../
34a0: 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 54 48 *.** Create a TH
34b0: 31 20 76 61 72 69 61 62 6c 65 20 63 6f 6e 74 61 1 variable conta
34c0: 69 6e 69 6e 67 20 74 68 65 20 55 52 4c 20 66 6f ining the URL fo
34d0: 72 20 74 68 65 20 73 74 79 6c 65 73 68 65 65 74 r the stylesheet
34e0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 61 6d 65 ..**.** The name
34f0: 20 6f 66 20 74 68 65 20 6e 65 77 20 76 61 72 69 of the new vari
3500: 61 62 6c 65 20 77 69 6c 6c 20 62 65 20 22 73 74 able will be "st
3510: 79 6c 65 73 68 65 65 74 5f 75 72 6c 22 2e 0a 2a ylesheet_url"..*
3520: 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 77 *.** The value w
3530: 69 6c 6c 20 62 65 20 61 20 55 52 4c 20 66 6f 72 ill be a URL for
3540: 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 61 accessing the a
3550: 70 70 72 6f 70 72 69 61 74 65 20 73 74 79 6c 65 ppropriate style
3560: 73 68 65 65 74 2e 0a 2a 2a 20 54 68 69 73 20 55 sheet..** This U
3570: 52 4c 20 77 69 6c 6c 20 69 6e 63 6c 75 64 65 20 RL will include
3580: 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 73 query parameters
3590: 20 73 75 63 68 20 61 73 20 22 69 64 3d 22 20 61 such as "id=" a
35a0: 6e 64 20 22 6f 6e 63 65 26 73 6b 69 6e 3d 22 0a nd "once&skin=".
35b0: 2a 2a 20 74 6f 20 63 61 75 73 65 20 74 68 65 20 ** to cause the
35c0: 63 6f 72 72 65 63 74 20 73 74 79 6c 65 73 68 65 correct styleshe
35d0: 65 74 20 74 6f 20 62 65 20 6c 6f 61 64 65 64 20 et to be loaded
35e0: 61 66 74 65 72 20 61 20 73 6b 69 6e 20 63 68 61 after a skin cha
35f0: 6e 67 65 0a 2a 2a 20 6f 72 20 61 66 74 65 72 20 nge.** or after
3600: 61 20 63 68 61 6e 67 65 20 74 6f 20 74 68 65 20 a change to the
3610: 73 74 79 6c 65 73 68 65 65 74 2e 0a 2a 2f 0a 73 stylesheet..*/.s
3620: 74 61 74 69 63 20 76 6f 69 64 20 73 74 79 6c 65 tatic void style
3630: 73 68 65 65 74 5f 75 72 6c 5f 76 61 72 28 76 6f sheet_url_var(vo
3640: 69 64 29 7b 0a 20 20 63 68 61 72 20 2a 7a 42 75 id){. char *zBu
3650: 69 6c 74 69 6e 3b 20 20 20 20 20 20 20 20 20 20 iltin;
3660: 20 20 20 20 2f 2a 20 41 75 78 69 6c 69 61 72 79 /* Auxiliary
3670: 20 70 61 67 65 2d 73 70 65 63 69 66 69 63 20 43 page-specific C
3680: 53 53 20 70 61 67 65 20 2a 2f 0a 20 20 42 6c 6f SS page */. Blo
3690: 62 20 75 72 6c 3b 20 20 20 20 20 20 20 20 20 20 b url;
36a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 /* The
36b0: 20 55 52 4c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 URL */. const
36c0: 63 68 61 72 20 2a 20 7a 50 61 67 65 20 3d 20 6c char * zPage = l
36d0: 6f 63 61 6c 5f 7a 43 75 72 72 65 6e 74 50 61 67 ocal_zCurrentPag
36e0: 65 20 3f 20 6c 6f 63 61 6c 5f 7a 43 75 72 72 65 e ? local_zCurre
36f0: 6e 74 50 61 67 65 20 3a 20 67 2e 7a 50 61 74 68 ntPage : g.zPath
3700: 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 ;.. /* Initiali
3710: 7a 65 20 74 68 65 20 55 52 4c 20 74 6f 20 69 74 ze the URL to it
3720: 73 20 62 61 73 65 6c 69 6e 65 20 2a 2f 0a 20 20 s baseline */.
3730: 75 72 6c 20 3d 20 65 6d 70 74 79 5f 62 6c 6f 62 url = empty_blob
3740: 3b 0a 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 ;. blob_appendf
3750: 28 26 75 72 6c 2c 20 22 25 52 2f 73 74 79 6c 65 (&url, "%R/style
3760: 2e 63 73 73 22 29 3b 0a 0a 20 20 2f 2a 20 49 66 .css");.. /* If
3770: 20 70 61 67 65 2d 73 70 65 63 69 66 69 63 20 43 page-specific C
3780: 53 53 20 65 78 69 73 74 73 20 66 6f 72 20 74 68 SS exists for th
3790: 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 2c 20 e current page,
37a0: 74 68 65 6e 20 61 70 70 65 6e 64 0a 20 20 2a 2a then append. **
37b0: 20 74 68 65 20 70 61 74 68 6e 61 6d 65 20 66 6f the pathname fo
37c0: 72 20 74 68 65 20 70 61 67 65 2d 73 70 65 63 69 r the page-speci
37d0: 66 69 63 20 43 53 53 2e 20 20 54 68 65 20 64 65 fic CSS. The de
37e0: 66 61 75 6c 74 20 43 53 53 20 69 73 0a 20 20 2a fault CSS is. *
37f0: 2a 0a 20 20 2a 2a 20 20 20 20 20 2f 73 74 79 6c *. ** /styl
3800: 65 2e 63 73 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20 e.css. **. **
3810: 42 75 74 20 66 6f 72 20 74 68 65 20 22 2f 77 69 But for the "/wi
3820: 6b 69 65 64 69 74 22 20 70 61 67 65 20 28 74 6f kiedit" page (to
3830: 20 6e 61 6d 65 20 62 75 74 20 6f 6e 65 20 65 78 name but one ex
3840: 61 6d 70 6c 65 29 2c 20 77 65 0a 20 20 2a 2a 20 ample), we. **
3850: 61 70 70 65 6e 64 20 61 20 70 61 74 68 20 61 73 append a path as
3860: 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 follows:. **.
3870: 20 2a 2a 20 20 20 20 20 2f 73 74 79 6c 65 2e 63 ** /style.c
3880: 73 73 2f 77 69 6b 69 65 64 69 74 0a 20 20 2a 2a ss/wikiedit. **
3890: 0a 20 20 2a 2a 20 54 68 65 20 2f 73 74 79 6c 65 . ** The /style
38a0: 2e 63 73 73 20 70 61 67 65 20 28 69 6d 70 6c 65 .css page (imple
38b0: 6d 65 6e 74 65 64 20 62 65 6c 6f 77 29 20 77 69 mented below) wi
38c0: 6c 6c 20 64 65 74 65 63 74 20 74 68 69 73 20 65 ll detect this e
38d0: 78 74 72 61 20 22 77 69 6b 69 65 64 69 74 22 0a xtra "wikiedit".
38e0: 20 20 2a 2a 20 70 61 74 68 20 69 6e 66 6f 72 6d ** path inform
38f0: 61 74 69 6f 6e 20 61 6e 64 20 69 6e 63 6c 75 64 ation and includ
3900: 65 20 74 68 65 20 70 61 67 65 2d 73 70 65 63 69 e the page-speci
3910: 66 69 63 20 43 53 53 20 61 6c 6f 6e 67 20 77 69 fic CSS along wi
3920: 74 68 20 74 68 65 0a 20 20 2a 2a 20 64 65 66 61 th the. ** defa
3930: 75 6c 74 20 43 53 53 20 77 68 65 6e 20 69 74 20 ult CSS when it
3940: 64 65 6c 69 76 65 72 73 20 74 68 65 20 70 61 67 delivers the pag
3950: 65 2e 0a 20 20 2a 2f 0a 20 20 7a 42 75 69 6c 74 e.. */. zBuilt
3960: 69 6e 20 3d 20 6d 70 72 69 6e 74 66 28 22 73 74 in = mprintf("st
3970: 79 6c 65 2e 25 73 2e 63 73 73 22 2c 20 7a 50 61 yle.%s.css", zPa
3980: 67 65 29 3b 0a 20 20 69 66 28 20 62 75 69 6c 74 ge);. if( built
3990: 69 6e 5f 66 69 6c 65 28 7a 42 75 69 6c 74 69 6e in_file(zBuiltin
39a0: 2c 30 29 21 3d 30 20 29 7b 0a 20 20 20 20 62 6c ,0)!=0 ){. bl
39b0: 6f 62 5f 61 70 70 65 6e 64 66 28 26 75 72 6c 2c ob_appendf(&url,
39c0: 20 22 2f 25 73 22 2c 20 7a 50 61 67 65 29 3b 0a "/%s", zPage);.
39d0: 20 20 7d 0a 20 20 66 6f 73 73 69 6c 5f 66 72 65 }. fossil_fre
39e0: 65 28 7a 42 75 69 6c 74 69 6e 29 3b 0a 0a 20 20 e(zBuiltin);..
39f0: 2f 2a 20 41 64 64 20 71 75 65 72 79 20 70 61 72 /* Add query par
3a00: 61 6d 65 74 65 72 73 20 74 68 61 74 20 77 69 6c ameters that wil
3a10: 6c 20 63 68 61 6e 67 65 20 77 68 65 6e 65 76 65 l change wheneve
3a20: 72 20 74 68 65 20 73 6b 69 6e 20 63 68 61 6e 67 r the skin chang
3a30: 65 73 0a 20 20 2a 2a 20 6f 72 20 61 66 74 65 72 es. ** or after
3a40: 20 61 6e 79 20 75 70 64 61 74 65 73 20 74 6f 20 any updates to
3a50: 74 68 65 20 43 53 53 20 66 69 6c 65 73 0a 20 20 the CSS files.
3a60: 2a 2f 0a 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 */. blob_append
3a70: 66 28 26 75 72 6c 2c 20 22 3f 69 64 3d 25 78 22 f(&url, "?id=%x"
3a80: 2c 20 73 6b 69 6e 5f 69 64 28 22 63 73 73 22 29 , skin_id("css")
3a90: 29 3b 0a 20 20 69 66 28 20 50 28 22 6f 6e 63 65 );. if( P("once
3aa0: 22 29 21 3d 30 20 26 26 20 50 28 22 73 6b 69 6e ")!=0 && P("skin
3ab0: 22 29 21 3d 30 20 29 7b 0a 20 20 20 20 62 6c 6f ")!=0 ){. blo
3ac0: 62 5f 61 70 70 65 6e 64 66 28 26 75 72 6c 2c 20 b_appendf(&url,
3ad0: 22 26 73 6b 69 6e 3d 25 73 26 6f 6e 63 65 22 2c "&skin=%s&once",
3ae0: 20 73 6b 69 6e 5f 69 6e 5f 75 73 65 28 29 29 3b skin_in_use());
3af0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 . }.. /* Gener
3b00: 61 74 65 20 74 68 65 20 43 53 53 20 55 52 4c 20 ate the CSS URL
3b10: 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 54 68 variable */. Th
3b20: 5f 53 74 6f 72 65 28 22 73 74 79 6c 65 73 68 65 _Store("styleshe
3b30: 65 74 5f 75 72 6c 22 2c 20 62 6c 6f 62 5f 73 74 et_url", blob_st
3b40: 72 28 26 75 72 6c 29 29 3b 0a 20 20 62 6c 6f 62 r(&url));. blob
3b50: 5f 72 65 73 65 74 28 26 75 72 6c 29 3b 0a 7d 0a _reset(&url);.}.
3b60: 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 ./*.** Create a
3b70: 54 48 31 20 76 61 72 69 61 62 6c 65 20 63 6f 6e TH1 variable con
3b80: 74 61 69 6e 69 6e 67 20 74 68 65 20 55 52 4c 20 taining the URL
3b90: 66 6f 72 20 74 68 65 20 73 70 65 63 69 66 69 65 for the specifie
3ba0: 64 20 69 6d 61 67 65 2e 0a 2a 2a 20 54 68 65 20 d image..** The
3bb0: 72 65 73 75 6c 74 69 6e 67 20 76 61 72 69 61 62 resulting variab
3bc0: 6c 65 20 6e 61 6d 65 20 77 69 6c 6c 20 62 65 20 le name will be
3bd0: 6f 66 20 74 68 65 20 66 6f 72 6d 20 24 5b 7a 49 of the form $[zI
3be0: 6d 61 67 65 4e 61 6d 65 5d 5f 69 6d 61 67 65 5f mageName]_image_
3bf0: 75 72 6c 2e 0a 2a 2a 20 54 68 65 20 76 61 6c 75 url..** The valu
3c00: 65 20 77 69 6c 6c 20 62 65 20 61 20 55 52 4c 20 e will be a URL
3c10: 74 68 61 74 20 69 6e 63 6c 75 64 65 73 20 61 6e that includes an
3c20: 20 69 64 3d 20 71 75 65 72 79 20 70 61 72 61 6d id= query param
3c30: 65 74 65 72 20 74 68 61 74 0a 2a 2a 20 63 68 61 eter that.** cha
3c40: 6e 67 65 73 20 69 66 20 74 68 65 20 75 6e 64 65 nges if the unde
3c50: 72 6c 79 69 6e 67 20 72 65 73 6f 75 72 63 65 20 rlying resource
3c60: 63 68 61 6e 67 65 73 20 6f 72 20 69 66 20 61 20 changes or if a
3c70: 64 69 66 66 65 72 65 6e 74 20 73 6b 69 6e 0a 2a different skin.*
3c80: 2a 20 69 73 20 73 65 6c 65 63 74 65 64 2e 0a 2a * is selected..*
3c90: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6d /.static void im
3ca0: 61 67 65 5f 75 72 6c 5f 76 61 72 28 63 6f 6e 73 age_url_var(cons
3cb0: 74 20 63 68 61 72 20 2a 7a 49 6d 61 67 65 4e 61 t char *zImageNa
3cc0: 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 56 61 me){. char *zVa
3cd0: 72 4e 61 6d 65 3b 20 20 20 2f 2a 20 4e 61 6d 65 rName; /* Name
3ce0: 20 6f 66 20 74 68 65 20 6e 65 77 20 54 48 31 20 of the new TH1
3cf0: 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 63 68 variable */. ch
3d00: 61 72 20 2a 7a 52 65 73 6f 75 72 63 65 3b 20 20 ar *zResource;
3d10: 2f 2a 20 4e 61 6d 65 20 6f 66 20 43 4f 4e 46 49 /* Name of CONFI
3d20: 47 20 65 6e 74 72 79 20 68 6f 6c 64 69 6e 67 20 G entry holding
3d30: 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 63 68 61 content */. cha
3d40: 72 20 2a 7a 55 72 6c 3b 20 20 20 20 20 20 20 2f r *zUrl; /
3d50: 2a 20 54 68 65 20 55 52 4c 20 2a 2f 0a 0a 20 20 * The URL */..
3d60: 7a 52 65 73 6f 75 72 63 65 20 3d 20 6d 70 72 69 zResource = mpri
3d70: 6e 74 66 28 22 25 73 2d 69 6d 61 67 65 22 2c 20 ntf("%s-image",
3d80: 7a 49 6d 61 67 65 4e 61 6d 65 29 3b 0a 20 20 7a zImageName);. z
3d90: 55 72 6c 20 3d 20 6d 70 72 69 6e 74 66 28 22 25 Url = mprintf("%
3da0: 52 2f 25 73 3f 69 64 3d 25 78 22 2c 20 7a 49 6d R/%s?id=%x", zIm
3db0: 61 67 65 4e 61 6d 65 2c 20 73 6b 69 6e 5f 69 64 ageName, skin_id
3dc0: 28 7a 52 65 73 6f 75 72 63 65 29 29 3b 0a 20 20 (zResource));.
3dd0: 66 72 65 65 28 7a 52 65 73 6f 75 72 63 65 29 3b free(zResource);
3de0: 0a 20 20 7a 56 61 72 4e 61 6d 65 20 3d 20 6d 70 . zVarName = mp
3df0: 72 69 6e 74 66 28 22 25 73 5f 69 6d 61 67 65 5f rintf("%s_image_
3e00: 75 72 6c 22 2c 20 7a 49 6d 61 67 65 4e 61 6d 65 url", zImageName
3e10: 29 3b 0a 20 20 54 68 5f 53 74 6f 72 65 28 7a 56 );. Th_Store(zV
3e20: 61 72 4e 61 6d 65 2c 20 7a 55 72 6c 29 3b 0a 20 arName, zUrl);.
3e30: 20 66 72 65 65 28 7a 56 61 72 4e 61 6d 65 29 3b free(zVarName);
3e40: 0a 20 20 66 72 65 65 28 7a 55 72 6c 29 3b 0a 7d . free(zUrl);.}
3e50: 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 54 ../*.** Output T
3e60: 45 58 54 20 77 69 74 68 20 61 20 63 6c 69 63 6b EXT with a click
3e70: 2d 74 6f 2d 63 6f 70 79 20 62 75 74 74 6f 6e 20 -to-copy button
3e80: 6e 65 78 74 20 74 6f 20 69 74 2e 20 4c 6f 61 64 next to it. Load
3e90: 73 20 74 68 65 20 63 6f 70 79 62 74 6e 2e 6a 73 s the copybtn.js
3ea0: 0a 2a 2a 20 4a 61 76 61 73 63 72 69 70 74 20 6d .** Javascript m
3eb0: 6f 64 75 6c 65 2c 20 61 6e 64 20 67 65 6e 65 72 odule, and gener
3ec0: 61 74 65 73 20 48 54 4d 4c 20 65 6c 65 6d 65 6e ates HTML elemen
3ed0: 74 73 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c ts with the foll
3ee0: 6f 77 69 6e 67 20 49 44 73 3a 0a 2a 2a 0a 2a 2a owing IDs:.**.**
3ef0: 20 20 20 20 54 41 52 47 45 54 49 44 3a 20 20 20 TARGETID:
3f00: 20 20 20 20 54 68 65 20 3c 73 70 61 6e 3e 20 77 The <span> w
3f10: 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20 54 45 rapper around TE
3f20: 58 54 2e 0a 2a 2a 20 20 20 20 63 6f 70 79 2d 54 XT..** copy-T
3f30: 41 52 47 45 54 49 44 3a 20 20 54 68 65 20 3c 73 ARGETID: The <s
3f40: 70 61 6e 3e 20 66 6f 72 20 74 68 65 20 63 6f 70 pan> for the cop
3f50: 79 20 62 75 74 74 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 y button..**.**
3f60: 49 66 20 74 68 65 20 46 4c 49 50 50 45 44 20 61 If the FLIPPED a
3f70: 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 2d 7a rgument is non-z
3f80: 65 72 6f 2c 20 74 68 65 20 63 6f 70 79 20 62 75 ero, the copy bu
3f90: 74 74 6f 6e 20 69 73 20 64 69 73 70 6c 61 79 65 tton is displaye
3fa0: 64 20 61 66 74 65 72 20 54 45 58 54 2e 0a 2a 2a d after TEXT..**
3fb0: 0a 2a 2a 20 54 68 65 20 43 4f 50 59 4c 45 4e 47 .** The COPYLENG
3fc0: 54 48 20 61 72 67 75 6d 65 6e 74 20 64 65 66 69 TH argument defi
3fd0: 6e 65 73 20 74 68 65 20 6c 65 6e 67 74 68 20 6f nes the length o
3fe0: 66 20 74 68 65 20 73 75 62 73 74 72 69 6e 67 20 f the substring
3ff0: 6f 66 20 54 45 58 54 20 63 6f 70 69 65 64 20 74 of TEXT copied t
4000: 6f 0a 2a 2a 20 63 6c 69 70 62 6f 61 72 64 3a 0a o.** clipboard:.
4010: 2a 2a 0a 2a 2a 20 20 20 20 3c 3d 20 30 3a 20 20 **.** <= 0:
4020: 20 4e 6f 20 6c 69 6d 69 74 20 28 64 65 66 61 75 No limit (defau
4030: 6c 74 20 69 66 20 74 68 65 20 61 72 67 75 6d 65 lt if the argume
4040: 6e 74 20 69 73 20 6f 6d 69 74 74 65 64 29 2e 0a nt is omitted)..
4050: 2a 2a 20 20 20 20 3e 3d 20 33 3a 20 20 20 54 72 ** >= 3: Tr
4060: 75 6e 63 61 74 65 20 54 45 58 54 20 61 66 74 65 uncate TEXT afte
4070: 72 20 43 4f 50 59 4c 45 4e 47 54 48 20 28 73 69 r COPYLENGTH (si
4080: 6e 67 6c 65 2d 62 79 74 65 29 20 63 68 61 72 61 ngle-byte) chara
4090: 63 74 65 72 73 2e 0a 2a 2a 20 20 20 20 20 20 20 cters..**
40a0: 31 3a 20 20 20 55 73 65 20 74 68 65 20 22 68 61 1: Use the "ha
40b0: 73 68 2d 64 69 67 69 74 73 22 20 73 65 74 74 69 sh-digits" setti
40c0: 6e 67 20 61 73 20 74 68 65 20 6c 69 6d 69 74 2e ng as the limit.
40d0: 0a 2a 2a 20 20 20 20 20 20 20 32 3a 20 20 20 55 .** 2: U
40e0: 73 65 20 74 68 65 20 6c 65 6e 67 74 68 20 61 70 se the length ap
40f0: 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 55 52 propriate for UR
4100: 4c 73 20 61 73 20 74 68 65 20 6c 69 6d 69 74 20 Ls as the limit
4110: 28 64 65 66 69 6e 65 64 20 61 74 0a 2a 2a 20 20 (defined at.**
4120: 20 20 20 20 20 20 20 20 20 20 63 6f 6d 70 69 6c compil
4130: 65 2d 74 69 6d 65 20 62 79 20 46 4f 53 53 49 4c e-time by FOSSIL
4140: 5f 48 41 53 48 5f 44 49 47 49 54 53 5f 55 52 4c _HASH_DIGITS_URL
4150: 2c 20 64 65 66 61 75 6c 74 73 20 74 6f 20 31 36 , defaults to 16
4160: 29 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 74 79 6c )..*/.char *styl
4170: 65 5f 63 6f 70 79 5f 62 75 74 74 6f 6e 28 0a 20 e_copy_button(.
4180: 20 69 6e 74 20 62 4f 75 74 70 75 74 43 47 49 2c int bOutputCGI,
4190: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 6e 27 /* Don'
41a0: 74 20 72 65 74 75 72 6e 20 72 65 73 75 6c 74 2c t return result,
41b0: 20 62 75 74 20 73 65 6e 64 20 74 6f 20 63 67 69 but send to cgi
41c0: 5f 70 72 69 6e 74 66 28 29 2e 20 2a 2f 0a 20 20 _printf(). */.
41d0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 72 const char *zTar
41e0: 67 65 74 49 64 2c 20 20 2f 2a 20 54 68 65 20 54 getId, /* The T
41f0: 41 52 47 45 54 49 44 20 61 72 67 75 6d 65 6e 74 ARGETID argument
4200: 2e 20 2a 2f 0a 20 20 69 6e 74 20 62 46 6c 69 70 . */. int bFlip
4210: 70 65 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f ped, /
4220: 2a 20 54 68 65 20 46 4c 49 50 50 45 44 20 61 72 * The FLIPPED ar
4230: 67 75 6d 65 6e 74 2e 20 2a 2f 0a 20 20 69 6e 74 gument. */. int
4240: 20 63 63 68 4c 65 6e 67 74 68 2c 20 20 20 20 20 cchLength,
4250: 20 20 20 20 20 2f 2a 20 54 68 65 20 43 4f 50 59 /* The COPY
4260: 4c 45 4e 47 54 48 20 61 72 67 75 6d 65 6e 74 2e LENGTH argument.
4270: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 */. const char
4280: 20 2a 7a 54 65 78 74 46 6d 74 2c 20 20 20 2f 2a *zTextFmt, /*
4290: 20 46 6f 72 6d 61 74 74 69 6e 67 20 6f 66 20 74 Formatting of t
42a0: 68 65 20 54 45 58 54 20 61 72 67 75 6d 65 6e 74 he TEXT argument
42b0: 20 28 68 74 6d 6c 69 7a 65 64 29 2e 20 2a 2f 0a (htmlized). */.
42c0: 20 20 2e 2e 2e 20 20 20 20 20 20 20 20 20 20 20 ...
42d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 /* For
42e0: 6d 61 74 74 69 6e 67 20 70 61 72 61 6d 65 74 65 matting paramete
42f0: 72 73 20 6f 66 20 74 68 65 20 54 45 58 54 20 61 rs of the TEXT a
4300: 72 67 75 6d 65 6e 74 2e 20 2a 2f 0a 29 7b 0a 20 rgument. */.){.
4310: 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 63 va_list ap;. c
4320: 68 61 72 20 2a 7a 54 65 78 74 3b 0a 20 20 63 68 har *zText;. ch
4330: 61 72 20 2a 7a 52 65 73 75 6c 74 20 3d 20 30 3b ar *zResult = 0;
4340: 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 7a . va_start(ap,z
4350: 54 65 78 74 46 6d 74 29 3b 0a 20 20 7a 54 65 78 TextFmt);. zTex
4360: 74 20 3d 20 76 6d 70 72 69 6e 74 66 28 7a 54 65 t = vmprintf(zTe
4370: 78 74 46 6d 74 2f 2a 77 6f 72 6b 73 2d 6c 69 6b xtFmt/*works-lik
4380: 65 3a 3f 2a 2f 2c 61 70 29 3b 0a 20 20 76 61 5f e:?*/,ap);. va_
4390: 65 6e 64 28 61 70 29 3b 0a 20 20 69 66 28 20 63 end(ap);. if( c
43a0: 63 68 4c 65 6e 67 74 68 3d 3d 31 20 29 20 63 63 chLength==1 ) cc
43b0: 68 4c 65 6e 67 74 68 20 3d 20 68 61 73 68 5f 64 hLength = hash_d
43c0: 69 67 69 74 73 28 30 29 3b 0a 20 20 65 6c 73 65 igits(0);. else
43d0: 20 69 66 28 20 63 63 68 4c 65 6e 67 74 68 3d 3d if( cchLength==
43e0: 32 20 29 20 63 63 68 4c 65 6e 67 74 68 20 3d 20 2 ) cchLength =
43f0: 68 61 73 68 5f 64 69 67 69 74 73 28 31 29 3b 0a hash_digits(1);.
4400: 20 20 69 66 28 20 21 62 46 6c 69 70 70 65 64 20 if( !bFlipped
4410: 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 ){. const cha
4420: 72 20 2a 7a 42 74 6e 46 6d 74 20 3d 0a 20 20 20 r *zBtnFmt =.
4430: 20 20 20 22 3c 73 70 61 6e 20 63 6c 61 73 73 3d "<span class=
4440: 5c 22 6e 6f 62 72 5c 22 3e 22 0a 20 20 20 20 20 \"nobr\">".
4450: 20 22 3c 73 70 61 6e 20 22 0a 20 20 20 20 20 20 "<span ".
4460: 22 63 6c 61 73 73 3d 5c 22 63 6f 70 79 2d 62 75 "class=\"copy-bu
4470: 74 74 6f 6e 5c 22 20 22 0a 20 20 20 20 20 20 22 tton\" ". "
4480: 69 64 3d 5c 22 63 6f 70 79 2d 25 68 5c 22 20 22 id=\"copy-%h\" "
4490: 0a 20 20 20 20 20 20 22 64 61 74 61 2d 63 6f 70 . "data-cop
44a0: 79 74 61 72 67 65 74 3d 5c 22 25 68 5c 22 20 22 ytarget=\"%h\" "
44b0: 0a 20 20 20 20 20 20 22 64 61 74 61 2d 63 6f 70 . "data-cop
44c0: 79 6c 65 6e 67 74 68 3d 5c 22 25 64 5c 22 3e 22 ylength=\"%d\">"
44d0: 0a 20 20 20 20 20 20 22 3c 2f 73 70 61 6e 3e 22 . "</span>"
44e0: 0a 20 20 20 20 20 20 22 3c 73 70 61 6e 20 69 64 . "<span id
44f0: 3d 5c 22 25 68 5c 22 3e 22 0a 20 20 20 20 20 20 =\"%h\">".
4500: 22 25 73 22 0a 20 20 20 20 20 20 22 3c 2f 73 70 "%s". "</sp
4510: 61 6e 3e 22 0a 20 20 20 20 20 20 22 3c 2f 73 70 an>". "</sp
4520: 61 6e 3e 22 3b 0a 20 20 20 20 69 66 28 20 62 4f an>";. if( bO
4530: 75 74 70 75 74 43 47 49 20 29 7b 0a 20 20 20 20 utputCGI ){.
4540: 20 20 63 67 69 5f 70 72 69 6e 74 66 28 0a 20 20 cgi_printf(.
4550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
4560: 7a 42 74 6e 46 6d 74 2f 2a 77 6f 72 6b 73 2d 6c zBtnFmt/*works-l
4570: 69 6b 65 3a 22 25 68 25 68 25 64 25 68 25 73 22 ike:"%h%h%d%h%s"
4580: 2a 2f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 */,.
4590: 20 20 20 20 20 20 7a 54 61 72 67 65 74 49 64 2c zTargetId,
45a0: 7a 54 61 72 67 65 74 49 64 2c 63 63 68 4c 65 6e zTargetId,cchLen
45b0: 67 74 68 2c 7a 54 61 72 67 65 74 49 64 2c 7a 54 gth,zTargetId,zT
45c0: 65 78 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b ext);. }else{
45d0: 0a 20 20 20 20 20 20 7a 52 65 73 75 6c 74 20 3d . zResult =
45e0: 20 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 mprintf(.
45f0: 20 20 20 20 20 20 20 20 20 20 20 20 7a 42 74 6e zBtn
4600: 46 6d 74 2f 2a 77 6f 72 6b 73 2d 6c 69 6b 65 3a Fmt/*works-like:
4610: 22 25 68 25 68 25 64 25 68 25 73 22 2a 2f 2c 0a "%h%h%d%h%s"*/,.
4620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
4630: 20 20 7a 54 61 72 67 65 74 49 64 2c 7a 54 61 72 zTargetId,zTar
4640: 67 65 74 49 64 2c 63 63 68 4c 65 6e 67 74 68 2c getId,cchLength,
4650: 7a 54 61 72 67 65 74 49 64 2c 7a 54 65 78 74 29 zTargetId,zText)
4660: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b ;. }. }else{
4670: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 . const char
4680: 2a 7a 42 74 6e 46 6d 74 20 3d 0a 20 20 20 20 20 *zBtnFmt =.
4690: 20 22 3c 73 70 61 6e 20 63 6c 61 73 73 3d 5c 22 "<span class=\"
46a0: 6e 6f 62 72 5c 22 3e 22 0a 20 20 20 20 20 20 22 nobr\">". "
46b0: 3c 73 70 61 6e 20 69 64 3d 5c 22 25 68 5c 22 3e <span id=\"%h\">
46c0: 22 0a 20 20 20 20 20 20 22 25 73 22 0a 20 20 20 ". "%s".
46d0: 20 20 20 22 3c 2f 73 70 61 6e 3e 22 0a 20 20 20 "</span>".
46e0: 20 20 20 22 3c 73 70 61 6e 20 22 0a 20 20 20 20 "<span ".
46f0: 20 20 22 63 6c 61 73 73 3d 5c 22 63 6f 70 79 2d "class=\"copy-
4700: 62 75 74 74 6f 6e 20 63 6f 70 79 2d 62 75 74 74 button copy-butt
4710: 6f 6e 2d 66 6c 69 70 70 65 64 5c 22 20 22 0a 20 on-flipped\" ".
4720: 20 20 20 20 20 22 69 64 3d 5c 22 63 6f 70 79 2d "id=\"copy-
4730: 25 68 5c 22 20 22 0a 20 20 20 20 20 20 22 64 61 %h\" ". "da
4740: 74 61 2d 63 6f 70 79 74 61 72 67 65 74 3d 5c 22 ta-copytarget=\"
4750: 25 68 5c 22 20 22 0a 20 20 20 20 20 20 22 64 61 %h\" ". "da
4760: 74 61 2d 63 6f 70 79 6c 65 6e 67 74 68 3d 5c 22 ta-copylength=\"
4770: 25 64 5c 22 3e 22 0a 20 20 20 20 20 20 22 3c 2f %d\">". "</
4780: 73 70 61 6e 3e 22 0a 20 20 20 20 20 20 22 3c 2f span>". "</
4790: 73 70 61 6e 3e 22 3b 0a 20 20 20 20 69 66 28 20 span>";. if(
47a0: 62 4f 75 74 70 75 74 43 47 49 20 29 7b 0a 20 20 bOutputCGI ){.
47b0: 20 20 20 20 63 67 69 5f 70 72 69 6e 74 66 28 0a cgi_printf(.
47c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
47d0: 20 20 7a 42 74 6e 46 6d 74 2f 2a 77 6f 72 6b 73 zBtnFmt/*works
47e0: 2d 6c 69 6b 65 3a 22 25 68 25 73 25 68 25 68 25 -like:"%h%s%h%h%
47f0: 64 22 2a 2f 2c 0a 20 20 20 20 20 20 20 20 20 20 d"*/,.
4800: 20 20 20 20 20 20 20 20 7a 54 61 72 67 65 74 49 zTargetI
4810: 64 2c 7a 54 65 78 74 2c 7a 54 61 72 67 65 74 49 d,zText,zTargetI
4820: 64 2c 7a 54 61 72 67 65 74 49 64 2c 63 63 68 4c d,zTargetId,cchL
4830: 65 6e 67 74 68 29 3b 0a 20 20 20 20 7d 65 6c 73 ength);. }els
4840: 65 7b 0a 20 20 20 20 20 20 7a 52 65 73 75 6c 74 e{. zResult
4850: 20 3d 20 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 = mprintf(.
4860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 42 zB
4870: 74 6e 46 6d 74 2f 2a 77 6f 72 6b 73 2d 6c 69 6b tnFmt/*works-lik
4880: 65 3a 22 25 68 25 73 25 68 25 68 25 64 22 2a 2f e:"%h%s%h%h%d"*/
4890: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,.
48a0: 20 20 20 20 7a 54 61 72 67 65 74 49 64 2c 7a 54 zTargetId,zT
48b0: 65 78 74 2c 7a 54 61 72 67 65 74 49 64 2c 7a 54 ext,zTargetId,zT
48c0: 61 72 67 65 74 49 64 2c 63 63 68 4c 65 6e 67 74 argetId,cchLengt
48d0: 68 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 h);. }. }.
48e0: 66 72 65 65 28 7a 54 65 78 74 29 3b 0a 20 20 62 free(zText);. b
48f0: 75 69 6c 74 69 6e 5f 72 65 71 75 65 73 74 5f 6a uiltin_request_j
4900: 73 28 22 63 6f 70 79 62 74 6e 2e 6a 73 22 29 3b s("copybtn.js");
4910: 0a 20 20 72 65 74 75 72 6e 20 7a 52 65 73 75 6c . return zResul
4920: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 t;.}../*.** Retu
4930: 72 6e 20 61 20 72 61 6e 64 6f 6d 20 6e 6f 6e 63 rn a random nonc
4940: 65 20 74 68 61 74 20 69 73 20 73 74 6f 72 65 64 e that is stored
4950: 20 69 6e 20 73 74 61 74 69 63 20 73 70 61 63 65 in static space
4960: 2e 20 20 46 6f 72 20 61 20 70 61 72 74 69 63 75 . For a particu
4970: 6c 61 72 0a 2a 2a 20 72 75 6e 2c 20 74 68 65 20 lar.** run, the
4980: 73 61 6d 65 20 6e 6f 6e 63 65 20 69 73 20 61 6c same nonce is al
4990: 77 61 79 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a ways returned..*
49a0: 2f 0a 63 68 61 72 20 2a 73 74 79 6c 65 5f 6e 6f /.char *style_no
49b0: 6e 63 65 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 nce(void){. sta
49c0: 74 69 63 20 63 68 61 72 20 7a 4e 6f 6e 63 65 5b tic char zNonce[
49d0: 35 32 5d 3b 0a 20 20 69 66 28 20 7a 4e 6f 6e 63 52];. if( zNonc
49e0: 65 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 75 e[0]==0 ){. u
49f0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a 53 65 nsigned char zSe
4a00: 65 64 5b 32 34 5d 3b 0a 20 20 20 20 73 71 6c 69 ed[24];. sqli
4a10: 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 32 te3_randomness(2
4a20: 34 2c 20 7a 53 65 65 64 29 3b 0a 20 20 20 20 65 4, zSeed);. e
4a30: 6e 63 6f 64 65 31 36 28 7a 53 65 65 64 2c 28 75 ncode16(zSeed,(u
4a40: 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 7a 4e nsigned char*)zN
4a50: 6f 6e 63 65 2c 32 34 29 3b 0a 20 20 7d 0a 20 20 once,24);. }.
4a60: 72 65 74 75 72 6e 20 7a 4e 6f 6e 63 65 3b 0a 7d return zNonce;.}
4a70: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 ../*.** Return t
4a80: 68 65 20 64 65 66 61 75 6c 74 20 43 6f 6e 74 65 he default Conte
4a90: 6e 74 20 53 65 63 75 72 69 74 79 20 50 6f 6c 69 nt Security Poli
4aa0: 63 79 20 28 43 53 50 29 20 73 74 72 69 6e 67 2e cy (CSP) string.
4ab0: 0a 2a 2a 20 49 66 20 74 68 65 20 74 6f 48 65 61 .** If the toHea
4ac0: 64 65 72 20 61 72 67 75 6d 65 6e 74 20 69 73 20 der argument is
4ad0: 74 72 75 65 2c 20 74 68 65 6e 20 61 6c 73 6f 20 true, then also
4ae0: 61 64 64 20 74 68 65 0a 2a 2a 20 43 53 50 20 74 add the.** CSP t
4af0: 6f 20 74 68 65 20 48 54 54 50 20 72 65 70 6c 79 o the HTTP reply
4b00: 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 header..**.** T
4b10: 68 65 20 43 53 50 20 63 6f 6d 65 73 20 66 72 6f he CSP comes fro
4b20: 6d 20 74 68 65 20 22 64 65 66 61 75 6c 74 2d 63 m the "default-c
4b30: 73 70 22 20 73 65 74 74 69 6e 67 20 69 66 20 69 sp" setting if i
4b40: 74 20 65 78 69 73 74 73 20 61 6e 64 0a 2a 2a 20 t exists and.**
4b50: 69 73 20 6e 6f 6e 2d 65 6d 70 74 79 2e 20 20 49 is non-empty. I
4b60: 66 20 74 68 61 74 20 73 65 74 74 69 6e 67 20 69 f that setting i
4b70: 73 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e s an empty strin
4b80: 67 2c 20 74 68 65 6e 20 74 68 65 20 66 6f 6c 6c g, then the foll
4b90: 6f 77 69 6e 67 0a 2a 2a 20 64 65 66 61 75 6c 74 owing.** default
4ba0: 20 69 73 20 75 73 65 64 20 69 6e 73 74 65 61 64 is used instead
4bb0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 64 65 66 61 :.**.** defa
4bc0: 75 6c 74 2d 73 72 63 20 27 73 65 6c 66 27 20 64 ult-src 'self' d
4bd0: 61 74 61 3a 3b 0a 2a 2a 20 20 20 20 20 73 63 72 ata:;.** scr
4be0: 69 70 74 2d 73 72 63 20 27 73 65 6c 66 27 20 27 ipt-src 'self' '
4bf0: 6e 6f 6e 63 65 2d 24 6e 6f 6e 63 65 27 3b 0a 2a nonce-$nonce';.*
4c00: 2a 20 20 20 20 20 73 74 79 6c 65 2d 73 72 63 20 * style-src
4c10: 27 73 65 6c 66 27 20 27 75 6e 73 61 66 65 2d 69 'self' 'unsafe-i
4c20: 6e 6c 69 6e 65 27 3b 0a 2a 2a 20 20 20 20 20 69 nline';.** i
4c30: 6d 67 2d 73 72 63 20 2a 20 64 61 74 61 3a 3b 0a mg-src * data:;.
4c40: 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 78 74 20 27 **.** The text '
4c50: 24 6e 6f 6e 63 65 27 20 69 73 20 72 65 70 6c 61 $nonce' is repla
4c60: 63 65 64 20 62 79 20 73 74 79 6c 65 5f 6e 6f 6e ced by style_non
4c70: 63 65 28 29 20 69 66 20 61 6e 64 20 77 68 65 72 ce() if and wher
4c80: 65 65 76 65 72 20 69 74 0a 2a 2a 20 6f 63 63 75 eever it.** occu
4c90: 72 73 20 69 6e 20 74 68 65 20 69 6e 70 75 74 20 rs in the input
4ca0: 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 string..**.** Th
4cb0: 65 20 73 74 72 69 6e 67 20 72 65 74 75 72 6e 65 e string returne
4cc0: 64 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 d is obtained fr
4cd0: 6f 6d 20 66 6f 73 73 69 6c 5f 6d 61 6c 6c 6f 63 om fossil_malloc
4ce0: 28 29 20 61 6e 64 0a 2a 2a 20 73 68 6f 75 6c 64 () and.** should
4cf0: 20 62 65 20 72 65 6c 65 61 73 65 64 20 62 79 20 be released by
4d00: 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 63 the caller..*/.c
4d10: 68 61 72 20 2a 73 74 79 6c 65 5f 63 73 70 28 69 har *style_csp(i
4d20: 6e 74 20 74 6f 48 65 61 64 65 72 29 7b 0a 20 20 nt toHeader){.
4d30: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 static const cha
4d40: 72 20 7a 42 61 63 6b 75 70 43 53 50 5b 5d 20 3d r zBackupCSP[] =
4d50: 0a 20 20 20 22 64 65 66 61 75 6c 74 2d 73 72 63 . "default-src
4d60: 20 27 73 65 6c 66 27 20 64 61 74 61 3a 3b 20 22 'self' data:; "
4d70: 0a 20 20 20 22 73 63 72 69 70 74 2d 73 72 63 20 . "script-src
4d80: 27 73 65 6c 66 27 20 27 6e 6f 6e 63 65 2d 24 6e 'self' 'nonce-$n
4d90: 6f 6e 63 65 27 3b 20 22 0a 20 20 20 22 73 74 79 once'; ". "sty
4da0: 6c 65 2d 73 72 63 20 27 73 65 6c 66 27 20 27 75 le-src 'self' 'u
4db0: 6e 73 61 66 65 2d 69 6e 6c 69 6e 65 27 3b 20 22 nsafe-inline'; "
4dc0: 0a 20 20 20 22 69 6d 67 2d 73 72 63 20 2a 20 64 . "img-src * d
4dd0: 61 74 61 3a 22 3b 0a 20 20 63 6f 6e 73 74 20 63 ata:";. const c
4de0: 68 61 72 20 2a 7a 46 6f 72 6d 61 74 3b 0a 20 20 har *zFormat;.
4df0: 42 6c 6f 62 20 63 73 70 3b 0a 20 20 63 68 61 72 Blob csp;. char
4e00: 20 2a 7a 4e 6f 6e 63 65 3b 0a 20 20 63 68 61 72 *zNonce;. char
4e10: 20 2a 7a 43 73 70 3b 0a 20 20 69 6e 74 20 69 3b *zCsp;. int i;
4e20: 0a 20 20 7a 46 6f 72 6d 61 74 20 3d 20 64 62 5f . zFormat = db_
4e30: 67 65 74 28 22 64 65 66 61 75 6c 74 2d 63 73 70 get("default-csp
4e40: 22 2c 30 29 3b 0a 20 20 69 66 28 20 7a 46 6f 72 ",0);. if( zFor
4e50: 6d 61 74 3d 3d 30 20 7c 7c 20 7a 46 6f 72 6d 61 mat==0 || zForma
4e60: 74 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 7a t[0]==0 ){. z
4e70: 46 6f 72 6d 61 74 20 3d 20 7a 42 61 63 6b 75 70 Format = zBackup
4e80: 43 53 50 3b 0a 20 20 7d 0a 20 20 62 6c 6f 62 5f CSP;. }. blob_
4e90: 69 6e 69 74 28 26 63 73 70 2c 20 30 2c 20 30 29 init(&csp, 0, 0)
4ea0: 3b 0a 20 20 77 68 69 6c 65 28 20 7a 46 6f 72 6d ;. while( zForm
4eb0: 61 74 5b 30 5d 20 26 26 20 28 7a 4e 6f 6e 63 65 at[0] && (zNonce
4ec0: 20 3d 20 73 74 72 73 74 72 28 7a 46 6f 72 6d 61 = strstr(zForma
4ed0: 74 2c 22 24 6e 6f 6e 63 65 22 29 29 21 3d 30 20 t,"$nonce"))!=0
4ee0: 29 7b 0a 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 ){. blob_appe
4ef0: 6e 64 28 26 63 73 70 2c 20 7a 46 6f 72 6d 61 74 nd(&csp, zFormat
4f00: 2c 20 28 69 6e 74 29 28 7a 4e 6f 6e 63 65 20 2d , (int)(zNonce -
4f10: 20 7a 46 6f 72 6d 61 74 29 29 3b 0a 20 20 20 20 zFormat));.
4f20: 62 6c 6f 62 5f 61 70 70 65 6e 64 28 26 63 73 70 blob_append(&csp
4f30: 2c 20 73 74 79 6c 65 5f 6e 6f 6e 63 65 28 29 2c , style_nonce(),
4f40: 20 2d 31 29 3b 0a 20 20 20 20 7a 46 6f 72 6d 61 -1);. zForma
4f50: 74 20 3d 20 7a 4e 6f 6e 63 65 20 2b 20 36 3b 0a t = zNonce + 6;.
4f60: 20 20 7d 0a 20 20 62 6c 6f 62 5f 61 70 70 65 6e }. blob_appen
4f70: 64 28 26 63 73 70 2c 20 7a 46 6f 72 6d 61 74 2c d(&csp, zFormat,
4f80: 20 2d 31 29 3b 0a 20 20 7a 43 73 70 20 3d 20 62 -1);. zCsp = b
4f90: 6c 6f 62 5f 73 74 72 28 26 63 73 70 29 3b 0a 20 lob_str(&csp);.
4fa0: 20 2f 2a 20 4e 6f 20 77 68 69 74 65 73 70 61 63 /* No whitespac
4fb0: 65 20 6f 74 68 65 72 20 74 68 61 6e 20 61 63 74 e other than act
4fc0: 75 61 6c 20 73 70 61 63 65 20 63 68 61 72 61 63 ual space charac
4fd0: 74 65 72 73 20 61 6c 6c 6f 77 65 64 20 69 6e 20 ters allowed in
4fe0: 74 68 65 20 43 53 50 0a 20 20 2a 2a 20 73 74 72 the CSP. ** str
4ff0: 69 6e 67 2e 20 20 53 65 65 20 68 74 74 70 73 3a ing. See https:
5000: 2f 2f 66 6f 73 73 69 6c 2d 73 63 6d 2e 6f 72 67 //fossil-scm.org
5010: 2f 66 6f 72 75 6d 2f 66 6f 72 75 6d 70 6f 73 74 /forum/forumpost
5020: 2f 64 32 39 65 33 61 66 34 33 63 20 2a 2f 0a 20 /d29e3af43c */.
5030: 20 66 6f 72 28 69 3d 30 3b 20 7a 43 73 70 5b 69 for(i=0; zCsp[i
5040: 5d 3b 20 69 2b 2b 29 7b 20 69 66 28 20 66 6f 73 ]; i++){ if( fos
5050: 73 69 6c 5f 69 73 73 70 61 63 65 28 7a 43 73 70 sil_isspace(zCsp
5060: 5b 69 5d 29 20 29 20 7a 43 73 70 5b 69 5d 20 3d [i]) ) zCsp[i] =
5070: 20 27 20 27 3b 20 7d 0a 20 20 69 66 28 20 74 6f ' '; }. if( to
5080: 48 65 61 64 65 72 20 29 7b 0a 20 20 20 20 63 67 Header ){. cg
5090: 69 5f 70 72 69 6e 74 66 5f 68 65 61 64 65 72 28 i_printf_header(
50a0: 22 43 6f 6e 74 65 6e 74 2d 53 65 63 75 72 69 74 "Content-Securit
50b0: 79 2d 50 6f 6c 69 63 79 3a 20 25 73 5c 72 5c 6e y-Policy: %s\r\n
50c0: 22 2c 20 7a 43 73 70 29 3b 0a 20 20 7d 0a 20 20 ", zCsp);. }.
50d0: 72 65 74 75 72 6e 20 7a 43 73 70 3b 0a 7d 0a 0a return zCsp;.}..
50e0: 2f 2a 0a 2a 2a 20 44 65 66 61 75 6c 74 20 48 54 /*.** Default HT
50f0: 4d 4c 20 70 61 67 65 20 68 65 61 64 65 72 20 74 ML page header t
5100: 65 78 74 20 74 68 72 6f 75 67 68 20 3c 62 6f 64 ext through <bod
5110: 79 3e 2e 20 20 49 66 20 74 68 65 20 72 65 70 6f y>. If the repo
5120: 73 69 74 6f 72 79 2d 73 70 65 63 69 66 69 63 0a sitory-specific.
5130: 2a 2a 20 68 65 61 64 65 72 20 74 65 6d 70 6c 61 ** header templa
5140: 74 65 20 6c 61 63 6b 73 20 61 20 3c 62 6f 64 79 te lacks a <body
5150: 3e 20 74 61 67 2c 20 74 68 65 6e 20 61 6c 6c 20 > tag, then all
5160: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 of the following
5170: 20 69 73 0a 2a 2a 20 70 72 65 70 65 6e 64 65 64 is.** prepended
5180: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 ..*/.static cons
5190: 74 20 63 68 61 72 20 7a 44 66 6c 74 48 65 61 64 t char zDfltHead
51a0: 65 72 5b 5d 20 3d 0a 40 20 3c 68 74 6d 6c 3e 0a er[] =.@ <html>.
51b0: 40 20 3c 68 65 61 64 3e 0a 40 20 3c 6d 65 74 61 @ <head>.@ <meta
51c0: 20 63 68 61 72 73 65 74 3d 22 55 54 46 2d 38 22 charset="UTF-8"
51d0: 3e 0a 40 20 3c 62 61 73 65 20 68 72 65 66 3d 22 >.@ <base href="
51e0: 24 62 61 73 65 75 72 6c 2f 24 63 75 72 72 65 6e $baseurl/$curren
51f0: 74 5f 70 61 67 65 22 3e 0a 40 20 3c 6d 65 74 61 t_page">.@ <meta
5200: 20 68 74 74 70 2d 65 71 75 69 76 3d 22 43 6f 6e http-equiv="Con
5210: 74 65 6e 74 2d 53 65 63 75 72 69 74 79 2d 50 6f tent-Security-Po
5220: 6c 69 63 79 22 20 63 6f 6e 74 65 6e 74 3d 22 24 licy" content="$
5230: 64 65 66 61 75 6c 74 5f 63 73 70 22 3e 0a 40 20 default_csp">.@
5240: 3c 6d 65 74 61 20 6e 61 6d 65 3d 22 76 69 65 77 <meta name="view
5250: 70 6f 72 74 22 20 63 6f 6e 74 65 6e 74 3d 22 77 port" content="w
5260: 69 64 74 68 3d 64 65 76 69 63 65 2d 77 69 64 74 idth=device-widt
5270: 68 2c 20 69 6e 69 74 69 61 6c 2d 73 63 61 6c 65 h, initial-scale
5280: 3d 31 2e 30 22 3e 0a 40 20 3c 74 69 74 6c 65 3e =1.0">.@ <title>
5290: 24 3c 70 72 6f 6a 65 63 74 5f 6e 61 6d 65 3e 3a $<project_name>:
52a0: 20 24 3c 74 69 74 6c 65 3e 3c 2f 74 69 74 6c 65 $<title></title
52b0: 3e 0a 40 20 3c 6c 69 6e 6b 20 72 65 6c 3d 22 61 >.@ <link rel="a
52c0: 6c 74 65 72 6e 61 74 65 22 20 74 79 70 65 3d 22 lternate" type="
52d0: 61 70 70 6c 69 63 61 74 69 6f 6e 2f 72 73 73 2b application/rss+
52e0: 78 6d 6c 22 20 74 69 74 6c 65 3d 22 52 53 53 20 xml" title="RSS
52f0: 46 65 65 64 22 20 5c 0a 40 20 20 68 72 65 66 3d Feed" \.@ href=
5300: 22 24 68 6f 6d 65 2f 74 69 6d 65 6c 69 6e 65 2e "$home/timeline.
5310: 72 73 73 22 3e 0a 40 20 3c 6c 69 6e 6b 20 72 65 rss">.@ <link re
5320: 6c 3d 22 73 74 79 6c 65 73 68 65 65 74 22 20 68 l="stylesheet" h
5330: 72 65 66 3d 22 24 73 74 79 6c 65 73 68 65 65 74 ref="$stylesheet
5340: 5f 75 72 6c 22 20 74 79 70 65 3d 22 74 65 78 74 _url" type="text
5350: 2f 63 73 73 22 3e 0a 40 20 3c 2f 68 65 61 64 3e /css">.@ </head>
5360: 0a 40 20 3c 62 6f 64 79 20 63 6c 61 73 73 3d 22 .@ <body class="
5370: 24 63 75 72 72 65 6e 74 5f 66 65 61 74 75 72 65 $current_feature
5380: 20 72 70 61 67 65 2d 24 72 65 71 75 65 73 74 65 rpage-$requeste
5390: 64 5f 70 61 67 65 20 63 70 61 67 65 2d 24 63 61 d_page cpage-$ca
53a0: 6e 6f 6e 69 63 61 6c 5f 70 61 67 65 22 3e 0a 3b nonical_page">.;
53b0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20 ../*.** Returns
53c0: 74 68 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 the default page
53d0: 20 68 65 61 64 65 72 2e 0a 2a 2f 0a 63 6f 6e 73 header..*/.cons
53e0: 74 20 63 68 61 72 20 2a 67 65 74 5f 64 65 66 61 t char *get_defa
53f0: 75 6c 74 5f 68 65 61 64 65 72 28 29 7b 0a 20 20 ult_header(){.
5400: 72 65 74 75 72 6e 20 7a 44 66 6c 74 48 65 61 64 return zDfltHead
5410: 65 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 er;.}../*.** The
5420: 20 64 65 66 61 75 6c 74 20 54 43 4c 20 6c 69 73 default TCL lis
5430: 74 20 74 68 61 74 20 64 65 66 69 6e 65 73 20 74 t that defines t
5440: 68 65 20 6d 61 69 6e 20 6d 65 6e 75 2e 0a 2a 2f he main menu..*/
5450: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 .static const ch
5460: 61 72 20 7a 44 66 6c 74 4d 61 69 6e 4d 65 6e 75 ar zDfltMainMenu
5470: 5b 5d 20 3d 0a 40 20 48 6f 6d 65 20 20 20 20 20 [] =.@ Home
5480: 20 2f 68 6f 6d 65 20 20 20 20 20 20 20 20 2a 20 /home *
5490: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 7d 0a {}.
54a0: 40 20 54 69 6d 65 6c 69 6e 65 20 20 2f 74 69 6d @ Timeline /tim
54b0: 65 6c 69 6e 65 20 20 20 20 7b 6f 20 72 20 6a 7d eline {o r j}
54c0: 20 20 20 20 20 20 20 20 7b 7d 0a 40 20 46 69 6c {}.@ Fil
54d0: 65 73 20 20 20 20 20 2f 64 69 72 3f 63 69 3d 74 es /dir?ci=t
54e0: 69 70 20 20 6f 68 20 20 20 20 20 20 20 20 20 20 ip oh
54f0: 20 20 20 64 65 73 6b 74 6f 70 6f 6e 6c 79 0a 40 desktoponly.@
5500: 20 42 72 61 6e 63 68 65 73 20 20 2f 62 72 6c 69 Branches /brli
5510: 73 74 20 20 20 20 20 20 6f 20 20 20 20 20 20 20 st o
5520: 20 20 20 20 20 20 20 77 69 64 65 6f 6e 6c 79 0a wideonly.
5530: 40 20 54 61 67 73 20 20 20 20 20 20 2f 74 61 67 @ Tags /tag
5540: 6c 69 73 74 20 20 20 20 20 6f 20 20 20 20 20 20 list o
5550: 20 20 20 20 20 20 20 20 77 69 64 65 6f 6e 6c 79 wideonly
5560: 0a 40 20 46 6f 72 75 6d 20 20 20 20 20 2f 66 6f .@ Forum /fo
5570: 72 75 6d 20 20 20 20 20 20 20 7b 40 32 20 33 20 rum {@2 3
5580: 34 20 35 20 36 7d 20 20 20 77 69 64 65 6f 6e 6c 4 5 6} wideonl
5590: 79 0a 40 20 43 68 61 74 20 20 20 20 20 20 2f 63 y.@ Chat /c
55a0: 68 61 74 20 20 20 20 20 20 20 20 43 20 20 20 20 hat C
55b0: 20 20 20 20 20 20 20 20 20 20 77 69 64 65 6f 6e wideon
55c0: 6c 79 0a 40 20 54 69 63 6b 65 74 73 20 20 20 2f ly.@ Tickets /
55d0: 74 69 63 6b 65 74 20 20 20 20 20 20 72 20 20 20 ticket r
55e0: 20 20 20 20 20 20 20 20 20 20 20 77 69 64 65 6f wideo
55f0: 6e 6c 79 0a 40 20 57 69 6b 69 20 20 20 20 20 20 nly.@ Wiki
5600: 2f 77 69 6b 69 20 20 20 20 20 20 20 20 6a 20 20 /wiki j
5610: 20 20 20 20 20 20 20 20 20 20 20 20 77 69 64 65 wide
5620: 6f 6e 6c 79 0a 40 20 41 64 6d 69 6e 20 20 20 20 only.@ Admin
5630: 20 2f 73 65 74 75 70 20 20 20 20 20 20 20 7b 61 /setup {a
5640: 20 73 7d 20 20 20 20 20 20 20 20 20 20 64 65 73 s} des
5650: 6b 74 6f 70 6f 6e 6c 79 0a 40 20 4c 6f 67 6f 75 ktoponly.@ Logou
5660: 74 20 20 20 20 2f 6c 6f 67 6f 75 74 20 20 20 20 t /logout
5670: 20 20 4c 20 20 20 20 20 20 20 20 20 20 20 20 20 L
5680: 20 77 69 64 65 6f 6e 6c 79 0a 40 20 4c 6f 67 69 wideonly.@ Logi
5690: 6e 20 20 20 20 20 2f 6c 6f 67 69 6e 20 20 20 20 n /login
56a0: 20 20 20 21 4c 20 20 20 20 20 20 20 20 20 20 20 !L
56b0: 20 20 77 69 64 65 6f 6e 6c 79 0a 3b 0a 0a 2f 2a wideonly.;../*
56c0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 .** Return the d
56d0: 65 66 61 75 6c 74 20 6d 65 6e 75 0a 2a 2f 0a 63 efault menu.*/.c
56e0: 6f 6e 73 74 20 63 68 61 72 20 2a 73 74 79 6c 65 onst char *style
56f0: 5f 64 65 66 61 75 6c 74 5f 6d 61 69 6e 6d 65 6e _default_mainmen
5700: 75 28 76 6f 69 64 29 7b 0a 20 20 72 65 74 75 72 u(void){. retur
5710: 6e 20 7a 44 66 6c 74 4d 61 69 6e 4d 65 6e 75 3b n zDfltMainMenu;
5720: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 .}../*.** Given
5730: 61 20 55 52 4c 20 70 61 74 68 2c 20 65 78 74 72 a URL path, extr
5740: 61 63 74 20 74 68 65 20 66 69 72 73 74 20 65 6c act the first el
5750: 65 6d 65 6e 74 20 61 73 20 61 20 22 66 65 61 74 ement as a "feat
5760: 75 72 65 22 20 6e 61 6d 65 2c 0a 2a 2a 20 75 73 ure" name,.** us
5770: 65 64 20 61 73 20 74 68 65 20 3c 62 6f 64 79 20 ed as the <body
5780: 63 6c 61 73 73 3d 22 46 45 41 54 55 52 45 22 3e class="FEATURE">
5790: 20 76 61 6c 75 65 20 62 79 20 64 65 66 61 75 6c value by defaul
57a0: 74 2c 20 74 68 6f 75 67 68 0a 2a 2a 20 6c 61 74 t, though.** lat
57b0: 65 72 2d 72 75 6e 6e 69 6e 67 20 63 6f 64 65 20 er-running code
57c0: 6d 61 79 20 6f 76 65 72 72 69 64 65 20 74 68 69 may override thi
57d0: 73 2c 20 74 79 70 69 63 61 6c 6c 79 20 74 6f 20 s, typically to
57e0: 67 72 6f 75 70 20 6d 75 6c 74 69 70 6c 65 0a 2a group multiple.*
57f0: 2a 20 46 6f 73 73 69 6c 20 55 49 20 55 52 4c 73 * Fossil UI URLs
5800: 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 22 into a single "
5810: 66 65 61 74 75 72 65 22 20 73 6f 20 79 6f 75 20 feature" so you
5820: 63 61 6e 20 68 61 76 65 20 70 65 72 2d 66 65 61 can have per-fea
5830: 74 75 72 65 0a 2a 2a 20 43 53 53 20 72 75 6c 65 ture.** CSS rule
5840: 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 s..**.** For exa
5850: 6d 70 6c 65 2c 20 22 62 6f 64 79 2e 66 6f 72 75 mple, "body.foru
5860: 6d 20 64 69 76 2e 6d 61 72 6b 64 6f 77 6e 20 62 m div.markdown b
5870: 6c 6f 63 6b 71 75 6f 74 65 22 20 74 61 72 67 65 lockquote" targe
5880: 74 73 20 6f 6e 6c 79 0a 2a 2a 20 62 6c 6f 63 6b ts only.** block
5890: 20 71 75 6f 74 65 73 20 6d 61 64 65 20 69 6e 20 quotes made in
58a0: 66 6f 72 75 6d 20 70 6f 73 74 73 2c 20 6c 65 61 forum posts, lea
58b0: 76 69 6e 67 20 6f 74 68 65 72 20 4d 61 72 6b 64 ving other Markd
58c0: 6f 77 6e 20 71 75 6f 74 65 73 0a 2a 2a 20 61 6c own quotes.** al
58d0: 6f 6e 65 2e 20 20 42 65 63 61 75 73 65 20 66 65 one. Because fe
58e0: 61 74 75 72 65 20 63 6c 61 73 73 20 22 66 6f 72 ature class "for
58f0: 75 6d 22 20 67 72 6f 75 70 73 20 2f 66 6f 72 75 um" groups /foru
5900: 6d 6d 61 69 6e 2c 20 2f 66 6f 72 75 6d 70 6f 73 mmain, /forumpos
5910: 74 2c 0a 2a 2a 20 61 6e 64 20 2f 66 6f 72 75 6d t,.** and /forum
5920: 65 32 2c 20 69 74 20 77 6f 72 6b 73 20 61 63 72 e2, it works acr
5930: 6f 73 73 20 61 6c 6c 20 72 65 6e 64 65 72 69 6e oss all renderin
5940: 67 73 20 6f 66 20 4d 61 72 6b 64 6f 77 6e 20 74 gs of Markdown t
5950: 6f 20 48 54 4d 4c 0a 2a 2a 20 77 69 74 68 69 6e o HTML.** within
5960: 20 74 68 65 20 46 6f 73 73 69 6c 20 66 6f 72 75 the Fossil foru
5970: 6d 20 66 65 61 74 75 72 65 2e 0a 2a 2f 0a 73 74 m feature..*/.st
5980: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 2a atic const char*
5990: 20 66 65 61 74 75 72 65 5f 66 72 6f 6d 5f 70 61 feature_from_pa
59a0: 67 65 5f 70 61 74 68 28 63 6f 6e 73 74 20 63 68 ge_path(const ch
59b0: 61 72 20 2a 7a 50 61 74 68 29 7b 0a 20 20 63 6f ar *zPath){. co
59c0: 6e 73 74 20 63 68 61 72 2a 20 7a 53 6c 61 73 68 nst char* zSlash
59d0: 20 3d 20 73 74 72 63 68 72 28 7a 50 61 74 68 2c = strchr(zPath,
59e0: 20 27 2f 27 29 3b 0a 20 20 69 66 20 28 7a 53 6c '/');. if (zSl
59f0: 61 73 68 29 20 7b 0a 20 20 20 20 72 65 74 75 72 ash) {. retur
5a00: 6e 20 66 6f 73 73 69 6c 5f 73 74 72 6e 64 75 70 n fossil_strndup
5a10: 28 7a 50 61 74 68 2c 20 7a 53 6c 61 73 68 20 2d (zPath, zSlash -
5a20: 20 7a 50 61 74 68 29 3b 0a 20 20 7d 20 65 6c 73 zPath);. } els
5a30: 65 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 7a e {. return z
5a40: 50 61 74 68 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a Path;. }.}../*.
5a50: 2a 2a 20 4f 76 65 72 72 69 64 65 20 74 68 65 20 ** Override the
5a60: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 54 48 31 value of the TH1
5a70: 20 76 61 72 69 61 62 6c 65 20 63 75 72 72 65 6e variable curren
5a80: 74 5f 66 65 61 74 75 72 65 2c 20 69 74 73 20 64 t_feature, its d
5a90: 65 66 61 75 6c 74 0a 2a 2a 20 73 65 74 20 62 79 efault.** set by
5aa0: 20 66 65 61 74 75 72 65 5f 66 72 6f 6d 5f 70 61 feature_from_pa
5ab0: 67 65 5f 70 61 74 68 28 29 2e 20 20 57 65 20 64 ge_path(). We d
5ac0: 6f 20 6e 6f 74 20 63 61 6c 6c 20 74 68 69 73 20 o not call this
5ad0: 66 72 6f 6d 0a 2a 2a 20 73 74 79 6c 65 5f 69 6e from.** style_in
5ae0: 69 74 5f 74 68 31 5f 76 61 72 73 28 29 20 62 65 it_th1_vars() be
5af0: 63 61 75 73 65 20 74 68 61 74 20 75 73 65 73 20 cause that uses
5b00: 54 68 5f 4d 61 79 62 65 53 74 6f 72 65 28 29 20 Th_MaybeStore()
5b10: 69 6e 73 74 65 61 64 20 74 6f 0a 2a 2a 20 61 6c instead to.** al
5b20: 6c 6f 77 20 77 65 62 70 61 67 65 20 69 6d 70 6c low webpage impl
5b30: 65 6d 65 6e 74 61 74 69 6f 6e 73 20 74 6f 20 63 ementations to c
5b40: 61 6c 6c 20 74 68 69 73 20 62 65 66 6f 72 65 20 all this before
5b50: 73 74 79 6c 65 5f 68 65 61 64 65 72 28 29 0a 2a style_header().*
5b60: 2a 20 74 6f 20 6f 76 65 72 72 69 64 65 20 74 68 * to override th
5b70: 61 74 20 22 6d 61 79 62 65 22 20 64 65 66 61 75 at "maybe" defau
5b80: 6c 74 20 77 69 74 68 20 73 6f 6d 65 74 68 69 6e lt with somethin
5b90: 67 20 62 65 74 74 65 72 2e 0a 2a 2f 0a 76 6f 69 g better..*/.voi
5ba0: 64 20 73 74 79 6c 65 5f 73 65 74 5f 63 75 72 72 d style_set_curr
5bb0: 65 6e 74 5f 66 65 61 74 75 72 65 28 63 6f 6e 73 ent_feature(cons
5bc0: 74 20 63 68 61 72 2a 20 7a 46 65 61 74 75 72 65 t char* zFeature
5bd0: 29 7b 0a 20 20 54 68 5f 53 74 6f 72 65 28 22 63 ){. Th_Store("c
5be0: 75 72 72 65 6e 74 5f 66 65 61 74 75 72 65 22 2c urrent_feature",
5bf0: 20 7a 46 65 61 74 75 72 65 29 3b 0a 7d 0a 0a 2f zFeature);.}../
5c00: 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20 74 68 65 *.** Returns the
5c10: 20 63 75 72 72 65 6e 74 20 6d 61 69 6e 6d 65 6e current mainmen
5c20: 75 20 76 61 6c 75 65 20 66 72 6f 6d 20 65 69 74 u value from eit
5c30: 68 65 72 20 74 68 65 20 2d 2d 6d 61 69 6e 6d 65 her the --mainme
5c40: 6e 75 20 66 6c 61 67 0a 2a 2a 20 28 68 61 6e 64 nu flag.** (hand
5c50: 6c 65 64 20 62 79 20 74 68 65 20 73 65 72 76 65 led by the serve
5c60: 72 2f 75 69 2f 63 67 69 20 63 6f 6d 6d 61 6e 64 r/ui/cgi command
5c70: 73 29 2c 20 74 68 65 20 22 6d 61 69 6e 6d 65 6e s), the "mainmen
5c80: 75 22 20 63 6f 6e 66 69 67 0a 2a 2a 20 73 65 74 u" config.** set
5c90: 74 69 6e 67 2c 20 6f 72 20 73 74 79 6c 65 5f 64 ting, or style_d
5ca0: 65 66 61 75 6c 74 5f 6d 61 69 6e 6d 65 6e 75 28 efault_mainmenu(
5cb0: 29 2c 20 69 6e 20 74 68 61 74 20 6f 72 64 65 72 ), in that order
5cc0: 2c 20 72 65 74 75 72 6e 69 6e 67 20 74 68 65 0a , returning the.
5cd0: 2a 2a 20 66 69 72 73 74 20 6f 66 20 74 68 6f 73 ** first of thos
5ce0: 65 20 77 68 69 63 68 20 69 73 20 64 65 66 69 6e e which is defin
5cf0: 65 64 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 ed..*/.const cha
5d00: 72 20 2a 73 74 79 6c 65 5f 67 65 74 5f 6d 61 69 r *style_get_mai
5d10: 6e 6d 65 6e 75 28 29 7b 0a 20 20 73 74 61 74 69 nmenu(){. stati
5d20: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d c const char *zM
5d30: 65 6e 75 20 3d 20 30 3b 0a 20 20 69 66 28 21 7a enu = 0;. if(!z
5d40: 4d 65 6e 75 29 7b 0a 20 20 20 20 69 66 28 67 2e Menu){. if(g.
5d50: 7a 4d 61 69 6e 4d 65 6e 75 46 69 6c 65 29 7b 0a zMainMenuFile){.
5d60: 20 20 20 20 20 20 42 6c 6f 62 20 62 20 3d 20 65 Blob b = e
5d70: 6d 70 74 79 5f 62 6c 6f 62 3b 0a 20 20 20 20 20 mpty_blob;.
5d80: 20 62 6c 6f 62 5f 72 65 61 64 5f 66 72 6f 6d 5f blob_read_from_
5d90: 66 69 6c 65 28 26 62 2c 20 67 2e 7a 4d 61 69 6e file(&b, g.zMain
5da0: 4d 65 6e 75 46 69 6c 65 2c 20 45 78 74 46 49 4c MenuFile, ExtFIL
5db0: 45 29 3b 0a 20 20 20 20 20 20 7a 4d 65 6e 75 20 E);. zMenu
5dc0: 3d 20 62 6c 6f 62 5f 73 74 72 28 26 62 29 3b 0a = blob_str(&b);.
5dd0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 }else{.
5de0: 20 7a 4d 65 6e 75 20 3d 20 64 62 5f 67 65 74 28 zMenu = db_get(
5df0: 22 6d 61 69 6e 6d 65 6e 75 22 2c 20 73 74 79 6c "mainmenu", styl
5e00: 65 5f 64 65 66 61 75 6c 74 5f 6d 61 69 6e 6d 65 e_default_mainme
5e10: 6e 75 28 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d nu());. }. }
5e20: 0a 20 20 72 65 74 75 72 6e 20 7a 4d 65 6e 75 3b . return zMenu;
5e30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 .}../*.** Initia
5e40: 6c 69 7a 65 20 61 6c 6c 20 74 68 65 20 64 65 66 lize all the def
5e50: 61 75 6c 74 20 54 48 31 20 76 61 72 69 61 62 6c ault TH1 variabl
5e60: 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 es.*/.static voi
5e70: 64 20 73 74 79 6c 65 5f 69 6e 69 74 5f 74 68 31 d style_init_th1
5e80: 5f 76 61 72 73 28 63 6f 6e 73 74 20 63 68 61 72 _vars(const char
5e90: 20 2a 7a 54 69 74 6c 65 29 7b 0a 20 20 63 6f 6e *zTitle){. con
5ea0: 73 74 20 63 68 61 72 20 2a 7a 4e 6f 6e 63 65 20 st char *zNonce
5eb0: 3d 20 73 74 79 6c 65 5f 6e 6f 6e 63 65 28 29 3b = style_nonce();
5ec0: 0a 20 20 63 68 61 72 20 2a 7a 44 66 6c 74 43 73 . char *zDfltCs
5ed0: 70 3b 0a 0a 20 20 7a 44 66 6c 74 43 73 70 20 3d p;.. zDfltCsp =
5ee0: 20 73 74 79 6c 65 5f 63 73 70 28 31 29 3b 0a 20 style_csp(1);.
5ef0: 20 2f 2a 0a 20 20 2a 2a 20 44 6f 20 6e 6f 74 20 /*. ** Do not
5f00: 6f 76 65 72 77 72 69 74 65 20 74 68 65 20 54 48 overwrite the TH
5f10: 31 20 76 61 72 69 61 62 6c 65 20 22 64 65 66 61 1 variable "defa
5f20: 75 6c 74 5f 63 73 70 22 20 69 66 20 69 74 20 65 ult_csp" if it e
5f30: 78 69 73 74 73 2c 20 61 73 20 74 68 69 73 0a 20 xists, as this.
5f40: 20 2a 2a 20 61 6c 6c 6f 77 73 20 69 74 20 74 6f ** allows it to
5f50: 20 62 65 20 70 72 6f 70 65 72 6c 79 20 6f 76 65 be properly ove
5f60: 72 72 69 64 64 65 6e 20 76 69 61 20 74 68 65 20 rridden via the
5f70: 54 48 31 20 73 65 74 75 70 20 73 63 72 69 70 74 TH1 setup script
5f80: 20 28 69 2e 65 2e 20 69 74 0a 20 20 2a 2a 20 69 (i.e. it. ** i
5f90: 73 20 65 76 61 6c 75 61 74 65 64 20 62 65 66 6f s evaluated befo
5fa0: 72 65 20 74 68 65 20 68 65 61 64 65 72 20 69 73 re the header is
5fb0: 20 72 65 6e 64 65 72 65 64 29 2e 0a 20 20 2a 2f rendered).. */
5fc0: 0a 20 20 54 68 5f 4d 61 79 62 65 53 74 6f 72 65 . Th_MaybeStore
5fd0: 28 22 64 65 66 61 75 6c 74 5f 63 73 70 22 2c 20 ("default_csp",
5fe0: 7a 44 66 6c 74 43 73 70 29 3b 0a 20 20 66 6f 73 zDfltCsp);. fos
5ff0: 73 69 6c 5f 66 72 65 65 28 7a 44 66 6c 74 43 73 sil_free(zDfltCs
6000: 70 29 3b 0a 20 20 54 68 5f 53 74 6f 72 65 28 22 p);. Th_Store("
6010: 6e 6f 6e 63 65 22 2c 20 7a 4e 6f 6e 63 65 29 3b nonce", zNonce);
6020: 0a 20 20 54 68 5f 53 74 6f 72 65 28 22 70 72 6f . Th_Store("pro
6030: 6a 65 63 74 5f 6e 61 6d 65 22 2c 20 64 62 5f 67 ject_name", db_g
6040: 65 74 28 22 70 72 6f 6a 65 63 74 2d 6e 61 6d 65 et("project-name
6050: 22 2c 22 55 6e 6e 61 6d 65 64 20 46 6f 73 73 69 ","Unnamed Fossi
6060: 6c 20 50 72 6f 6a 65 63 74 22 29 29 3b 0a 20 20 l Project"));.
6070: 54 68 5f 53 74 6f 72 65 28 22 70 72 6f 6a 65 63 Th_Store("projec
6080: 74 5f 64 65 73 63 72 69 70 74 69 6f 6e 22 2c 20 t_description",
6090: 64 62 5f 67 65 74 28 22 70 72 6f 6a 65 63 74 2d db_get("project-
60a0: 64 65 73 63 72 69 70 74 69 6f 6e 22 2c 22 22 29 description","")
60b0: 29 3b 0a 20 20 69 66 28 20 7a 54 69 74 6c 65 20 );. if( zTitle
60c0: 29 20 54 68 5f 53 74 6f 72 65 28 22 74 69 74 6c ) Th_Store("titl
60d0: 65 22 2c 20 7a 54 69 74 6c 65 29 3b 0a 20 20 54 e", zTitle);. T
60e0: 68 5f 53 74 6f 72 65 28 22 62 61 73 65 75 72 6c h_Store("baseurl
60f0: 22 2c 20 67 2e 7a 42 61 73 65 55 52 4c 29 3b 0a ", g.zBaseURL);.
6100: 20 20 54 68 5f 53 74 6f 72 65 28 22 73 65 63 75 Th_Store("secu
6110: 72 65 75 72 6c 22 2c 20 66 6f 73 73 69 6c 5f 77 reurl", fossil_w
6120: 61 6e 74 73 5f 68 74 74 70 73 28 31 29 3f 20 67 ants_https(1)? g
6130: 2e 7a 48 74 74 70 73 55 52 4c 3a 20 67 2e 7a 42 .zHttpsURL: g.zB
6140: 61 73 65 55 52 4c 29 3b 0a 20 20 54 68 5f 53 74 aseURL);. Th_St
6150: 6f 72 65 28 22 68 6f 6d 65 22 2c 20 67 2e 7a 54 ore("home", g.zT
6160: 6f 70 29 3b 0a 20 20 54 68 5f 53 74 6f 72 65 28 op);. Th_Store(
6170: 22 69 6e 64 65 78 5f 70 61 67 65 22 2c 20 64 62 "index_page", db
6180: 5f 67 65 74 28 22 69 6e 64 65 78 2d 70 61 67 65 _get("index-page
6190: 22 2c 22 2f 68 6f 6d 65 22 29 29 3b 0a 20 20 69 ","/home"));. i
61a0: 66 28 20 6c 6f 63 61 6c 5f 7a 43 75 72 72 65 6e f( local_zCurren
61b0: 74 50 61 67 65 3d 3d 30 20 29 20 73 74 79 6c 65 tPage==0 ) style
61c0: 5f 73 65 74 5f 63 75 72 72 65 6e 74 5f 70 61 67 _set_current_pag
61d0: 65 28 22 25 54 22 2c 20 67 2e 7a 50 61 74 68 29 e("%T", g.zPath)
61e0: 3b 0a 20 20 54 68 5f 53 74 6f 72 65 28 22 63 75 ;. Th_Store("cu
61f0: 72 72 65 6e 74 5f 70 61 67 65 22 2c 20 6c 6f 63 rrent_page", loc
6200: 61 6c 5f 7a 43 75 72 72 65 6e 74 50 61 67 65 29 al_zCurrentPage)
6210: 3b 0a 20 20 69 66 28 20 67 2e 7a 50 61 74 68 20 ;. if( g.zPath
6220: 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ){
6230: 20 20 2f 2a 20 73 74 6f 72 65 20 74 68 65 20 66 /* store the f
6240: 69 72 73 74 20 73 65 67 6d 65 6e 74 20 6f 66 20 irst segment of
6250: 61 20 70 61 74 68 3b 20 2a 2f 0a 20 20 20 20 63 a path; */. c
6260: 68 61 72 20 2a 70 53 6c 61 73 68 20 3d 20 73 74 har *pSlash = st
6270: 72 63 68 72 28 67 2e 7a 50 61 74 68 2c 27 2f 27 rchr(g.zPath,'/'
6280: 29 3b 0a 20 20 20 20 69 66 28 20 70 53 6c 61 73 );. if( pSlas
6290: 68 20 29 20 2a 70 53 6c 61 73 68 20 3d 20 30 3b h ) *pSlash = 0;
62a0: 20 20 20 2f 2a 20 6d 61 6b 65 20 61 20 74 65 6d /* make a tem
62b0: 70 6f 72 61 72 79 20 63 75 74 20 69 66 20 6e 65 porary cut if ne
62c0: 63 65 73 73 61 72 79 20 20 2a 2f 0a 20 20 20 20 cessary */.
62d0: 54 68 5f 53 74 6f 72 65 28 22 72 65 71 75 65 73 Th_Store("reques
62e0: 74 65 64 5f 70 61 67 65 22 2c 20 65 73 63 61 70 ted_page", escap
62f0: 65 5f 71 75 6f 74 65 73 28 67 2e 7a 50 61 74 68 e_quotes(g.zPath
6300: 29 29 3b 0a 20 20 20 20 69 66 28 20 70 53 6c 61 ));. if( pSla
6310: 73 68 20 29 20 2a 70 53 6c 61 73 68 20 3d 20 27 sh ) *pSlash = '
6320: 2f 27 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 /';. }else{.
6330: 20 54 68 5f 53 74 6f 72 65 28 22 72 65 71 75 65 Th_Store("reque
6340: 73 74 65 64 5f 70 61 67 65 22 2c 20 22 22 29 3b sted_page", "");
6350: 0a 20 20 7d 0a 20 20 54 68 5f 53 74 6f 72 65 28 . }. Th_Store(
6360: 22 63 61 6e 6f 6e 69 63 61 6c 5f 70 61 67 65 22 "canonical_page"
6370: 2c 20 65 73 63 61 70 65 5f 71 75 6f 74 65 73 28 , escape_quotes(
6380: 67 2e 7a 50 68 61 73 65 2b 31 29 29 3b 0a 20 20 g.zPhase+1));.
6390: 54 68 5f 53 74 6f 72 65 28 22 63 73 72 66 5f 74 Th_Store("csrf_t
63a0: 6f 6b 65 6e 22 2c 20 67 2e 7a 43 73 72 66 54 6f oken", g.zCsrfTo
63b0: 6b 65 6e 29 3b 0a 20 20 54 68 5f 53 74 6f 72 65 ken);. Th_Store
63c0: 28 22 72 65 6c 65 61 73 65 5f 76 65 72 73 69 6f ("release_versio
63d0: 6e 22 2c 20 52 45 4c 45 41 53 45 5f 56 45 52 53 n", RELEASE_VERS
63e0: 49 4f 4e 29 3b 0a 20 20 54 68 5f 53 74 6f 72 65 ION);. Th_Store
63f0: 28 22 6d 61 6e 69 66 65 73 74 5f 76 65 72 73 69 ("manifest_versi
6400: 6f 6e 22 2c 20 4d 41 4e 49 46 45 53 54 5f 56 45 on", MANIFEST_VE
6410: 52 53 49 4f 4e 29 3b 0a 20 20 54 68 5f 53 74 6f RSION);. Th_Sto
6420: 72 65 28 22 6d 61 6e 69 66 65 73 74 5f 64 61 74 re("manifest_dat
6430: 65 22 2c 20 4d 41 4e 49 46 45 53 54 5f 44 41 54 e", MANIFEST_DAT
6440: 45 29 3b 0a 20 20 54 68 5f 53 74 6f 72 65 28 22 E);. Th_Store("
6450: 63 6f 6d 70 69 6c 65 72 5f 6e 61 6d 65 22 2c 20 compiler_name",
6460: 43 4f 4d 50 49 4c 45 52 5f 4e 41 4d 45 29 3b 0a COMPILER_NAME);.
6470: 20 20 54 68 5f 53 74 6f 72 65 28 22 6d 61 69 6e Th_Store("main
6480: 6d 65 6e 75 22 2c 20 73 74 79 6c 65 5f 67 65 74 menu", style_get
6490: 5f 6d 61 69 6e 6d 65 6e 75 28 29 29 3b 0a 20 20 _mainmenu());.
64a0: 73 74 79 6c 65 73 68 65 65 74 5f 75 72 6c 5f 76 stylesheet_url_v
64b0: 61 72 28 29 3b 0a 20 20 69 6d 61 67 65 5f 75 72 ar();. image_ur
64c0: 6c 5f 76 61 72 28 22 6c 6f 67 6f 22 29 3b 0a 20 l_var("logo");.
64d0: 20 69 6d 61 67 65 5f 75 72 6c 5f 76 61 72 28 22 image_url_var("
64e0: 62 61 63 6b 67 72 6f 75 6e 64 22 29 3b 0a 20 20 background");.
64f0: 69 66 28 20 21 6c 6f 67 69 6e 5f 69 73 5f 6e 6f if( !login_is_no
6500: 62 6f 64 79 28 29 20 29 7b 0a 20 20 20 20 54 68 body() ){. Th
6510: 5f 53 74 6f 72 65 28 22 6c 6f 67 69 6e 22 2c 20 _Store("login",
6520: 67 2e 7a 4c 6f 67 69 6e 29 3b 0a 20 20 7d 0a 20 g.zLogin);. }.
6530: 20 54 68 5f 4d 61 79 62 65 53 74 6f 72 65 28 22 Th_MaybeStore("
6540: 63 75 72 72 65 6e 74 5f 66 65 61 74 75 72 65 22 current_feature"
6550: 2c 20 66 65 61 74 75 72 65 5f 66 72 6f 6d 5f 70 , feature_from_p
6560: 61 67 65 5f 70 61 74 68 28 6c 6f 63 61 6c 5f 7a age_path(local_z
6570: 43 75 72 72 65 6e 74 50 61 67 65 29 20 29 3b 0a CurrentPage) );.
6580: 20 20 69 66 28 20 67 2e 66 74 6e 74 73 49 73 73 if( g.ftntsIss
6590: 75 65 73 5b 30 5d 20 7c 7c 20 67 2e 66 74 6e 74 ues[0] || g.ftnt
65a0: 73 49 73 73 75 65 73 5b 31 5d 20 7c 7c 0a 20 20 sIssues[1] ||.
65b0: 20 20 20 20 67 2e 66 74 6e 74 73 49 73 73 75 65 g.ftntsIssue
65c0: 73 5b 32 5d 20 7c 7c 20 67 2e 66 74 6e 74 73 49 s[2] || g.ftntsI
65d0: 73 73 75 65 73 5b 33 5d 20 29 7b 0a 20 20 20 20 ssues[3] ){.
65e0: 63 68 61 72 20 62 75 66 5b 38 30 5d 3b 0a 20 20 char buf[80];.
65f0: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e sqlite3_snprin
6600: 74 66 28 73 69 7a 65 6f 66 28 62 75 66 29 2c 20 tf(sizeof(buf),
6610: 62 75 66 2c 20 22 25 69 20 25 69 20 25 69 20 25 buf, "%i %i %i %
6620: 69 22 2c 20 67 2e 66 74 6e 74 73 49 73 73 75 65 i", g.ftntsIssue
6630: 73 5b 30 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 s[0],.
6640: 20 20 20 20 20 20 20 20 20 20 20 67 2e 66 74 6e g.ftn
6650: 74 73 49 73 73 75 65 73 5b 31 5d 2c 20 67 2e 66 tsIssues[1], g.f
6660: 74 6e 74 73 49 73 73 75 65 73 5b 32 5d 2c 20 67 tntsIssues[2], g
6670: 2e 66 74 6e 74 73 49 73 73 75 65 73 5b 33 5d 29 .ftntsIssues[3])
6680: 3b 0a 20 20 20 20 54 68 5f 53 74 6f 72 65 28 22 ;. Th_Store("
6690: 66 6f 6f 74 6e 6f 74 65 73 5f 69 73 73 75 65 73 footnotes_issues
66a0: 5f 63 6f 75 6e 74 65 72 73 22 2c 20 62 75 66 29 _counters", buf)
66b0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 ;. }.}../*.** D
66c0: 72 61 77 20 74 68 65 20 68 65 61 64 65 72 2e 0a raw the header..
66d0: 2a 2f 0a 76 6f 69 64 20 73 74 79 6c 65 5f 68 65 */.void style_he
66e0: 61 64 65 72 28 63 6f 6e 73 74 20 63 68 61 72 20 ader(const char
66f0: 2a 7a 54 69 74 6c 65 46 6f 72 6d 61 74 2c 20 2e *zTitleFormat, .
6700: 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 ..){. va_list a
6710: 70 3b 0a 20 20 63 68 61 72 20 2a 7a 54 69 74 6c p;. char *zTitl
6720: 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 e;. const char
6730: 2a 7a 48 65 61 64 65 72 20 3d 20 73 6b 69 6e 5f *zHeader = skin_
6740: 67 65 74 28 22 68 65 61 64 65 72 22 29 3b 0a 20 get("header");.
6750: 20 6c 6f 67 69 6e 5f 63 68 65 63 6b 5f 63 72 65 login_check_cre
6760: 64 65 6e 74 69 61 6c 73 28 29 3b 0a 0a 20 20 76 dentials();.. v
6770: 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 54 69 74 a_start(ap, zTit
6780: 6c 65 46 6f 72 6d 61 74 29 3b 0a 20 20 7a 54 69 leFormat);. zTi
6790: 74 6c 65 20 3d 20 76 6d 70 72 69 6e 74 66 28 7a tle = vmprintf(z
67a0: 54 69 74 6c 65 46 6f 72 6d 61 74 2c 20 61 70 29 TitleFormat, ap)
67b0: 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a ;. va_end(ap);.
67c0: 0a 20 20 63 67 69 5f 64 65 73 74 69 6e 61 74 69 . cgi_destinati
67d0: 6f 6e 28 43 47 49 5f 48 45 41 44 45 52 29 3b 0a on(CGI_HEADER);.
67e0: 0a 20 20 40 20 3c 21 44 4f 43 54 59 50 45 20 68 . @ <!DOCTYPE h
67f0: 74 6d 6c 3e 0a 0a 20 20 69 66 28 20 67 2e 74 68 tml>.. if( g.th
6800: 54 72 61 63 65 20 29 20 54 68 5f 54 72 61 63 65 Trace ) Th_Trace
6810: 28 22 42 45 47 49 4e 5f 48 45 41 44 45 52 3c 62 ("BEGIN_HEADER<b
6820: 72 3e 5c 6e 22 2c 20 2d 31 29 3b 0a 0a 20 20 2f r>\n", -1);.. /
6830: 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 68 * Generate the h
6840: 65 61 64 65 72 20 75 70 20 74 68 72 6f 75 67 68 eader up through
6850: 20 74 68 65 20 6d 61 69 6e 20 6d 65 6e 75 20 2a the main menu *
6860: 2f 0a 20 20 73 74 79 6c 65 5f 69 6e 69 74 5f 74 /. style_init_t
6870: 68 31 5f 76 61 72 73 28 7a 54 69 74 6c 65 29 3b h1_vars(zTitle);
6880: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 . if( sqlite3_s
6890: 74 72 6c 69 6b 65 28 22 25 3c 62 6f 64 79 25 22 trlike("%<body%"
68a0: 2c 20 7a 48 65 61 64 65 72 2c 20 30 29 21 3d 30 , zHeader, 0)!=0
68b0: 20 29 7b 0a 20 20 20 20 54 68 5f 52 65 6e 64 65 ){. Th_Rende
68c0: 72 28 7a 44 66 6c 74 48 65 61 64 65 72 29 3b 0a r(zDfltHeader);.
68d0: 20 20 7d 0a 20 20 69 66 28 20 67 2e 74 68 54 72 }. if( g.thTr
68e0: 61 63 65 20 29 20 54 68 5f 54 72 61 63 65 28 22 ace ) Th_Trace("
68f0: 42 45 47 49 4e 5f 48 45 41 44 45 52 5f 53 43 52 BEGIN_HEADER_SCR
6900: 49 50 54 3c 62 72 3e 5c 6e 22 2c 20 2d 31 29 3b IPT<br>\n", -1);
6910: 0a 20 20 54 68 5f 52 65 6e 64 65 72 28 7a 48 65 . Th_Render(zHe
6920: 61 64 65 72 29 3b 0a 20 20 69 66 28 20 67 2e 74 ader);. if( g.t
6930: 68 54 72 61 63 65 20 29 20 54 68 5f 54 72 61 63 hTrace ) Th_Trac
6940: 65 28 22 45 4e 44 5f 48 45 41 44 45 52 3c 62 72 e("END_HEADER<br
6950: 3e 5c 6e 22 2c 20 2d 31 29 3b 0a 20 20 54 68 5f >\n", -1);. Th_
6960: 55 6e 73 74 6f 72 65 28 22 74 69 74 6c 65 22 29 Unstore("title")
6970: 3b 20 20 20 2f 2a 20 41 76 6f 69 64 20 63 6f 6c ; /* Avoid col
6980: 6c 69 73 69 6f 6e 73 20 77 69 74 68 20 74 69 63 lisions with tic
6990: 6b 65 74 20 66 69 65 6c 64 20 6e 61 6d 65 73 20 ket field names
69a0: 2a 2f 0a 20 20 63 67 69 5f 64 65 73 74 69 6e 61 */. cgi_destina
69b0: 74 69 6f 6e 28 43 47 49 5f 42 4f 44 59 29 3b 0a tion(CGI_BODY);.
69c0: 20 20 67 2e 63 67 69 4f 75 74 70 75 74 20 3d 20 g.cgiOutput =
69d0: 31 3b 0a 20 20 68 65 61 64 65 72 48 61 73 42 65 1;. headerHasBe
69e0: 65 6e 47 65 6e 65 72 61 74 65 64 20 3d 20 31 3b enGenerated = 1;
69f0: 0a 20 20 73 69 64 65 62 6f 78 55 73 65 64 20 3d . sideboxUsed =
6a00: 20 30 3b 0a 20 20 69 66 28 20 67 2e 70 65 72 6d 0;. if( g.perm
6a10: 2e 44 65 62 75 67 20 26 26 20 50 28 22 73 68 6f .Debug && P("sho
6a20: 77 71 70 22 29 20 29 7b 0a 20 20 20 20 40 20 3c wqp") ){. @ <
6a30: 64 69 76 20 63 6c 61 73 73 3d 22 64 65 62 75 67 div class="debug
6a40: 22 3e 0a 20 20 20 20 63 67 69 5f 70 72 69 6e 74 ">. cgi_print
6a50: 5f 61 6c 6c 28 30 2c 20 30 2c 20 30 29 3b 0a 20 _all(0, 0, 0);.
6a60: 20 20 20 40 20 3c 2f 64 69 76 3e 0a 20 20 7d 0a @ </div>. }.
6a70: 20 20 66 6f 73 73 69 6c 5f 66 72 65 65 28 7a 54 fossil_free(zT
6a80: 69 74 6c 65 29 3b 0a 7d 0a 0a 23 69 66 20 49 4e itle);.}..#if IN
6a90: 54 45 52 46 41 43 45 0a 2f 2a 20 41 6c 6c 6f 77 TERFACE./* Allow
6aa0: 65 64 20 70 61 72 61 6d 65 74 65 72 73 20 66 6f ed parameters fo
6ab0: 72 20 73 74 79 6c 65 5f 61 64 75 6e 69 74 28 29 r style_adunit()
6ac0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 41 44 55 4e */.#define ADUN
6ad0: 49 54 5f 4f 46 46 20 20 20 20 20 20 20 20 30 78 IT_OFF 0x
6ae0: 30 30 30 31 20 20 20 20 20 20 20 2f 2a 20 44 6f 0001 /* Do
6af0: 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 64 73 20 6f not allow ads o
6b00: 6e 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 23 n this page */.#
6b10: 64 65 66 69 6e 65 20 41 44 55 4e 49 54 5f 52 49 define ADUNIT_RI
6b20: 47 48 54 5f 4f 4b 20 20 20 30 78 30 30 30 32 20 GHT_OK 0x0002
6b30: 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74 2d 73 /* Right-s
6b40: 69 64 65 20 76 65 72 74 69 63 61 6c 20 61 64 73 ide vertical ads
6b50: 20 6f 6b 20 68 65 72 65 20 2a 2f 0a 23 65 6e 64 ok here */.#end
6b60: 69 66 0a 0a 2f 2a 0a 2a 2a 20 56 61 72 69 6f 75 if../*.** Variou
6b70: 73 20 70 61 67 65 20 69 6d 70 6c 65 6d 65 6e 74 s page implement
6b80: 61 74 69 6f 6e 73 20 63 61 6e 20 69 6e 76 6f 6b ations can invok
6b90: 65 20 74 68 69 73 20 69 6e 74 65 72 66 61 63 65 e this interface
6ba0: 20 74 6f 20 6c 65 74 20 74 68 65 0a 2a 2a 20 73 to let the.** s
6bb0: 74 79 6c 65 20 6d 61 6e 61 67 65 72 20 6b 6e 6f tyle manager kno
6bc0: 77 20 77 68 61 74 20 6b 69 6e 64 73 20 6f 66 20 w what kinds of
6bd0: 61 64 73 20 61 72 65 20 61 70 70 72 6f 70 72 69 ads are appropri
6be0: 61 74 65 20 66 6f 72 20 74 68 69 73 20 70 61 67 ate for this pag
6bf0: 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 74 79 6c 65 e..*/.void style
6c00: 5f 61 64 75 6e 69 74 5f 63 6f 6e 66 69 67 28 75 _adunit_config(u
6c10: 6e 73 69 67 6e 65 64 20 69 6e 74 20 6d 46 6c 61 nsigned int mFla
6c20: 67 73 29 7b 0a 20 20 61 64 55 6e 69 74 46 6c 61 gs){. adUnitFla
6c30: 67 73 20 3d 20 6d 46 6c 61 67 73 3b 0a 7d 0a 0a gs = mFlags;.}..
6c40: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 /*.** Return the
6c50: 20 74 65 78 74 20 6f 66 20 61 6e 20 61 64 2d 75 text of an ad-u
6c60: 6e 69 74 2c 20 69 66 20 6f 6e 65 20 73 68 6f 75 nit, if one shou
6c70: 6c 64 20 62 65 20 72 65 6e 64 65 72 65 64 2e 20 ld be rendered.
6c80: 20 52 65 74 75 72 6e 0a 2a 2a 20 4e 55 4c 4c 20 Return.** NULL
6c90: 69 66 20 6e 6f 20 61 64 2d 75 6e 69 74 20 69 73 if no ad-unit is
6ca0: 20 64 65 73 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 desired..**.**
6cb0: 54 68 65 20 2a 70 41 64 46 6c 61 67 20 76 61 6c The *pAdFlag val
6cc0: 75 65 20 6d 69 67 68 74 20 62 65 20 73 65 74 20 ue might be set
6cd0: 74 6f 20 41 44 55 4e 49 54 5f 52 49 47 48 54 5f to ADUNIT_RIGHT_
6ce0: 4f 4b 20 69 66 20 74 68 69 73 20 69 73 0a 2a 2a OK if this is.**
6cf0: 20 61 20 72 69 67 68 74 2d 68 61 6e 64 20 76 65 a right-hand ve
6d00: 72 74 69 63 61 6c 20 61 64 2e 0a 2a 2f 0a 73 74 rtical ad..*/.st
6d10: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 atic const char
6d20: 2a 73 74 79 6c 65 5f 61 64 75 6e 69 74 5f 74 65 *style_adunit_te
6d30: 78 74 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 xt(unsigned int
6d40: 2a 70 41 64 46 6c 61 67 29 7b 0a 20 20 63 6f 6e *pAdFlag){. con
6d50: 73 74 20 63 68 61 72 20 2a 7a 41 64 20 3d 20 30 st char *zAd = 0
6d60: 3b 0a 20 20 2a 70 41 64 46 6c 61 67 20 3d 20 30 ;. *pAdFlag = 0
6d70: 3b 0a 20 20 69 66 28 20 61 64 55 6e 69 74 46 6c ;. if( adUnitFl
6d80: 61 67 73 20 26 20 41 44 55 4e 49 54 5f 4f 46 46 ags & ADUNIT_OFF
6d90: 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a ) return 0; /*
6da0: 20 44 69 73 61 6c 6c 6f 77 20 61 64 73 20 6f 6e Disallow ads on
6db0: 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 this page */.
6dc0: 69 66 28 20 64 62 5f 67 65 74 5f 62 6f 6f 6c 65 if( db_get_boole
6dd0: 61 6e 28 22 61 64 75 6e 69 74 2d 64 69 73 61 62 an("adunit-disab
6de0: 6c 65 22 2c 30 29 20 29 20 72 65 74 75 72 6e 20 le",0) ) return
6df0: 30 3b 0a 20 20 69 66 28 20 67 2e 70 65 72 6d 2e 0;. if( g.perm.
6e00: 41 64 6d 69 6e 20 26 26 20 64 62 5f 67 65 74 5f Admin && db_get_
6e10: 62 6f 6f 6c 65 61 6e 28 22 61 64 75 6e 69 74 2d boolean("adunit-
6e20: 6f 6d 69 74 2d 69 66 2d 61 64 6d 69 6e 22 2c 30 omit-if-admin",0
6e30: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 ) ){. return
6e40: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 6c 6f 0;. }. if( !lo
6e50: 67 69 6e 5f 69 73 5f 6e 6f 62 6f 64 79 28 29 0a gin_is_nobody().
6e60: 20 20 20 26 26 20 66 6f 73 73 69 6c 5f 73 74 72 && fossil_str
6e70: 63 6d 70 28 67 2e 7a 4c 6f 67 69 6e 2c 22 61 6e cmp(g.zLogin,"an
6e80: 6f 6e 79 6d 6f 75 73 22 29 21 3d 30 0a 20 20 20 onymous")!=0.
6e90: 26 26 20 64 62 5f 67 65 74 5f 62 6f 6f 6c 65 61 && db_get_boolea
6ea0: 6e 28 22 61 64 75 6e 69 74 2d 6f 6d 69 74 2d 69 n("adunit-omit-i
6eb0: 66 2d 75 73 65 72 22 2c 30 29 0a 20 20 29 7b 0a f-user",0). ){.
6ec0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 return 0;.
6ed0: 7d 0a 20 20 69 66 28 20 28 61 64 55 6e 69 74 46 }. if( (adUnitF
6ee0: 6c 61 67 73 20 26 20 41 44 55 4e 49 54 5f 52 49 lags & ADUNIT_RI
6ef0: 47 48 54 5f 4f 4b 29 21 3d 30 0a 20 20 20 26 26 GHT_OK)!=0. &&
6f00: 20 21 66 6f 73 73 69 6c 5f 61 6c 6c 5f 77 68 69 !fossil_all_whi
6f10: 74 65 73 70 61 63 65 28 7a 41 64 20 3d 20 64 62 tespace(zAd = db
6f20: 5f 67 65 74 28 22 61 64 75 6e 69 74 2d 72 69 67 _get("adunit-rig
6f30: 68 74 22 2c 20 30 29 29 0a 20 20 20 26 26 20 21 ht", 0)). && !
6f40: 63 67 69 5f 62 6f 64 79 5f 63 6f 6e 74 61 69 6e cgi_body_contain
6f50: 73 28 22 3c 74 61 62 6c 65 22 29 0a 20 20 29 7b s("<table"). ){
6f60: 0a 20 20 20 20 2a 70 41 64 46 6c 61 67 20 3d 20 . *pAdFlag =
6f70: 41 44 55 4e 49 54 5f 52 49 47 48 54 5f 4f 4b 3b ADUNIT_RIGHT_OK;
6f80: 0a 20 20 20 20 72 65 74 75 72 6e 20 7a 41 64 3b . return zAd;
6f90: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 66 6f . }else if( !fo
6fa0: 73 73 69 6c 5f 61 6c 6c 5f 77 68 69 74 65 73 70 ssil_all_whitesp
6fb0: 61 63 65 28 7a 41 64 20 3d 20 64 62 5f 67 65 74 ace(zAd = db_get
6fc0: 28 22 61 64 75 6e 69 74 22 2c 30 29 29 20 29 7b ("adunit",0)) ){
6fd0: 0a 20 20 20 20 72 65 74 75 72 6e 20 7a 41 64 3b . return zAd;
6fe0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b . }. return 0;
6ff0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 69 63 61 .}../*.** Indica
7000: 74 65 20 74 68 61 74 20 74 68 65 20 74 61 62 6c te that the tabl
7010: 65 2d 73 6f 72 74 69 6e 67 20 6a 61 76 61 73 63 e-sorting javasc
7020: 72 69 70 74 20 69 73 20 6e 65 65 64 65 64 2e 0a ript is needed..
7030: 2a 2f 0a 76 6f 69 64 20 73 74 79 6c 65 5f 74 61 */.void style_ta
7040: 62 6c 65 5f 73 6f 72 74 65 72 28 76 6f 69 64 29 ble_sorter(void)
7050: 7b 0a 20 20 62 75 69 6c 74 69 6e 5f 72 65 71 75 {. builtin_requ
7060: 65 73 74 5f 6a 73 28 22 73 6f 72 74 74 61 62 6c est_js("sorttabl
7070: 65 2e 6a 73 22 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a e.js");.}../*.**
7080: 20 49 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 Indicate that t
7090: 68 65 20 71 75 69 63 6b 66 69 6c 74 65 72 20 6a he quickfilter j
70a0: 61 76 61 73 63 72 69 70 74 20 69 73 20 6e 65 65 avascript is nee
70b0: 64 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 74 79 ded..*/.void sty
70c0: 6c 65 5f 71 75 69 63 6b 66 69 6c 74 65 72 28 76 le_quickfilter(v
70d0: 6f 69 64 29 7b 0a 20 20 62 75 69 6c 74 69 6e 5f oid){. builtin_
70e0: 72 65 71 75 65 73 74 5f 6a 73 28 22 71 75 69 63 request_js("quic
70f0: 6b 66 69 6c 74 65 72 2e 6a 73 22 29 3b 0a 7d 0a kfilter.js");.}.
7100: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 ./*.** Generate
7110: 63 6f 64 65 20 74 6f 20 6c 6f 61 64 20 61 6c 6c code to load all
7120: 20 72 65 71 75 69 72 65 64 20 6a 61 76 61 73 63 required javasc
7130: 72 69 70 74 20 66 69 6c 65 73 2e 0a 2a 2f 0a 73 ript files..*/.s
7140: 74 61 74 69 63 20 76 6f 69 64 20 73 74 79 6c 65 tatic void style
7150: 5f 6c 6f 61 64 5f 61 6c 6c 5f 6a 73 5f 66 69 6c _load_all_js_fil
7160: 65 73 28 76 6f 69 64 29 7b 0a 20 20 69 66 28 20 es(void){. if(
7170: 6e 65 65 64 48 72 65 66 4a 73 20 26 26 20 67 2e needHrefJs && g.
7180: 70 65 72 6d 2e 48 79 70 65 72 6c 69 6e 6b 20 29 perm.Hyperlink )
7190: 7b 0a 20 20 20 20 69 6e 74 20 6e 44 65 6c 61 79 {. int nDelay
71a0: 20 3d 20 64 62 5f 67 65 74 5f 69 6e 74 28 22 61 = db_get_int("a
71b0: 75 74 6f 2d 68 79 70 65 72 6c 69 6e 6b 2d 64 65 uto-hyperlink-de
71c0: 6c 61 79 22 2c 30 29 3b 0a 20 20 20 20 69 6e 74 lay",0);. int
71d0: 20 62 4d 6f 75 73 65 6f 76 65 72 20 3d 20 64 62 bMouseover = db
71e0: 5f 67 65 74 5f 62 6f 6f 6c 65 61 6e 28 22 61 75 _get_boolean("au
71f0: 74 6f 2d 68 79 70 65 72 6c 69 6e 6b 2d 6d 6f 75 to-hyperlink-mou
7200: 73 65 6f 76 65 72 22 2c 30 29 0a 20 20 20 20 20 seover",0).
7210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 &&
7220: 20 73 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62 sqlite3_strglob
7230: 28 22 2a 41 6e 64 72 6f 69 64 2a 22 2c 50 44 28 ("*Android*",PD(
7240: 22 48 54 54 50 5f 55 53 45 52 5f 41 47 45 4e 54 "HTTP_USER_AGENT
7250: 22 2c 22 22 29 29 3b 0a 20 20 20 20 40 20 3c 73 ",""));. @ <s
7260: 63 72 69 70 74 20 69 64 3d 27 68 72 65 66 2d 64 cript id='href-d
7270: 61 74 61 27 20 74 79 70 65 3d 27 74 65 78 74 2f ata' type='text/
7280: 6a 73 6f 6e 27 3e 5c 0a 20 20 20 20 40 20 7b 22 json'>\. @ {"
7290: 64 65 6c 61 79 22 3a 25 64 28 6e 44 65 6c 61 79 delay":%d(nDelay
72a0: 29 2c 22 6d 6f 75 73 65 6f 76 65 72 22 3a 25 64 ),"mouseover":%d
72b0: 28 62 4d 6f 75 73 65 6f 76 65 72 29 7d 3c 2f 73 (bMouseover)}</s
72c0: 63 72 69 70 74 3e 0a 20 20 7d 0a 20 20 40 20 3c cript>. }. @ <
72d0: 73 63 72 69 70 74 20 6e 6f 6e 63 65 3d 22 25 68 script nonce="%h
72e0: 28 73 74 79 6c 65 5f 6e 6f 6e 63 65 28 29 29 22 (style_nonce())"
72f0: 3e 2f 2a 20 73 74 79 6c 65 2e 63 3a 25 64 28 5f >/* style.c:%d(_
7300: 5f 4c 49 4e 45 5f 5f 29 20 2a 2f 0a 20 20 40 20 _LINE__) */. @
7310: 66 75 6e 63 74 69 6f 6e 20 64 65 62 75 67 4d 73 function debugMs
7320: 67 28 6d 73 67 29 7b 0a 20 20 40 20 76 61 72 20 g(msg){. @ var
7330: 6e 20 3d 20 64 6f 63 75 6d 65 6e 74 2e 67 65 74 n = document.get
7340: 45 6c 65 6d 65 6e 74 42 79 49 64 28 22 64 65 62 ElementById("deb
7350: 75 67 4d 73 67 22 29 3b 0a 20 20 40 20 69 66 28 ugMsg");. @ if(
7360: 6e 29 7b 6e 2e 74 65 78 74 43 6f 6e 74 65 6e 74 n){n.textContent
7370: 3d 6d 73 67 3b 7d 0a 20 20 40 20 7d 0a 20 20 69 =msg;}. @ }. i
7380: 66 28 20 6e 65 65 64 48 72 65 66 4a 73 20 26 26 f( needHrefJs &&
7390: 20 67 2e 70 65 72 6d 2e 48 79 70 65 72 6c 69 6e g.perm.Hyperlin
73a0: 6b 20 29 7b 0a 20 20 20 20 40 20 2f 2a 20 68 72 k ){. @ /* hr
73b0: 65 66 2e 6a 73 20 2a 2f 0a 20 20 20 20 63 67 69 ef.js */. cgi
73c0: 5f 61 70 70 65 6e 64 5f 63 6f 6e 74 65 6e 74 28 _append_content(
73d0: 62 75 69 6c 74 69 6e 5f 74 65 78 74 28 22 68 72 builtin_text("hr
73e0: 65 66 2e 6a 73 22 29 2c 2d 31 29 3b 0a 20 20 7d ef.js"),-1);. }
73f0: 0a 20 20 69 66 28 20 62 6c 6f 62 5f 73 69 7a 65 . if( blob_size
7400: 28 26 62 6c 6f 62 4f 6e 4c 6f 61 64 29 3e 30 20 (&blobOnLoad)>0
7410: 29 7b 0a 20 20 20 20 40 20 77 69 6e 64 6f 77 2e ){. @ window.
7420: 6f 6e 6c 6f 61 64 20 3d 20 66 75 6e 63 74 69 6f onload = functio
7430: 6e 28 29 7b 0a 20 20 20 20 63 67 69 5f 61 70 70 n(){. cgi_app
7440: 65 6e 64 5f 63 6f 6e 74 65 6e 74 28 62 6c 6f 62 end_content(blob
7450: 5f 62 75 66 66 65 72 28 26 62 6c 6f 62 4f 6e 4c _buffer(&blobOnL
7460: 6f 61 64 29 2c 20 62 6c 6f 62 5f 73 69 7a 65 28 oad), blob_size(
7470: 26 62 6c 6f 62 4f 6e 4c 6f 61 64 29 29 3b 0a 20 &blobOnLoad));.
7480: 20 20 20 63 67 69 5f 61 70 70 65 6e 64 5f 63 6f cgi_append_co
7490: 6e 74 65 6e 74 28 22 5c 6e 7d 5c 6e 22 2c 20 2d ntent("\n}\n", -
74a0: 31 29 3b 0a 20 20 7d 0a 20 20 40 20 3c 2f 73 63 1);. }. @ </sc
74b0: 72 69 70 74 3e 0a 20 20 62 75 69 6c 74 69 6e 5f ript>. builtin_
74c0: 66 75 6c 66 69 6c 6c 5f 6a 73 5f 72 65 71 75 65 fulfill_js_reque
74d0: 73 74 73 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 sts();.}../*.**
74e0: 54 72 61 6e 73 6f 72 6d 20 69 6e 70 75 74 20 73 Transorm input s
74f0: 74 72 69 6e 67 20 69 6e 74 6f 20 61 20 74 6f 6b tring into a tok
7500: 65 6e 20 74 68 61 74 20 69 73 20 73 61 66 65 20 en that is safe
7510: 66 6f 72 20 69 6e 63 6c 75 73 69 6f 6e 20 69 6e for inclusion in
7520: 74 6f 0a 2a 2a 20 63 6c 61 73 73 20 61 74 74 72 to.** class attr
7530: 69 62 75 74 65 2e 20 44 69 67 69 74 73 20 61 6e ibute. Digits an
7540: 64 20 6c 6f 77 2d 63 61 73 65 20 6c 65 74 74 65 d low-case lette
7550: 72 20 61 72 65 20 70 61 73 73 65 64 20 75 6e 63 r are passed unc
7560: 68 61 6e 67 65 64 2c 0a 2a 2a 20 75 70 70 65 72 hanged,.** upper
7570: 2d 63 61 73 65 20 6c 65 74 74 65 72 73 20 61 72 -case letters ar
7580: 65 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 74 6f e transformed to
7590: 20 6c 6f 77 2d 63 61 73 65 2c 20 65 76 65 72 79 low-case, every
75a0: 74 68 69 6e 67 20 65 6c 73 65 20 69 73 0a 2a 2a thing else is.**
75b0: 20 74 72 61 6e 66 6f 72 6d 65 64 20 69 6e 74 6f tranformed into
75c0: 20 68 79 70 68 65 6e 73 3b 20 63 6f 6e 73 65 71 hyphens; conseq
75d0: 75 74 69 76 65 20 61 6e 64 20 70 65 6e 64 69 6e utive and pendin
75e0: 67 20 68 79 70 68 65 6e 73 20 61 72 65 20 73 71 g hyphens are sq
75f0: 75 65 65 7a 65 64 2e 0a 2a 2a 20 49 66 20 72 65 ueezed..** If re
7600: 73 75 6c 74 20 64 6f 65 73 20 6e 6f 74 20 66 69 sult does not fi
7610: 74 20 69 6e 74 6f 20 73 7a 4f 75 74 20 63 68 61 t into szOut cha
7620: 72 73 20 74 68 65 6e 20 69 74 20 69 73 20 74 72 rs then it is tr
7630: 75 6e 63 61 74 65 64 2e 0a 2a 2a 20 52 65 73 75 uncated..** Resu
7640: 6c 74 20 69 73 20 61 6c 77 61 79 73 20 74 65 72 lt is always ter
7650: 6d 69 6e 61 74 65 64 20 77 69 74 68 20 6e 75 6c minated with nul
7660: 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 74 79 6c 65 l..*/.void style
7670: 5f 64 65 72 69 76 65 5f 63 6c 61 73 73 6e 61 6d _derive_classnam
7680: 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 e(const char *zI
7690: 6e 2c 20 63 68 61 72 20 2a 7a 4f 75 74 2c 20 69 n, char *zOut, i
76a0: 6e 74 20 73 7a 4f 75 74 29 7b 0a 20 20 61 73 73 nt szOut){. ass
76b0: 65 72 74 28 20 20 7a 4f 75 74 20 29 3b 0a 20 20 ert( zOut );.
76c0: 61 73 73 65 72 74 28 20 73 7a 4f 75 74 3e 30 20 assert( szOut>0
76d0: 29 3b 0a 20 20 69 66 28 20 7a 49 6e 20 29 7b 0a );. if( zIn ){.
76e0: 20 20 20 20 69 6e 74 20 6e 20 3d 20 30 3b 20 20 int n = 0;
76f0: 2f 2a 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 /* number of cha
7700: 72 73 20 77 72 69 74 74 65 6e 20 74 6f 20 7a 4f rs written to zO
7710: 75 74 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 63 ut */. char c
7720: 3b 0a 20 20 20 20 66 6f 72 28 2d 2d 73 7a 4f 75 ;. for(--szOu
7730: 74 3b 20 28 63 3d 2a 7a 49 6e 29 20 26 26 20 6e t; (c=*zIn) && n
7740: 3c 73 7a 4f 75 74 3b 20 7a 49 6e 2b 2b 29 20 7b <szOut; zIn++) {
7750: 0a 20 20 20 20 20 20 69 66 28 20 28 27 61 27 3c . if( ('a'<
7760: 3d 63 20 26 26 20 63 3c 3d 27 7a 27 29 20 7c 7c =c && c<='z') ||
7770: 20 28 27 30 27 3c 3d 63 20 26 26 20 63 3c 3d 27 ('0'<=c && c<='
7780: 39 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 9') ){. *
7790: 7a 4f 75 74 20 3d 20 63 3b 0a 20 20 20 20 20 20 zOut = c;.
77a0: 7d 65 6c 73 65 20 69 66 28 20 27 41 27 3c 3d 63 }else if( 'A'<=c
77b0: 20 26 26 20 63 3c 3d 27 5a 27 20 29 7b 0a 20 20 && c<='Z' ){.
77c0: 20 20 20 20 20 20 2a 7a 4f 75 74 20 3d 20 63 20 *zOut = c
77d0: 2d 20 27 41 27 20 2b 20 27 61 27 3b 0a 20 20 20 - 'A' + 'a';.
77e0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 }else{.
77f0: 20 20 69 66 28 20 6e 3d 3d 30 20 7c 7c 20 7a 4f if( n==0 || zO
7800: 75 74 5b 2d 31 5d 3d 3d 27 2d 27 20 29 20 63 6f ut[-1]=='-' ) co
7810: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 ntinue;.
7820: 2a 7a 4f 75 74 20 3d 20 27 2d 27 3b 0a 20 20 20 *zOut = '-';.
7830: 20 20 20 7d 0a 20 20 20 20 20 20 7a 4f 75 74 2b }. zOut+
7840: 2b 3b 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 +;. n++;.
7850: 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 20 26 26 }. if( n &&
7860: 20 7a 4f 75 74 5b 2d 31 5d 3d 3d 27 2d 27 20 29 zOut[-1]=='-' )
7870: 20 7a 4f 75 74 2d 2d 3b 0a 20 20 7d 0a 20 20 2a zOut--;. }. *
7880: 7a 4f 75 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a zOut = 0;.}../*.
7890: 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 69 73 20 72 ** Invoke this r
78a0: 6f 75 74 69 6e 65 20 61 66 74 65 72 20 61 6c 6c outine after all
78b0: 20 6f 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 of the content
78c0: 66 6f 72 20 61 20 77 65 62 70 61 67 65 20 68 61 for a webpage ha
78d0: 73 20 62 65 65 6e 0a 2a 2a 20 67 65 6e 65 72 61 s been.** genera
78e0: 74 65 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69 ted. This routi
78f0: 6e 65 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c ne should be cal
7900: 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 76 65 led once for eve
7910: 72 79 20 77 65 62 70 61 67 65 2c 20 61 74 0a 2a ry webpage, at.*
7920: 2a 20 6f 72 20 6e 65 61 72 20 74 68 65 20 65 6e * or near the en
7930: 64 20 6f 66 20 70 61 67 65 20 67 65 6e 65 72 61 d of page genera
7940: 74 69 6f 6e 2e 20 20 54 68 69 73 20 72 6f 75 74 tion. This rout
7950: 69 6e 65 20 64 6f 65 73 20 74 68 65 20 66 6f 6c ine does the fol
7960: 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 lowing:.**.**
7970: 2a 20 20 50 6f 70 75 6c 61 74 65 73 20 74 68 65 * Populates the
7980: 20 68 65 61 64 65 72 20 6f 66 20 74 68 65 20 70 header of the p
7990: 61 67 65 2c 20 69 6e 63 6c 75 64 69 6e 67 20 73 age, including s
79a0: 65 74 74 69 6e 67 20 75 70 20 61 70 70 72 6f 70 etting up approp
79b0: 72 69 61 74 65 0a 2a 2a 20 20 20 20 20 20 73 75 riate.** su
79c0: 62 6d 65 6e 75 20 65 6c 65 6d 65 6e 74 73 2e 20 bmenu elements.
79d0: 20 54 68 65 20 68 65 61 64 65 72 20 67 65 6e 65 The header gene
79e0: 72 61 74 69 6f 6e 20 69 73 20 64 65 66 65 72 72 ration is deferr
79f0: 65 64 20 75 6e 74 69 6c 20 74 68 69 73 20 70 6f ed until this po
7a00: 69 6e 74 0a 2a 2a 20 20 20 20 20 20 73 6f 20 74 int.** so t
7a10: 68 61 74 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 hat we know that
7a20: 20 61 6c 6c 20 73 74 79 6c 65 5f 73 75 62 6d 65 all style_subme
7a30: 6e 75 5f 65 6c 65 6d 65 6e 74 28 29 20 61 6e 64 nu_element() and
7a40: 20 73 69 6d 69 6c 61 72 20 68 61 76 65 0a 2a 2a similar have.**
7a50: 20 20 20 20 20 20 62 65 65 6e 20 72 65 63 65 69 been recei
7a60: 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 ved..**.** *
7a70: 46 69 6e 61 6c 69 7a 65 73 20 74 68 65 20 70 61 Finalizes the pa
7a80: 67 65 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a ge content..**.*
7a90: 2a 20 20 20 2a 20 20 41 70 70 65 6e 64 73 20 74 * * Appends t
7aa0: 68 65 20 66 6f 6f 74 65 72 2e 0a 2a 2f 0a 76 6f he footer..*/.vo
7ab0: 69 64 20 73 74 79 6c 65 5f 66 69 6e 69 73 68 5f id style_finish_
7ac0: 70 61 67 65 28 29 7b 0a 20 20 63 6f 6e 73 74 20 page(){. const
7ad0: 63 68 61 72 20 2a 7a 46 6f 6f 74 65 72 3b 0a 20 char *zFooter;.
7ae0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 64 const char *zAd
7af0: 20 3d 20 30 3b 0a 20 20 75 6e 73 69 67 6e 65 64 = 0;. unsigned
7b00: 20 69 6e 74 20 6d 41 64 46 6c 61 67 73 20 3d 20 int mAdFlags =
7b10: 30 3b 0a 0a 20 20 69 66 28 20 21 68 65 61 64 65 0;.. if( !heade
7b20: 72 48 61 73 42 65 65 6e 47 65 6e 65 72 61 74 65 rHasBeenGenerate
7b30: 64 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f d ) return;.. /
7b40: 2a 20 47 6f 20 62 61 63 6b 20 61 6e 64 20 70 75 * Go back and pu
7b50: 74 20 74 68 65 20 73 75 62 6d 65 6e 75 20 61 74 t the submenu at
7b60: 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 the top of the
7b70: 70 61 67 65 2e 20 20 57 65 20 64 65 6c 61 79 20 page. We delay
7b80: 74 68 65 0a 20 20 2a 2a 20 63 72 65 61 74 69 6f the. ** creatio
7b90: 6e 20 6f 66 20 74 68 65 20 73 75 62 6d 65 6e 75 n of the submenu
7ba0: 20 75 6e 74 69 6c 20 74 68 65 20 65 6e 64 20 73 until the end s
7bb0: 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20 61 64 o that we can ad
7bc0: 64 20 65 6c 65 6d 65 6e 74 73 0a 20 20 2a 2a 20 d elements. **
7bd0: 74 6f 20 74 68 65 20 73 75 62 6d 65 6e 75 20 77 to the submenu w
7be0: 68 69 6c 65 20 67 65 6e 65 72 61 74 69 6e 67 20 hile generating
7bf0: 70 61 67 65 20 74 65 78 74 2e 0a 20 20 2a 2f 0a page text.. */.
7c00: 20 20 63 67 69 5f 64 65 73 74 69 6e 61 74 69 6f cgi_destinatio
7c10: 6e 28 43 47 49 5f 48 45 41 44 45 52 29 3b 0a 20 n(CGI_HEADER);.
7c20: 20 69 66 28 20 73 75 62 6d 65 6e 75 45 6e 61 62 if( submenuEnab
7c30: 6c 65 20 26 26 20 6e 53 75 62 6d 65 6e 75 2b 6e le && nSubmenu+n
7c40: 53 75 62 6d 65 6e 75 43 74 72 6c 3e 30 20 29 7b SubmenuCtrl>0 ){
7c50: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 . int i;.
7c60: 63 68 61 72 20 7a 43 6c 61 73 73 5b 33 32 5d 3b char zClass[32];
7c70: 20 2f 2a 20 72 65 64 75 63 65 64 20 66 6f 72 6d /* reduced form
7c80: 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 61 74 74 of the main att
7c90: 72 69 62 75 74 65 20 2a 2f 0a 20 20 20 20 69 66 ribute */. if
7ca0: 28 20 6e 53 75 62 6d 65 6e 75 43 74 72 6c 20 29 ( nSubmenuCtrl )
7cb0: 7b 0a 20 20 20 20 20 20 40 20 3c 66 6f 72 6d 20 {. @ <form
7cc0: 69 64 3d 27 66 30 31 27 20 6d 65 74 68 6f 64 3d id='f01' method=
7cd0: 27 47 45 54 27 20 61 63 74 69 6f 6e 3d 27 25 52 'GET' action='%R
7ce0: 2f 25 73 28 67 2e 7a 50 61 74 68 29 27 3e 0a 20 /%s(g.zPath)'>.
7cf0: 20 20 20 20 20 40 20 3c 69 6e 70 75 74 20 74 79 @ <input ty
7d00: 70 65 3d 27 68 69 64 64 65 6e 27 20 6e 61 6d 65 pe='hidden' name
7d10: 3d 27 75 64 63 27 20 76 61 6c 75 65 3d 27 31 27 ='udc' value='1'
7d20: 3e 0a 20 20 20 20 20 20 63 67 69 5f 74 61 67 5f >. cgi_tag_
7d30: 71 75 65 72 79 5f 70 61 72 61 6d 65 74 65 72 28 query_parameter(
7d40: 22 75 64 63 22 29 3b 0a 20 20 20 20 7d 0a 20 20 "udc");. }.
7d50: 20 20 40 20 3c 64 69 76 20 63 6c 61 73 73 3d 22 @ <div class="
7d60: 73 75 62 6d 65 6e 75 22 3e 0a 20 20 20 20 69 66 submenu">. if
7d70: 28 20 6e 53 75 62 6d 65 6e 75 3e 30 20 29 7b 0a ( nSubmenu>0 ){.
7d80: 20 20 20 20 20 20 71 73 6f 72 74 28 61 53 75 62 qsort(aSub
7d90: 6d 65 6e 75 2c 20 6e 53 75 62 6d 65 6e 75 2c 20 menu, nSubmenu,
7da0: 73 69 7a 65 6f 66 28 61 53 75 62 6d 65 6e 75 5b sizeof(aSubmenu[
7db0: 30 5d 29 2c 20 73 75 62 6d 65 6e 75 43 6f 6d 70 0]), submenuComp
7dc0: 61 72 65 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 are);. for(
7dd0: 69 3d 30 3b 20 69 3c 6e 53 75 62 6d 65 6e 75 3b i=0; i<nSubmenu;
7de0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 i++){. s
7df0: 74 72 75 63 74 20 53 75 62 6d 65 6e 75 20 2a 70 truct Submenu *p
7e00: 20 3d 20 26 61 53 75 62 6d 65 6e 75 5b 69 5d 3b = &aSubmenu[i];
7e10: 0a 20 20 20 20 20 20 20 20 73 74 79 6c 65 5f 64 . style_d
7e20: 65 72 69 76 65 5f 63 6c 61 73 73 6e 61 6d 65 28 erive_classname(
7e30: 70 2d 3e 7a 4c 61 62 65 6c 2c 20 7a 43 6c 61 73 p->zLabel, zClas
7e40: 73 2c 20 73 69 7a 65 6f 66 20 7a 43 6c 61 73 73 s, sizeof zClass
7e50: 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 73 77 );. /* sw
7e60: 69 74 63 68 69 6e 67 20 61 77 61 79 20 66 72 6f itching away fro
7e70: 6d 20 74 68 65 20 25 68 20 66 6f 72 6d 61 74 74 m the %h formatt
7e80: 69 6e 67 20 62 65 6c 6f 77 20 6d 69 67 68 74 20 ing below might
7e90: 62 65 20 64 61 6e 67 65 72 6f 75 73 0a 20 20 20 be dangerous.
7ea0: 20 20 20 20 20 2a 2a 20 62 65 63 61 75 73 65 20 ** because
7eb0: 73 6f 6d 65 20 70 6c 61 63 65 73 20 75 73 65 20 some places use
7ec0: 25 73 20 74 6f 20 63 6f 6d 70 6f 73 65 20 7a 4c %s to compose zL
7ed0: 61 62 65 6c 20 61 6e 64 20 7a 4c 69 6e 6b 3b 0a abel and zLink;.
7ee0: 20 20 20 20 20 20 20 20 2a 2a 20 65 2e 67 2e 20 ** e.g.
7ef0: 2f 72 70 74 76 69 65 77 20 70 61 67 65 20 61 6e /rptview page an
7f00: 64 20 74 68 65 20 73 75 62 6d 65 6e 75 43 6d 64 d the submenuCmd
7f10: 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 () function..
7f20: 20 20 20 20 20 2a 2a 20 22 73 6d 6c 22 20 73 74 ** "sml" st
7f30: 61 6e 64 73 20 66 6f 72 20 73 75 62 6d 65 6e 75 ands for submenu
7f40: 20 6c 69 6e 6b 2e 0a 20 20 20 20 20 20 20 20 2a link.. *
7f50: 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d /. if( p-
7f60: 3e 7a 4c 69 6e 6b 3d 3d 30 20 29 7b 0a 20 20 20 >zLink==0 ){.
7f70: 20 20 20 20 20 20 20 40 20 3c 73 70 61 6e 20 63 @ <span c
7f80: 6c 61 73 73 3d 22 6c 61 62 65 6c 20 73 6d 6c 2d lass="label sml-
7f90: 25 73 28 7a 43 6c 61 73 73 29 22 3e 25 68 28 70 %s(zClass)">%h(p
7fa0: 2d 3e 7a 4c 61 62 65 6c 29 3c 2f 73 70 61 6e 3e ->zLabel)</span>
7fb0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a . }else{.
7fc0: 20 20 20 20 20 20 20 20 20 20 40 20 3c 61 20 63 @ <a c
7fd0: 6c 61 73 73 3d 22 6c 61 62 65 6c 20 73 6d 6c 2d lass="label sml-
7fe0: 25 73 28 7a 43 6c 61 73 73 29 22 20 68 72 65 66 %s(zClass)" href
7ff0: 3d 22 25 68 28 70 2d 3e 7a 4c 69 6e 6b 29 22 3e ="%h(p->zLink)">
8000: 25 68 28 70 2d 3e 7a 4c 61 62 65 6c 29 3c 2f 61 %h(p->zLabel)</a
8010: 3e 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 >. }.
8020: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f }. }. fo
8030: 73 73 69 6c 5f 73 74 72 63 70 79 28 7a 43 6c 61 ssil_strcpy(zCla
8040: 73 73 2c 22 73 6d 63 2d 22 29 3b 20 20 20 2f 2a ss,"smc-"); /*
8050: 20 63 6f 6d 6d 6f 6e 20 70 72 65 66 69 78 20 66 common prefix f
8060: 6f 72 20 73 75 62 6d 65 6e 75 20 63 6f 6e 74 72 or submenu contr
8070: 6f 6c 73 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 ols */. for(i
8080: 3d 30 3b 20 69 3c 6e 53 75 62 6d 65 6e 75 43 74 =0; i<nSubmenuCt
8090: 72 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 rl; i++){.
80a0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 51 50 4e const char *zQPN
80b0: 20 3d 20 61 53 75 62 6d 65 6e 75 43 74 72 6c 5b = aSubmenuCtrl[
80c0: 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 i].zName;.
80d0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 69 73 const char *zDis
80e0: 61 62 6c 65 64 20 3d 20 22 22 3b 0a 20 20 20 20 abled = "";.
80f0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 58 const char *zX
8100: 74 72 61 43 6c 61 73 73 20 3d 20 22 22 3b 0a 20 traClass = "";.
8110: 20 20 20 20 20 69 66 28 20 61 53 75 62 6d 65 6e if( aSubmen
8120: 75 43 74 72 6c 5b 69 5d 2e 65 56 69 73 69 62 6c uCtrl[i].eVisibl
8130: 65 20 26 20 53 54 59 4c 45 5f 44 49 53 41 42 4c e & STYLE_DISABL
8140: 45 44 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 44 ED ){. zD
8150: 69 73 61 62 6c 65 64 20 3d 20 22 20 64 69 73 61 isabled = " disa
8160: 62 6c 65 64 22 3b 0a 20 20 20 20 20 20 7d 65 6c bled";. }el
8170: 73 65 20 69 66 28 20 7a 51 50 4e 20 29 7b 0a 20 se if( zQPN ){.
8180: 20 20 20 20 20 20 20 63 67 69 5f 74 61 67 5f 71 cgi_tag_q
8190: 75 65 72 79 5f 70 61 72 61 6d 65 74 65 72 28 7a uery_parameter(z
81a0: 51 50 4e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 QPN);. }.
81b0: 20 20 20 20 73 74 79 6c 65 5f 64 65 72 69 76 65 style_derive
81c0: 5f 63 6c 61 73 73 6e 61 6d 65 28 7a 51 50 4e 2c _classname(zQPN,
81d0: 20 7a 43 6c 61 73 73 2b 34 2c 20 73 69 7a 65 6f zClass+4, sizeo
81e0: 66 28 7a 43 6c 61 73 73 29 2d 34 29 3b 0a 20 20 f(zClass)-4);.
81f0: 20 20 20 20 73 77 69 74 63 68 28 20 61 53 75 62 switch( aSub
8200: 6d 65 6e 75 43 74 72 6c 5b 69 5d 2e 65 54 79 70 menuCtrl[i].eTyp
8210: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61 73 e ){. cas
8220: 65 20 46 46 5f 45 4e 54 52 59 3a 0a 20 20 20 20 e FF_ENTRY:.
8230: 20 20 20 20 20 20 40 20 3c 73 70 61 6e 20 63 6c @ <span cl
8240: 61 73 73 3d 27 73 75 62 6d 65 6e 75 63 74 72 6c ass='submenuctrl
8250: 25 73 28 7a 58 74 72 61 43 6c 61 73 73 29 20 25 %s(zXtraClass) %
8260: 73 28 7a 43 6c 61 73 73 29 27 3e 5c 0a 20 20 20 s(zClass)'>\.
8270: 20 20 20 20 20 20 20 40 20 26 6e 62 73 70 3b 25 @ %
8280: 68 28 61 53 75 62 6d 65 6e 75 43 74 72 6c 5b 69 h(aSubmenuCtrl[i
8290: 5d 2e 7a 4c 61 62 65 6c 29 5c 0a 20 20 20 20 20 ].zLabel)\.
82a0: 20 20 20 20 20 40 20 3c 69 6e 70 75 74 20 74 79 @ <input ty
82b0: 70 65 3d 27 74 65 78 74 27 20 6e 61 6d 65 3d 27 pe='text' name='
82c0: 25 73 28 7a 51 50 4e 29 27 20 76 61 6c 75 65 3d %s(zQPN)' value=
82d0: 27 25 68 28 50 44 28 7a 51 50 4e 2c 20 22 22 29 '%h(PD(zQPN, "")
82e0: 29 27 20 5c 0a 20 20 20 20 20 20 20 20 20 20 69 )' \. i
82f0: 66 28 20 61 53 75 62 6d 65 6e 75 43 74 72 6c 5b f( aSubmenuCtrl[
8300: 69 5d 2e 69 53 69 7a 65 3c 30 20 29 7b 0a 20 20 i].iSize<0 ){.
8310: 20 20 20 20 20 20 20 20 20 20 40 20 73 69 7a 65 @ size
8320: 3d 27 25 64 28 2d 61 53 75 62 6d 65 6e 75 43 74 ='%d(-aSubmenuCt
8330: 72 6c 5b 69 5d 2e 69 53 69 7a 65 29 27 20 5c 0a rl[i].iSize)' \.
8340: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 }else
8350: 69 66 28 20 61 53 75 62 6d 65 6e 75 43 74 72 6c if( aSubmenuCtrl
8360: 5b 69 5d 2e 69 53 69 7a 65 3e 30 20 29 7b 0a 20 [i].iSize>0 ){.
8370: 20 20 20 20 20 20 20 20 20 20 20 40 20 73 69 7a @ siz
8380: 65 3d 27 25 64 28 61 53 75 62 6d 65 6e 75 43 74 e='%d(aSubmenuCt
8390: 72 6c 5b 69 5d 2e 69 53 69 7a 65 29 27 20 5c 0a rl[i].iSize)' \.
83a0: 20 20 20 20 20 20 20 20 20 20 20 20 40 20 6d 61 @ ma
83b0: 78 6c 65 6e 67 74 68 3d 27 25 64 28 61 53 75 62 xlength='%d(aSub
83c0: 6d 65 6e 75 43 74 72 6c 5b 69 5d 2e 69 53 69 7a menuCtrl[i].iSiz
83d0: 65 29 27 20 5c 0a 20 20 20 20 20 20 20 20 20 20 e)' \.
83e0: 7d 0a 20 20 20 20 20 20 20 20 20 20 40 20 69 64 }. @ id
83f0: 3d 27 73 75 62 6d 65 6e 75 63 74 72 6c 2d 25 64 ='submenuctrl-%d
8400: 28 69 29 27 25 73 28 7a 44 69 73 61 62 6c 65 64 (i)'%s(zDisabled
8410: 29 3e 3c 2f 73 70 61 6e 3e 0a 20 20 20 20 20 20 )></span>.
8420: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 break;.
8430: 20 20 20 63 61 73 65 20 46 46 5f 4d 55 4c 54 49 case FF_MULTI
8440: 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e : {. in
8450: 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 63 t j;. c
8460: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 61 6c 20 onst char *zVal
8470: 3d 20 50 28 7a 51 50 4e 29 3b 0a 20 20 20 20 20 = P(zQPN);.
8480: 20 20 20 20 20 69 66 28 20 7a 58 74 72 61 43 6c if( zXtraCl
8490: 61 73 73 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 ass[0] ){.
84a0: 20 20 20 20 20 20 40 20 3c 73 70 61 6e 20 63 6c @ <span cl
84b0: 61 73 73 3d 27 25 73 28 7a 58 74 72 61 43 6c 61 ass='%s(zXtraCla
84c0: 73 73 2b 31 29 20 25 73 28 7a 43 6c 61 73 73 29 ss+1) %s(zClass)
84d0: 27 3e 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 '>. }.
84e0: 20 20 20 20 20 20 20 20 20 69 66 28 20 61 53 75 if( aSu
84f0: 62 6d 65 6e 75 43 74 72 6c 5b 69 5d 2e 7a 4c 61 bmenuCtrl[i].zLa
8500: 62 65 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 bel ){.
8510: 20 20 20 40 20 26 6e 62 73 70 3b 25 68 28 61 53 @ %h(aS
8520: 75 62 6d 65 6e 75 43 74 72 6c 5b 69 5d 2e 7a 4c ubmenuCtrl[i].zL
8530: 61 62 65 6c 29 5c 0a 20 20 20 20 20 20 20 20 20 abel)\.
8540: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 40 20 3c }. @ <
8550: 73 65 6c 65 63 74 20 63 6c 61 73 73 3d 27 73 75 select class='su
8560: 62 6d 65 6e 75 63 74 72 6c 20 25 73 28 7a 43 6c bmenuctrl %s(zCl
8570: 61 73 73 29 27 20 73 69 7a 65 3d 27 31 27 20 6e ass)' size='1' n
8580: 61 6d 65 3d 27 25 73 28 7a 51 50 4e 29 27 20 5c ame='%s(zQPN)' \
8590: 0a 20 20 20 20 20 20 20 20 20 20 40 20 69 64 3d . @ id=
85a0: 27 73 75 62 6d 65 6e 75 63 74 72 6c 2d 25 64 28 'submenuctrl-%d(
85b0: 69 29 27 25 73 28 7a 44 69 73 61 62 6c 65 64 29 i)'%s(zDisabled)
85c0: 3e 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 >. for(
85d0: 6a 3d 30 3b 20 6a 3c 61 53 75 62 6d 65 6e 75 43 j=0; j<aSubmenuC
85e0: 74 72 6c 5b 69 5d 2e 69 53 69 7a 65 2a 32 3b 20 trl[i].iSize*2;
85f0: 6a 2b 3d 32 29 7b 0a 20 20 20 20 20 20 20 20 20 j+=2){.
8600: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a const char *z
8610: 51 50 56 20 3d 20 61 53 75 62 6d 65 6e 75 43 74 QPV = aSubmenuCt
8620: 72 6c 5b 69 5d 2e 61 7a 43 68 6f 69 63 65 5b 6a rl[i].azChoice[j
8630: 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 40 ];. @
8640: 20 3c 6f 70 74 69 6f 6e 20 76 61 6c 75 65 3d 27 <option value='
8650: 25 68 28 7a 51 50 56 29 27 5c 0a 20 20 20 20 20 %h(zQPV)'\.
8660: 20 20 20 20 20 20 20 69 66 28 20 66 6f 73 73 69 if( fossi
8670: 6c 5f 73 74 72 63 6d 70 28 7a 56 61 6c 2c 20 7a l_strcmp(zVal, z
8680: 51 50 56 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 QPV)==0 ){.
8690: 20 20 20 20 20 20 20 20 20 40 20 20 73 65 6c 65 @ sele
86a0: 63 74 65 64 5c 0a 20 20 20 20 20 20 20 20 20 20 cted\.
86b0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 }.
86c0: 40 20 3e 25 68 28 61 53 75 62 6d 65 6e 75 43 74 @ >%h(aSubmenuCt
86d0: 72 6c 5b 69 5d 2e 61 7a 43 68 6f 69 63 65 5b 6a rl[i].azChoice[j
86e0: 2b 31 5d 29 3c 2f 6f 70 74 69 6f 6e 3e 0a 20 20 +1])</option>.
86f0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 }.
8700: 20 20 20 20 40 20 3c 2f 73 65 6c 65 63 74 3e 0a @ </select>.
8710: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 58 if( zX
8720: 74 72 61 43 6c 61 73 73 5b 30 5d 20 29 7b 0a 20 traClass[0] ){.
8730: 20 20 20 20 20 20 20 20 20 20 20 40 20 3c 2f 73 @ </s
8740: 70 61 6e 3e 0a 20 20 20 20 20 20 20 20 20 20 7d pan>. }
8750: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b . break
8760: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 ;. }.
8770: 20 20 20 20 63 61 73 65 20 46 46 5f 42 49 4e 41 case FF_BINA
8780: 52 59 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 RY: {.
8790: 69 6e 74 20 69 73 54 72 75 65 20 3d 20 50 42 28 int isTrue = PB(
87a0: 7a 51 50 4e 29 3b 0a 20 20 20 20 20 20 20 20 20 zQPN);.
87b0: 20 40 20 3c 73 65 6c 65 63 74 20 63 6c 61 73 73 @ <select class
87c0: 3d 27 73 75 62 6d 65 6e 75 63 74 72 6c 25 73 28 ='submenuctrl%s(
87d0: 7a 58 74 72 61 43 6c 61 73 73 29 27 20 73 69 7a zXtraClass)' siz
87e0: 65 3d 27 31 27 20 5c 0a 20 20 20 20 20 20 20 20 e='1' \.
87f0: 20 20 40 20 6e 61 6d 65 3d 27 25 73 28 7a 51 50 @ name='%s(zQP
8800: 4e 29 27 20 69 64 3d 27 73 75 62 6d 65 6e 75 63 N)' id='submenuc
8810: 74 72 6c 2d 25 64 28 69 29 27 25 73 28 7a 44 69 trl-%d(i)'%s(zDi
8820: 73 61 62 6c 65 64 29 3e 0a 20 20 20 20 20 20 20 sabled)>.
8830: 20 20 20 40 20 3c 6f 70 74 69 6f 6e 20 76 61 6c @ <option val
8840: 75 65 3d 27 31 27 5c 0a 20 20 20 20 20 20 20 20 ue='1'\.
8850: 20 20 69 66 28 20 69 73 54 72 75 65 20 29 7b 0a if( isTrue ){.
8860: 20 20 20 20 20 20 20 20 20 20 20 20 40 20 20 73 @ s
8870: 65 6c 65 63 74 65 64 5c 0a 20 20 20 20 20 20 20 elected\.
8880: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 40 }. @
8890: 20 3e 25 68 28 61 53 75 62 6d 65 6e 75 43 74 72 >%h(aSubmenuCtr
88a0: 6c 5b 69 5d 2e 7a 4c 61 62 65 6c 29 3c 2f 6f 70 l[i].zLabel)</op
88b0: 74 69 6f 6e 3e 0a 20 20 20 20 20 20 20 20 20 20 tion>.
88c0: 40 20 3c 6f 70 74 69 6f 6e 20 76 61 6c 75 65 3d @ <option value=
88d0: 27 30 27 5c 0a 20 20 20 20 20 20 20 20 20 20 69 '0'\. i
88e0: 66 28 20 21 69 73 54 72 75 65 20 29 7b 0a 20 20 f( !isTrue ){.
88f0: 20 20 20 20 20 20 20 20 20 20 40 20 20 73 65 6c @ sel
8900: 65 63 74 65 64 5c 0a 20 20 20 20 20 20 20 20 20 ected\.
8910: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 40 20 3e }. @ >
8920: 25 68 28 61 53 75 62 6d 65 6e 75 43 74 72 6c 5b %h(aSubmenuCtrl[
8930: 69 5d 2e 7a 46 61 6c 73 65 29 3c 2f 6f 70 74 69 i].zFalse)</opti
8940: 6f 6e 3e 0a 20 20 20 20 20 20 20 20 20 20 40 20 on>. @
8950: 3c 2f 73 65 6c 65 63 74 3e 0a 20 20 20 20 20 20 </select>.
8960: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 break;.
8970: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 61 73 }. cas
8980: 65 20 46 46 5f 43 48 45 43 4b 42 4f 58 3a 20 7b e FF_CHECKBOX: {
8990: 0a 20 20 20 20 20 20 20 20 20 20 40 20 3c 6c 61 . @ <la
89a0: 62 65 6c 20 63 6c 61 73 73 3d 27 73 75 62 6d 65 bel class='subme
89b0: 6e 75 63 74 72 6c 20 73 75 62 6d 65 6e 75 63 6b nuctrl submenuck
89c0: 62 6f 78 25 73 28 7a 58 74 72 61 43 6c 61 73 73 box%s(zXtraClass
89d0: 29 20 25 73 28 7a 43 6c 61 73 73 29 27 3e 5c 0a ) %s(zClass)'>\.
89e0: 20 20 20 20 20 20 20 20 20 20 40 20 3c 69 6e 70 @ <inp
89f0: 75 74 20 74 79 70 65 3d 27 63 68 65 63 6b 62 6f ut type='checkbo
8a00: 78 27 20 6e 61 6d 65 3d 27 25 73 28 7a 51 50 4e x' name='%s(zQPN
8a10: 29 27 20 69 64 3d 27 73 75 62 6d 65 6e 75 63 74 )' id='submenuct
8a20: 72 6c 2d 25 64 28 69 29 27 20 5c 0a 20 20 20 20 rl-%d(i)' \.
8a30: 20 20 20 20 20 20 69 66 28 20 50 42 28 7a 51 50 if( PB(zQP
8a40: 4e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 N) ){.
8a50: 20 20 40 20 63 68 65 63 6b 65 64 20 5c 0a 20 20 @ checked \.
8a60: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 }.
8a70: 20 20 20 20 69 66 28 20 61 53 75 62 6d 65 6e 75 if( aSubmenu
8a80: 43 74 72 6c 5b 69 5d 2e 7a 4a 53 20 29 7b 0a 20 Ctrl[i].zJS ){.
8a90: 20 20 20 20 20 20 20 20 20 20 20 40 20 64 61 74 @ dat
8aa0: 61 2d 63 74 72 6c 3d 27 25 73 28 61 53 75 62 6d a-ctrl='%s(aSubm
8ab0: 65 6e 75 43 74 72 6c 5b 69 5d 2e 7a 4a 53 29 27 enuCtrl[i].zJS)'
8ac0: 25 73 28 7a 44 69 73 61 62 6c 65 64 29 3e 5c 0a %s(zDisabled)>\.
8ad0: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b }else{
8ae0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 40 20 25 . @ %
8af0: 73 28 7a 44 69 73 61 62 6c 65 64 29 3e 5c 0a 20 s(zDisabled)>\.
8b00: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 }.
8b10: 20 20 20 20 20 40 20 25 68 28 61 53 75 62 6d 65 @ %h(aSubme
8b20: 6e 75 43 74 72 6c 5b 69 5d 2e 7a 4c 61 62 65 6c nuCtrl[i].zLabel
8b30: 29 3c 2f 6c 61 62 65 6c 3e 0a 20 20 20 20 20 20 )</label>.
8b40: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 break;.
8b50: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 }. }.
8b60: 20 7d 0a 20 20 20 20 40 20 3c 2f 64 69 76 3e 0a }. @ </div>.
8b70: 20 20 20 20 69 66 28 20 6e 53 75 62 6d 65 6e 75 if( nSubmenu
8b80: 43 74 72 6c 20 29 7b 0a 20 20 20 20 20 20 63 67 Ctrl ){. cg
8b90: 69 5f 71 75 65 72 79 5f 70 61 72 61 6d 65 74 65 i_query_paramete
8ba0: 72 73 5f 74 6f 5f 68 69 64 64 65 6e 28 29 3b 0a rs_to_hidden();.
8bb0: 20 20 20 20 20 20 63 67 69 5f 74 61 67 5f 71 75 cgi_tag_qu
8bc0: 65 72 79 5f 70 61 72 61 6d 65 74 65 72 28 30 29 ery_parameter(0)
8bd0: 3b 0a 20 20 20 20 20 20 40 20 3c 2f 66 6f 72 6d ;. @ </form
8be0: 3e 0a 20 20 20 20 20 20 62 75 69 6c 74 69 6e 5f >. builtin_
8bf0: 72 65 71 75 65 73 74 5f 6a 73 28 22 6d 65 6e 75 request_js("menu
8c00: 2e 6a 73 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d .js");. }. }
8c10: 0a 0a 20 20 7a 41 64 20 3d 20 73 74 79 6c 65 5f .. zAd = style_
8c20: 61 64 75 6e 69 74 5f 74 65 78 74 28 26 6d 41 64 adunit_text(&mAd
8c30: 46 6c 61 67 73 29 3b 0a 20 20 69 66 28 20 28 6d Flags);. if( (m
8c40: 41 64 46 6c 61 67 73 20 26 20 41 44 55 4e 49 54 AdFlags & ADUNIT
8c50: 5f 52 49 47 48 54 5f 4f 4b 29 21 3d 30 20 20 29 _RIGHT_OK)!=0 )
8c60: 7b 0a 20 20 20 20 40 20 3c 64 69 76 20 63 6c 61 {. @ <div cla
8c70: 73 73 3d 22 63 6f 6e 74 65 6e 74 20 61 64 75 6e ss="content adun
8c80: 69 74 5f 72 69 67 68 74 5f 63 6f 6e 74 61 69 6e it_right_contain
8c90: 65 72 22 3e 0a 20 20 20 20 40 20 3c 64 69 76 20 er">. @ <div
8ca0: 63 6c 61 73 73 3d 22 61 64 75 6e 69 74 5f 72 69 class="adunit_ri
8cb0: 67 68 74 22 3e 0a 20 20 20 20 63 67 69 5f 61 70 ght">. cgi_ap
8cc0: 70 65 6e 64 5f 63 6f 6e 74 65 6e 74 28 7a 41 64 pend_content(zAd
8cd0: 2c 20 2d 31 29 3b 0a 20 20 20 20 40 20 3c 2f 64 , -1);. @ </d
8ce0: 69 76 3e 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 iv>. }else if(
8cf0: 7a 41 64 20 29 7b 0a 20 20 20 20 40 20 3c 64 69 zAd ){. @ <di
8d00: 76 20 63 6c 61 73 73 3d 22 61 64 75 6e 69 74 5f v class="adunit_
8d10: 62 61 6e 6e 65 72 22 3e 0a 20 20 20 20 63 67 69 banner">. cgi
8d20: 5f 61 70 70 65 6e 64 5f 63 6f 6e 74 65 6e 74 28 _append_content(
8d30: 7a 41 64 2c 20 2d 31 29 3b 0a 20 20 20 20 40 20 zAd, -1);. @
8d40: 3c 2f 64 69 76 3e 0a 20 20 7d 0a 0a 20 20 40 20 </div>. }.. @
8d50: 3c 64 69 76 20 63 6c 61 73 73 3d 22 63 6f 6e 74 <div class="cont
8d60: 65 6e 74 22 3e 3c 73 70 61 6e 20 69 64 3d 22 64 ent"><span id="d
8d70: 65 62 75 67 4d 73 67 22 3e 3c 2f 73 70 61 6e 3e ebugMsg"></span>
8d80: 0a 20 20 63 67 69 5f 64 65 73 74 69 6e 61 74 69 . cgi_destinati
8d90: 6f 6e 28 43 47 49 5f 42 4f 44 59 29 3b 0a 0a 20 on(CGI_BODY);..
8da0: 20 69 66 28 20 73 69 64 65 62 6f 78 55 73 65 64 if( sideboxUsed
8db0: 20 29 7b 0a 20 20 20 20 40 20 3c 64 69 76 20 63 ){. @ <div c
8dc0: 6c 61 73 73 3d 22 65 6e 64 43 6f 6e 74 65 6e 74 lass="endContent
8dd0: 22 3e 3c 2f 64 69 76 3e 0a 20 20 7d 0a 20 20 40 "></div>. }. @
8de0: 20 3c 2f 64 69 76 3e 0a 0a 20 20 2f 2a 20 50 75 </div>.. /* Pu
8df0: 74 20 74 68 65 20 66 6f 6f 74 65 72 20 61 74 20 t the footer at
8e00: 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66 20 74 68 the bottom of th
8e10: 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 7a 46 6f e page. */. zFo
8e20: 6f 74 65 72 20 3d 20 73 6b 69 6e 5f 67 65 74 28 oter = skin_get(
8e30: 22 66 6f 6f 74 65 72 22 29 3b 0a 20 20 69 66 28 "footer");. if(
8e40: 20 73 71 6c 69 74 65 33 5f 73 74 72 6c 69 6b 65 sqlite3_strlike
8e50: 28 22 25 3c 2f 62 6f 64 79 3e 25 22 2c 20 7a 46 ("%</body>%", zF
8e60: 6f 6f 74 65 72 2c 20 30 29 3d 3d 30 20 29 7b 0a ooter, 0)==0 ){.
8e70: 20 20 20 20 73 74 79 6c 65 5f 6c 6f 61 64 5f 61 style_load_a
8e80: 6c 6c 5f 6a 73 5f 66 69 6c 65 73 28 29 3b 0a 20 ll_js_files();.
8e90: 20 7d 0a 20 20 69 66 28 20 67 2e 74 68 54 72 61 }. if( g.thTra
8ea0: 63 65 20 29 20 54 68 5f 54 72 61 63 65 28 22 42 ce ) Th_Trace("B
8eb0: 45 47 49 4e 5f 46 4f 4f 54 45 52 3c 62 72 3e 5c EGIN_FOOTER<br>\
8ec0: 6e 22 2c 20 2d 31 29 3b 0a 20 20 54 68 5f 52 65 n", -1);. Th_Re
8ed0: 6e 64 65 72 28 7a 46 6f 6f 74 65 72 29 3b 0a 20 nder(zFooter);.
8ee0: 20 69 66 28 20 67 2e 74 68 54 72 61 63 65 20 29 if( g.thTrace )
8ef0: 20 54 68 5f 54 72 61 63 65 28 22 45 4e 44 5f 46 Th_Trace("END_F
8f00: 4f 4f 54 45 52 3c 62 72 3e 5c 6e 22 2c 20 2d 31 OOTER<br>\n", -1
8f10: 29 3b 0a 0a 20 20 2f 2a 20 52 65 6e 64 65 72 20 );.. /* Render
8f20: 74 72 61 63 65 20 6c 6f 67 20 69 66 20 54 48 31 trace log if TH1
8f30: 20 74 72 61 63 69 6e 67 20 69 73 20 65 6e 61 62 tracing is enab
8f40: 6c 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 67 2e led. */. if( g.
8f50: 74 68 54 72 61 63 65 20 29 7b 0a 20 20 20 20 63 thTrace ){. c
8f60: 67 69 5f 61 70 70 65 6e 64 5f 63 6f 6e 74 65 6e gi_append_conten
8f70: 74 28 22 3c 73 70 61 6e 20 63 6c 61 73 73 3d 5c t("<span class=\
8f80: 22 74 68 54 72 61 63 65 5c 22 3e 3c 68 72 3e 5c "thTrace\"><hr>\
8f90: 6e 22 2c 20 2d 31 29 3b 0a 20 20 20 20 63 67 69 n", -1);. cgi
8fa0: 5f 61 70 70 65 6e 64 5f 63 6f 6e 74 65 6e 74 28 _append_content(
8fb0: 62 6c 6f 62 5f 73 74 72 28 26 67 2e 74 68 4c 6f blob_str(&g.thLo
8fc0: 67 29 2c 20 62 6c 6f 62 5f 73 69 7a 65 28 26 67 g), blob_size(&g
8fd0: 2e 74 68 4c 6f 67 29 29 3b 0a 20 20 20 20 63 67 .thLog));. cg
8fe0: 69 5f 61 70 70 65 6e 64 5f 63 6f 6e 74 65 6e 74 i_append_content
8ff0: 28 22 3c 2f 73 70 61 6e 3e 5c 6e 22 2c 20 2d 31 ("</span>\n", -1
9000: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64 64 );. }.. /* Add
9010: 20 64 6f 63 75 6d 65 6e 74 20 65 6e 64 20 6d 61 document end ma
9020: 72 6b 20 69 66 20 69 74 20 77 61 73 20 6e 6f 74 rk if it was not
9030: 20 69 6e 20 74 68 65 20 66 6f 6f 74 65 72 20 2a in the footer *
9040: 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f /. if( sqlite3_
9050: 73 74 72 6c 69 6b 65 28 22 25 3c 2f 62 6f 64 79 strlike("%</body
9060: 3e 25 22 2c 20 7a 46 6f 6f 74 65 72 2c 20 30 29 >%", zFooter, 0)
9070: 21 3d 30 20 29 7b 0a 20 20 20 20 73 74 79 6c 65 !=0 ){. style
9080: 5f 6c 6f 61 64 5f 61 6c 6c 5f 6a 73 5f 66 69 6c _load_all_js_fil
9090: 65 73 28 29 3b 0a 20 20 20 20 40 20 3c 2f 62 6f es();. @ </bo
90a0: 64 79 3e 0a 20 20 20 20 40 20 3c 2f 68 74 6d 6c dy>. @ </html
90b0: 3e 0a 20 20 7d 0a 20 20 2f 2a 20 55 70 64 61 74 >. }. /* Updat
90c0: 65 20 74 68 65 20 75 73 65 72 20 64 69 73 70 6c e the user displ
90d0: 61 79 20 70 72 65 66 73 20 63 6f 6f 6b 69 65 20 ay prefs cookie
90e0: 69 66 20 69 74 20 77 61 73 20 6d 6f 64 69 66 69 if it was modifi
90f0: 65 64 20 2a 2f 0a 20 20 63 6f 6f 6b 69 65 5f 72 ed */. cookie_r
9100: 65 6e 64 65 72 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a ender();.}../*.*
9110: 2a 20 42 65 67 69 6e 20 61 20 73 69 64 65 2d 62 * Begin a side-b
9120: 6f 78 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2d ox on the right-
9130: 68 61 6e 64 20 73 69 64 65 20 6f 66 20 61 20 70 hand side of a p
9140: 61 67 65 2e 20 20 54 68 65 20 74 69 74 6c 65 20 age. The title
9150: 61 6e 64 0a 2a 2a 20 74 68 65 20 77 69 64 74 68 and.** the width
9160: 20 6f 66 20 74 68 65 20 62 6f 78 20 61 72 65 20 of the box are
9170: 67 69 76 65 6e 20 61 73 20 61 72 67 75 6d 65 6e given as argumen
9180: 74 73 2e 20 20 54 68 65 20 77 69 64 74 68 20 69 ts. The width i
9190: 73 20 75 73 75 61 6c 6c 79 0a 2a 2a 20 61 20 70 s usually.** a p
91a0: 65 72 63 65 6e 74 61 67 65 20 6f 66 20 74 6f 74 ercentage of tot
91b0: 61 6c 20 73 63 72 65 65 6e 20 77 69 64 74 68 2e al screen width.
91c0: 0a 2a 2f 0a 76 6f 69 64 20 73 74 79 6c 65 5f 73 .*/.void style_s
91d0: 69 64 65 62 6f 78 5f 62 65 67 69 6e 28 63 6f 6e idebox_begin(con
91e0: 73 74 20 63 68 61 72 20 2a 7a 54 69 74 6c 65 2c st char *zTitle,
91f0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 57 69 const char *zWi
9200: 64 74 68 29 7b 0a 20 20 73 69 64 65 62 6f 78 55 dth){. sideboxU
9210: 73 65 64 20 3d 20 31 3b 0a 20 20 40 20 3c 64 69 sed = 1;. @ <di
9220: 76 20 63 6c 61 73 73 3d 22 73 69 64 65 62 6f 78 v class="sidebox
9230: 22 20 73 74 79 6c 65 3d 22 77 69 64 74 68 3a 25 " style="width:%
9240: 73 28 7a 57 69 64 74 68 29 22 3e 0a 20 20 40 20 s(zWidth)">. @
9250: 3c 64 69 76 20 63 6c 61 73 73 3d 22 73 69 64 65 <div class="side
9260: 62 6f 78 54 69 74 6c 65 22 3e 25 68 28 7a 54 69 boxTitle">%h(zTi
9270: 74 6c 65 29 3c 2f 64 69 76 3e 0a 7d 0a 0a 2f 2a tle)</div>.}../*
9280: 20 45 6e 64 20 74 68 65 20 73 69 64 65 2d 62 6f End the side-bo
9290: 78 0a 2a 2f 0a 76 6f 69 64 20 73 74 79 6c 65 5f x.*/.void style_
92a0: 73 69 64 65 62 6f 78 5f 65 6e 64 28 76 6f 69 64 sidebox_end(void
92b0: 29 7b 0a 20 20 40 20 3c 2f 64 69 76 3e 0a 7d 0a ){. @ </div>.}.
92c0: 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 73 74 ./*.** Search st
92d0: 72 69 6e 67 20 7a 43 73 73 20 66 6f 72 20 7a 53 ring zCss for zS
92e0: 65 6c 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 52 elector..**.** R
92f0: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 66 6f eturn true if fo
9300: 75 6e 64 2e 20 20 52 65 74 75 72 6e 20 66 61 6c und. Return fal
9310: 73 65 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 0a se if not found.
9320: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f */.static int co
9330: 6e 74 61 69 6e 73 53 65 6c 65 63 74 6f 72 28 63 ntainsSelector(c
9340: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 73 73 2c onst char *zCss,
9350: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 65 const char *zSe
9360: 6c 65 63 74 6f 72 29 7b 0a 20 20 63 6f 6e 73 74 lector){. const
9370: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 6e 74 20 char *z;. int
9380: 6e 3b 0a 20 20 69 6e 74 20 73 65 6c 65 63 74 6f n;. int selecto
9390: 72 4c 65 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c rLen = (int)strl
93a0: 65 6e 28 7a 53 65 6c 65 63 74 6f 72 29 3b 0a 0a en(zSelector);..
93b0: 20 20 66 6f 72 28 7a 3d 7a 43 73 73 3b 20 2a 7a for(z=zCss; *z
93c0: 3b 20 7a 2b 3d 73 65 6c 65 63 74 6f 72 4c 65 6e ; z+=selectorLen
93d0: 29 7b 0a 20 20 20 20 7a 20 3d 20 73 74 72 73 74 ){. z = strst
93e0: 72 28 7a 2c 20 7a 53 65 6c 65 63 74 6f 72 29 3b r(z, zSelector);
93f0: 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 . if( z==0 )
9400: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 return 0;. if
9410: 28 20 7a 21 3d 7a 43 73 73 20 29 7b 0a 20 20 20 ( z!=zCss ){.
9420: 20 20 20 66 6f 72 28 20 6e 3d 2d 31 3b 20 7a 2b for( n=-1; z+
9430: 6e 21 3d 7a 43 73 73 20 26 26 20 66 6f 73 73 69 n!=zCss && fossi
9440: 6c 5f 69 73 73 70 61 63 65 28 7a 5b 6e 5d 29 3b l_isspace(z[n]);
9450: 20 6e 2d 2d 29 3b 0a 20 20 20 20 20 20 69 66 28 n--);. if(
9460: 20 7a 2b 6e 21 3d 7a 43 73 73 20 26 26 20 7a 5b z+n!=zCss && z[
9470: 6e 5d 21 3d 27 2c 27 20 26 26 20 7a 5b 6e 5d 21 n]!=',' && z[n]!
9480: 3d 20 27 7d 27 20 26 26 20 7a 5b 6e 5d 21 3d 27 = '}' && z[n]!='
9490: 2f 27 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 /' ) continue;.
94a0: 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 20 6e 3d }. for( n=
94b0: 73 65 6c 65 63 74 6f 72 4c 65 6e 3b 20 7a 5b 6e selectorLen; z[n
94c0: 5d 20 26 26 20 66 6f 73 73 69 6c 5f 69 73 73 70 ] && fossil_issp
94d0: 61 63 65 28 7a 5b 6e 5d 29 3b 20 6e 2b 2b 20 29 ace(z[n]); n++ )
94e0: 3b 0a 20 20 20 20 69 66 28 20 7a 5b 6e 5d 3d 3d ;. if( z[n]==
94f0: 27 2c 27 20 7c 7c 20 7a 5b 6e 5d 3d 3d 27 7b 27 ',' || z[n]=='{'
9500: 20 7c 7c 20 7a 5b 6e 5d 3d 3d 27 2f 27 20 29 20 || z[n]=='/' )
9510: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 return 1;. }.
9520: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a return 0;.}../*.
9530: 2a 2a 20 43 4f 4d 4d 41 4e 44 3a 20 74 65 73 74 ** COMMAND: test
9540: 2d 63 6f 6e 74 61 69 6e 73 2d 73 65 6c 65 63 74 -contains-select
9550: 6f 72 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 or.**.** Usage:
9560: 25 66 6f 73 73 69 6c 20 74 65 73 74 2d 63 6f 6e %fossil test-con
9570: 74 61 69 6e 73 2d 73 65 6c 65 63 74 6f 72 20 46 tains-selector F
9580: 49 4c 45 4e 41 4d 45 20 53 45 4c 45 43 54 4f 52 ILENAME SELECTOR
9590: 0a 2a 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 .**.** Determine
95a0: 20 69 66 20 74 68 65 20 43 53 53 20 73 74 79 6c if the CSS styl
95b0: 65 73 68 65 65 74 20 46 49 4c 45 4e 41 4d 45 20 esheet FILENAME
95c0: 63 6f 6e 74 61 69 6e 73 20 53 45 4c 45 43 54 4f contains SELECTO
95d0: 52 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 R..**.** Note th
95e0: 61 74 20 61 73 20 6f 66 20 32 30 32 30 2d 30 35 at as of 2020-05
95f0: 2d 32 38 2c 20 74 68 65 20 64 65 66 61 75 6c 74 -28, the default
9600: 20 72 75 6c 65 73 20 61 72 65 20 61 6c 77 61 79 rules are alway
9610: 73 20 65 6d 69 74 74 65 64 2c 0a 2a 2a 20 73 6f s emitted,.** so
9620: 20 74 68 65 20 63 6f 6e 74 61 69 6e 73 53 65 6c the containsSel
9630: 65 63 74 6f 72 28 29 20 6c 6f 67 69 63 20 69 73 ector() logic is
9640: 20 6e 6f 20 6c 6f 6e 67 65 72 20 61 70 70 6c 69 no longer appli
9650: 65 64 20 77 68 65 6e 20 65 6d 69 74 74 69 6e 67 ed when emitting
9660: 0a 2a 2a 20 73 74 79 6c 65 2e 63 73 73 2e 20 49 .** style.css. I
9670: 74 20 69 73 20 75 6e 63 6c 65 61 72 20 77 68 65 t is unclear whe
9680: 74 68 65 72 20 74 68 69 73 20 74 65 73 74 20 63 ther this test c
9690: 6f 6d 6d 61 6e 64 20 69 73 20 6e 6f 77 20 6f 62 ommand is now ob
96a0: 73 6f 6c 65 74 65 0a 2a 2a 20 6f 72 20 77 68 65 solete.** or whe
96b0: 74 68 65 72 20 69 74 20 6d 61 79 20 73 74 69 6c ther it may stil
96c0: 6c 20 73 65 72 76 65 20 61 20 70 75 72 70 6f 73 l serve a purpos
96d0: 65 2e 0a 2a 2f 0a 76 6f 69 64 20 63 6f 6e 74 61 e..*/.void conta
96e0: 69 6e 73 5f 73 65 6c 65 63 74 6f 72 5f 63 6d 64 ins_selector_cmd
96f0: 28 76 6f 69 64 29 7b 0a 20 20 69 6e 74 20 66 6f (void){. int fo
9700: 75 6e 64 3b 0a 20 20 63 68 61 72 20 2a 7a 53 65 und;. char *zSe
9710: 6c 65 63 74 6f 72 3b 0a 20 20 42 6c 6f 62 20 63 lector;. Blob c
9720: 73 73 3b 0a 20 20 69 66 28 20 67 2e 61 72 67 63 ss;. if( g.argc
9730: 21 3d 34 20 29 20 75 73 61 67 65 28 22 46 49 4c !=4 ) usage("FIL
9740: 45 4e 41 4d 45 20 53 45 4c 45 43 54 4f 52 22 29 ENAME SELECTOR")
9750: 3b 0a 20 20 62 6c 6f 62 5f 72 65 61 64 5f 66 72 ;. blob_read_fr
9760: 6f 6d 5f 66 69 6c 65 28 26 63 73 73 2c 20 67 2e om_file(&css, g.
9770: 61 72 67 76 5b 32 5d 2c 20 45 78 74 46 49 4c 45 argv[2], ExtFILE
9780: 29 3b 0a 20 20 7a 53 65 6c 65 63 74 6f 72 20 3d );. zSelector =
9790: 20 67 2e 61 72 67 76 5b 33 5d 3b 0a 20 20 66 6f g.argv[3];. fo
97a0: 75 6e 64 20 3d 20 63 6f 6e 74 61 69 6e 73 53 65 und = containsSe
97b0: 6c 65 63 74 6f 72 28 62 6c 6f 62 5f 73 74 72 28 lector(blob_str(
97c0: 26 63 73 73 29 2c 20 7a 53 65 6c 65 63 74 6f 72 &css), zSelector
97d0: 29 3b 0a 20 20 66 6f 73 73 69 6c 5f 70 72 69 6e );. fossil_prin
97e0: 74 28 22 25 73 20 25 73 5c 6e 22 2c 20 7a 53 65 t("%s %s\n", zSe
97f0: 6c 65 63 74 6f 72 2c 20 66 6f 75 6e 64 20 3f 20 lector, found ?
9800: 22 66 6f 75 6e 64 22 20 3a 20 22 6e 6f 74 20 66 "found" : "not f
9810: 6f 75 6e 64 22 29 3b 0a 20 20 62 6c 6f 62 5f 72 ound");. blob_r
9820: 65 73 65 74 28 26 63 73 73 29 3b 0a 7d 0a 0a 2f eset(&css);.}../
9830: 2a 0a 2a 2a 20 57 45 42 50 41 47 45 3a 20 73 63 *.** WEBPAGE: sc
9840: 72 69 70 74 2e 6a 73 0a 2a 2a 0a 2a 2a 20 52 65 ript.js.**.** Re
9850: 74 75 72 6e 20 74 68 65 20 22 4a 61 76 61 73 63 turn the "Javasc
9860: 72 69 70 74 22 20 63 6f 6e 74 65 6e 74 20 66 6f ript" content fo
9870: 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 6b r the current sk
9880: 69 6e 20 28 69 66 20 74 68 65 72 65 20 69 73 20 in (if there is
9890: 61 6e 79 29 0a 2a 2f 0a 76 6f 69 64 20 70 61 67 any).*/.void pag
98a0: 65 5f 73 63 72 69 70 74 5f 6a 73 28 76 6f 69 64 e_script_js(void
98b0: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 ){. const char
98c0: 2a 7a 53 63 72 69 70 74 20 3d 20 73 6b 69 6e 5f *zScript = skin_
98d0: 67 65 74 28 22 6a 73 22 29 3b 0a 20 20 69 66 28 get("js");. if(
98e0: 20 50 28 22 74 65 73 74 22 29 20 29 7b 0a 20 20 P("test") ){.
98f0: 20 20 2f 2a 20 52 65 6e 64 65 72 20 74 68 65 20 /* Render the
9900: 73 63 72 69 70 74 20 61 73 20 70 6c 61 69 6e 2d script as plain-
9910: 74 65 78 74 20 66 6f 72 20 74 65 73 74 69 6e 67 text for testing
9920: 20 70 75 72 70 6f 73 65 73 2c 20 69 66 20 74 68 purposes, if th
9930: 65 20 22 74 65 73 74 22 0a 20 20 20 20 2a 2a 20 e "test". **
9940: 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 20 query parameter
9950: 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 is present */.
9960: 20 20 63 67 69 5f 73 65 74 5f 63 6f 6e 74 65 6e cgi_set_conten
9970: 74 5f 74 79 70 65 28 22 74 65 78 74 2f 70 6c 61 t_type("text/pla
9980: 69 6e 22 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 in");. }else{.
9990: 20 20 20 2f 2a 20 44 65 66 61 75 6c 74 20 62 65 /* Default be
99a0: 68 61 76 69 6f 72 20 69 73 20 74 6f 20 72 65 74 havior is to ret
99b0: 75 72 6e 20 6a 61 76 61 73 63 72 69 70 74 20 2a urn javascript *
99c0: 2f 0a 20 20 20 20 63 67 69 5f 73 65 74 5f 63 6f /. cgi_set_co
99d0: 6e 74 65 6e 74 5f 74 79 70 65 28 22 74 65 78 74 ntent_type("text
99e0: 2f 6a 61 76 61 73 63 72 69 70 74 22 29 3b 0a 20 /javascript");.
99f0: 20 7d 0a 20 20 73 74 79 6c 65 5f 69 6e 69 74 5f }. style_init_
9a00: 74 68 31 5f 76 61 72 73 28 30 29 3b 0a 20 20 54 th1_vars(0);. T
9a10: 68 5f 52 65 6e 64 65 72 28 7a 53 63 72 69 70 74 h_Render(zScript
9a20: 3f 7a 53 63 72 69 70 74 3a 22 22 29 3b 0a 7d 0a ?zScript:"");.}.
9a30: 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 66 6f 72 ./*.** Check for
9a40: 20 22 6e 61 6d 65 22 20 6f 72 20 22 70 61 67 65 "name" or "page
9a50: 22 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 " query paramete
9a60: 72 73 20 6f 6e 20 61 6e 20 2f 73 74 79 6c 65 2e rs on an /style.
9a70: 63 73 73 0a 2a 2a 20 70 61 67 65 20 72 65 71 75 css.** page requ
9a80: 65 73 74 2e 20 20 49 66 20 70 72 65 73 65 6e 74 est. If present
9a90: 2c 20 74 68 65 6e 20 70 61 67 65 2d 73 70 65 63 , then page-spec
9aa0: 69 66 69 63 20 43 53 53 20 69 73 20 72 65 71 75 ific CSS is requ
9ab0: 65 73 74 65 64 2c 0a 2a 2a 20 73 6f 20 61 64 64 ested,.** so add
9ac0: 20 74 68 61 74 20 43 53 53 20 74 6f 20 70 4f 75 that CSS to pOu
9ad0: 74 2e 20 20 49 66 20 74 68 65 20 22 6e 61 6d 65 t. If the "name
9ae0: 22 20 61 6e 64 20 22 70 61 67 65 22 20 71 75 65 " and "page" que
9af0: 72 79 20 70 61 72 61 6d 65 74 65 72 73 0a 2a 2a ry parameters.**
9b00: 20 61 72 65 20 6f 6d 69 74 74 65 64 2c 20 74 68 are omitted, th
9b10: 65 6e 20 70 4f 75 74 20 69 73 20 75 6e 63 68 6e en pOut is unchn
9b20: 61 67 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 aged..*/.static
9b30: 76 6f 69 64 20 70 61 67 65 5f 73 74 79 6c 65 5f void page_style_
9b40: 63 73 73 5f 61 70 70 65 6e 64 5f 70 61 67 65 5f css_append_page_
9b50: 73 74 79 6c 65 28 42 6c 6f 62 20 2a 70 4f 75 74 style(Blob *pOut
9b60: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 ){. const char
9b70: 2a 7a 50 61 67 65 20 3d 20 50 44 28 22 6e 61 6d *zPage = PD("nam
9b80: 65 22 2c 50 28 22 70 61 67 65 22 29 29 3b 0a 20 e",P("page"));.
9b90: 20 63 68 61 72 20 2a 20 7a 46 69 6c 65 3b 0a 20 char * zFile;.
9ba0: 20 69 6e 74 20 6e 46 69 6c 65 20 3d 20 30 3b 0a int nFile = 0;.
9bb0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42 const char *zB
9bc0: 75 69 6c 74 69 6e 3b 0a 0a 20 20 69 66 28 7a 50 uiltin;.. if(zP
9bd0: 61 67 65 3d 3d 30 20 7c 7c 20 7a 50 61 67 65 5b age==0 || zPage[
9be0: 30 5d 3d 3d 30 29 7b 0a 20 20 20 20 72 65 74 75 0]==0){. retu
9bf0: 72 6e 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c 65 20 rn;. }. zFile
9c00: 3d 20 6d 70 72 69 6e 74 66 28 22 73 74 79 6c 65 = mprintf("style
9c10: 2e 25 73 2e 63 73 73 22 2c 20 7a 50 61 67 65 29 .%s.css", zPage)
9c20: 3b 0a 20 20 7a 42 75 69 6c 74 69 6e 20 3d 20 28 ;. zBuiltin = (
9c30: 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 62 75 69 const char *)bui
9c40: 6c 74 69 6e 5f 66 69 6c 65 28 7a 46 69 6c 65 2c ltin_file(zFile,
9c50: 20 26 6e 46 69 6c 65 29 3b 0a 20 20 69 66 28 6e &nFile);. if(n
9c60: 46 69 6c 65 3e 30 29 7b 0a 20 20 20 20 62 6c 6f File>0){. blo
9c70: 62 5f 61 70 70 65 6e 64 66 28 70 4f 75 74 2c 0a b_appendf(pOut,.
9c80: 20 20 20 20 20 20 22 5c 6e 2f 2a 2a 2a 2a 2a 2a "\n/******
9c90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
9ca0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
9cb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
9cc0: 2a 2a 2a 2a 2a 5c 6e 22 0a 20 20 20 20 20 20 22 *****\n". "
9cd0: 2a 2a 20 50 61 67 65 2d 73 70 65 63 69 66 69 63 ** Page-specific
9ce0: 20 43 53 53 20 66 6f 72 20 5c 22 25 73 5c 22 5c CSS for \"%s\"\
9cf0: 6e 22 0a 20 20 20 20 20 20 22 2a 2a 2a 2a 2a 2a n". "******
9d00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
9d10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
9d20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
9d30: 2a 2a 2a 2a 2a 2f 5c 6e 22 2c 0a 20 20 20 20 20 *****/\n",.
9d40: 20 7a 50 61 67 65 29 3b 0a 20 20 20 20 62 6c 6f zPage);. blo
9d50: 62 5f 61 70 70 65 6e 64 28 70 4f 75 74 2c 20 7a b_append(pOut, z
9d60: 42 75 69 6c 74 69 6e 2c 20 6e 46 69 6c 65 29 3b Builtin, nFile);
9d70: 0a 20 20 20 20 66 6f 73 73 69 6c 5f 66 72 65 65 . fossil_free
9d80: 28 7a 46 69 6c 65 29 3b 0a 20 20 20 20 72 65 74 (zFile);. ret
9d90: 75 72 6e 3b 0a 20 20 7d 0a 20 20 2f 2a 20 50 6f urn;. }. /* Po
9da0: 74 65 6e 74 69 61 6c 20 54 4f 44 4f 3a 20 63 68 tential TODO: ch
9db0: 65 63 6b 20 66 6f 72 20 61 6c 69 61 73 65 73 2f eck for aliases/
9dc0: 70 61 67 65 20 67 72 6f 75 70 73 2e 20 65 2e 67 page groups. e.g
9dd0: 2e 20 67 72 6f 75 70 20 61 6c 6c 0a 20 20 2a 2a . group all. **
9de0: 20 2f 66 6f 72 75 6d 58 59 5a 20 43 53 53 20 69 /forumXYZ CSS i
9df0: 6e 74 6f 20 6f 6e 65 20 66 69 6c 65 2c 20 61 6c nto one file, al
9e00: 6c 20 2f 73 65 74 75 70 58 59 5a 20 69 6e 74 6f l /setupXYZ into
9e10: 20 61 6e 6f 74 68 65 72 2c 20 65 74 63 2e 20 41 another, etc. A
9e20: 73 0a 20 20 2a 2a 20 6f 66 20 74 68 69 73 20 77 s. ** of this w
9e30: 72 69 74 69 6e 67 2c 20 64 6f 69 6e 67 20 73 6f riting, doing so
9e40: 20 77 6f 75 6c 64 20 6f 6e 6c 79 20 73 68 61 76 would only shav
9e50: 65 20 61 20 66 65 77 20 6b 62 20 66 72 6f 6d 0a e a few kb from.
9e60: 20 20 2a 2a 20 64 65 66 61 75 6c 74 2e 63 73 73 ** default.css
9e70: 2e 20 2a 2f 0a 20 20 66 6f 73 73 69 6c 5f 66 72 . */. fossil_fr
9e80: 65 65 28 7a 46 69 6c 65 29 3b 0a 7d 0a 0a 2f 2a ee(zFile);.}../*
9e90: 0a 2a 2a 20 57 45 42 50 41 47 45 3a 20 73 74 79 .** WEBPAGE: sty
9ea0: 6c 65 2e 63 73 73 20 6c 6f 61 64 61 76 67 2d 65 le.css loadavg-e
9eb0: 78 65 6d 70 74 0a 2a 2a 0a 2a 2a 20 52 65 74 75 xempt.**.** Retu
9ec0: 72 6e 20 74 68 65 20 73 74 79 6c 65 20 73 68 65 rn the style she
9ed0: 65 74 2e 20 20 20 54 68 65 20 73 74 79 6c 65 20 et. The style
9ee0: 73 68 65 65 74 20 69 73 20 61 73 73 65 6d 62 6c sheet is assembl
9ef0: 69 65 64 20 66 72 6f 6d 0a 2a 2a 20 6d 75 6c 74 ied from.** mult
9f00: 69 70 6c 65 20 73 6f 75 72 63 65 73 2c 20 69 6e iple sources, in
9f10: 20 6f 72 64 65 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 order:.**.**
9f20: 20 28 31 29 20 20 20 54 68 65 20 62 75 69 6c 74 (1) The built
9f30: 2d 69 6e 20 22 64 65 66 61 75 6c 74 2e 63 73 73 -in "default.css
9f40: 22 20 73 74 79 6c 65 20 73 68 65 65 74 20 63 6f " style sheet co
9f50: 6e 74 61 69 6e 69 6e 67 20 62 61 73 69 63 20 64 ntaining basic d
9f60: 65 66 61 75 6c 74 73 2e 0a 2a 2a 0a 2a 2a 20 20 efaults..**.**
9f70: 20 20 28 32 29 20 20 20 54 68 65 20 70 61 67 65 (2) The page
9f80: 2d 73 70 65 63 69 66 69 63 20 73 74 79 6c 65 20 -specific style
9f90: 73 68 65 65 74 20 74 61 6b 65 6e 20 66 72 6f 6d sheet taken from
9fa0: 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 0a 2a 2a the built-in.**
9fb0: 20 20 20 20 20 20 20 20 20 20 63 61 6c 6c 65 64 called
9fc0: 20 22 50 41 47 45 4e 41 4d 45 2e 63 73 73 22 20 "PAGENAME.css"
9fd0: 77 68 65 72 65 20 50 41 47 45 4e 41 4d 45 20 69 where PAGENAME i
9fe0: 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 s the value of t
9ff0: 68 65 20 6e 61 6d 65 3d 0a 2a 2a 20 20 20 20 20 he name=.**
a000: 20 20 20 20 20 6f 72 20 70 61 67 65 3d 20 71 75 or page= qu
a010: 65 72 79 20 70 61 72 61 6d 65 74 65 72 73 2e 20 ery parameters.
a020: 20 49 66 20 6e 65 69 74 68 65 72 20 6e 61 6d 65 If neither name
a030: 3d 20 6e 6f 72 20 70 61 67 65 3d 20 65 78 69 73 = nor page= exis
a040: 74 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 74 t,.** t
a050: 68 65 6e 20 74 68 69 73 20 73 65 63 74 69 6f 6e hen this section
a060: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a is a no-op..**.
a070: 2a 2a 20 20 20 20 28 33 29 20 20 20 54 68 65 20 ** (3) The
a080: 73 6b 69 6e 2d 73 70 65 63 69 66 69 63 20 22 63 skin-specific "c
a090: 73 73 2e 74 78 74 22 20 66 69 6c 65 2c 20 69 66 ss.txt" file, if
a0a0: 20 74 68 65 72 65 20 6f 6e 65 2e 0a 2a 2a 0a 2a there one..**.*
a0b0: 2a 20 41 6c 6c 20 6f 66 20 28 31 29 2c 20 28 32 * All of (1), (2
a0c0: 29 2c 20 61 6e 64 20 28 33 29 20 61 62 6f 76 65 ), and (3) above
a0d0: 20 28 6f 72 20 61 73 20 6d 61 6e 79 20 61 73 20 (or as many as
a0e0: 65 78 69 73 74 29 20 61 72 65 20 63 6f 6e 63 61 exist) are conca
a0f0: 74 65 6e 61 74 65 64 2e 0a 2a 2a 20 54 68 65 20 tenated..** The
a100: 72 65 73 75 6c 74 20 69 73 20 74 68 65 6e 20 72 result is then r
a110: 75 6e 20 74 68 72 6f 75 67 68 20 54 48 31 20 77 un through TH1 w
a120: 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e ith the followin
a130: 67 20 76 61 72 69 61 62 6c 65 73 20 73 65 74 3a g variables set:
a140: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 20 24 62 .**.** * $b
a150: 61 73 65 6e 61 6d 65 0a 2a 2a 20 20 20 20 2a 20 asename.** *
a160: 20 20 24 73 65 63 75 72 65 75 72 6c 0a 2a 2a 20 $secureurl.**
a170: 20 20 20 2a 20 20 20 24 68 6f 6d 65 0a 2a 2a 20 * $home.**
a180: 20 20 20 2a 20 20 20 24 6c 6f 67 6f 0a 2a 2a 20 * $logo.**
a190: 20 20 20 2a 20 20 20 24 62 61 63 6b 67 72 6f 75 * $backgrou
a1a0: 6e 64 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 75 74 nd.**.** The out
a1b0: 70 75 74 20 66 72 6f 6d 20 54 48 31 20 62 65 63 put from TH1 bec
a1c0: 6f 6d 65 73 20 74 68 65 20 73 74 79 6c 65 20 73 omes the style s
a1d0: 68 65 65 74 2e 20 20 46 6f 73 73 69 6c 20 61 6c heet. Fossil al
a1e0: 77 61 79 73 20 72 65 70 6f 72 74 73 0a 2a 2a 20 ways reports.**
a1f0: 74 68 61 74 20 74 68 65 20 73 74 79 6c 65 20 73 that the style s
a200: 68 65 65 74 20 69 73 20 63 61 63 68 65 61 62 6c heet is cacheabl
a210: 65 2e 0a 2a 2f 0a 76 6f 69 64 20 70 61 67 65 5f e..*/.void page_
a220: 73 74 79 6c 65 5f 63 73 73 28 76 6f 69 64 29 7b style_css(void){
a230: 0a 20 20 42 6c 6f 62 20 63 73 73 20 3d 20 65 6d . Blob css = em
a240: 70 74 79 5f 62 6c 6f 62 3b 0a 20 20 69 6e 74 20 pty_blob;. int
a250: 69 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 i;. const char
a260: 2a 20 7a 44 65 66 61 75 6c 74 73 3b 0a 20 20 63 * zDefaults;. c
a270: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 6b 69 6e onst char *zSkin
a280: 3b 0a 0a 20 20 63 67 69 5f 73 65 74 5f 63 6f 6e ;.. cgi_set_con
a290: 74 65 6e 74 5f 74 79 70 65 28 22 74 65 78 74 2f tent_type("text/
a2a0: 63 73 73 22 29 3b 0a 20 20 65 74 61 67 5f 63 68 css");. etag_ch
a2b0: 65 63 6b 28 30 2c 20 30 29 3b 0a 20 20 2f 2a 20 eck(0, 0);. /*
a2c0: 45 6d 69 74 20 61 6c 6c 20 64 65 66 61 75 6c 74 Emit all default
a2d0: 20 72 75 6c 65 73 2e 2e 2e 20 2a 2f 0a 20 20 7a rules... */. z
a2e0: 44 65 66 61 75 6c 74 73 20 3d 20 28 63 6f 6e 73 Defaults = (cons
a2f0: 74 20 63 68 61 72 2a 29 62 75 69 6c 74 69 6e 5f t char*)builtin_
a300: 66 69 6c 65 28 22 64 65 66 61 75 6c 74 2e 63 73 file("default.cs
a310: 73 22 2c 20 26 69 29 3b 0a 20 20 62 6c 6f 62 5f s", &i);. blob_
a320: 61 70 70 65 6e 64 28 26 63 73 73 2c 20 7a 44 65 append(&css, zDe
a330: 66 61 75 6c 74 73 2c 20 69 29 3b 0a 20 20 2f 2a faults, i);. /*
a340: 20 50 61 67 65 2d 73 70 65 63 69 66 69 63 20 43 Page-specific C
a350: 53 53 2c 20 69 66 20 61 6e 79 2e 2e 2e 20 2a 2f SS, if any... */
a360: 0a 20 20 70 61 67 65 5f 73 74 79 6c 65 5f 63 73 . page_style_cs
a370: 73 5f 61 70 70 65 6e 64 5f 70 61 67 65 5f 73 74 s_append_page_st
a380: 79 6c 65 28 26 63 73 73 29 3b 0a 20 20 7a 53 6b yle(&css);. zSk
a390: 69 6e 20 3d 20 73 6b 69 6e 5f 69 6e 5f 75 73 65 in = skin_in_use
a3a0: 28 29 3b 0a 20 20 69 66 28 20 7a 53 6b 69 6e 3d ();. if( zSkin=
a3b0: 3d 30 20 29 20 7a 53 6b 69 6e 20 3d 20 22 74 68 =0 ) zSkin = "th
a3c0: 69 73 20 72 65 70 6f 73 69 74 6f 72 79 22 3b 0a is repository";.
a3d0: 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 blob_appendf(&
a3e0: 63 73 73 2c 0a 20 20 20 20 20 22 5c 6e 2f 2a 2a css,. "\n/**
a3f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
a400: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
a410: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
a420: 2a 2a 2a 2a 2a 2a 2a 2a 2a 5c 6e 22 0a 20 20 20 *********\n".
a430: 20 20 22 2a 2a 20 53 6b 69 6e 2d 73 70 65 63 69 "** Skin-speci
a440: 66 69 63 20 43 53 53 20 66 6f 72 20 25 73 5c 6e fic CSS for %s\n
a450: 22 0a 20 20 20 20 20 22 2a 2a 2a 2a 2a 2a 2a 2a ". "********
a460: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
a470: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
a480: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
a490: 2a 2a 2a 2f 5c 6e 22 2c 0a 20 20 20 20 20 7a 53 ***/\n",. zS
a4a0: 6b 69 6e 29 3b 0a 20 20 62 6c 6f 62 5f 61 70 70 kin);. blob_app
a4b0: 65 6e 64 28 26 63 73 73 2c 73 6b 69 6e 5f 67 65 end(&css,skin_ge
a4c0: 74 28 22 63 73 73 22 29 2c 2d 31 29 3b 0a 20 20 t("css"),-1);.
a4d0: 2f 2a 20 50 72 6f 63 65 73 73 20 74 68 72 6f 75 /* Process throu
a4e0: 67 68 20 54 48 31 20 69 6e 20 6f 72 64 65 72 20 gh TH1 in order
a4f0: 74 6f 20 67 69 76 65 20 61 6e 20 6f 70 70 6f 72 to give an oppor
a500: 74 75 6e 69 74 79 20 74 6f 20 73 75 62 73 74 69 tunity to substi
a510: 74 75 74 65 0a 20 20 2a 2a 20 76 61 72 69 61 62 tute. ** variab
a520: 6c 65 73 20 73 75 63 68 20 61 73 20 24 62 61 73 les such as $bas
a530: 65 75 72 6c 2e 0a 20 20 2a 2f 0a 20 20 54 68 5f eurl.. */. Th_
a540: 53 74 6f 72 65 28 22 62 61 73 65 75 72 6c 22 2c Store("baseurl",
a550: 20 67 2e 7a 42 61 73 65 55 52 4c 29 3b 0a 20 20 g.zBaseURL);.
a560: 54 68 5f 53 74 6f 72 65 28 22 73 65 63 75 72 65 Th_Store("secure
a570: 75 72 6c 22 2c 20 66 6f 73 73 69 6c 5f 77 61 6e url", fossil_wan
a580: 74 73 5f 68 74 74 70 73 28 31 29 3f 20 67 2e 7a ts_https(1)? g.z
a590: 48 74 74 70 73 55 52 4c 3a 20 67 2e 7a 42 61 73 HttpsURL: g.zBas
a5a0: 65 55 52 4c 29 3b 0a 20 20 54 68 5f 53 74 6f 72 eURL);. Th_Stor
a5b0: 65 28 22 68 6f 6d 65 22 2c 20 67 2e 7a 54 6f 70 e("home", g.zTop
a5c0: 29 3b 0a 20 20 69 6d 61 67 65 5f 75 72 6c 5f 76 );. image_url_v
a5d0: 61 72 28 22 6c 6f 67 6f 22 29 3b 0a 20 20 69 6d ar("logo");. im
a5e0: 61 67 65 5f 75 72 6c 5f 76 61 72 28 22 62 61 63 age_url_var("bac
a5f0: 6b 67 72 6f 75 6e 64 22 29 3b 0a 20 20 54 68 5f kground");. Th_
a600: 52 65 6e 64 65 72 28 62 6c 6f 62 5f 73 74 72 28 Render(blob_str(
a610: 26 63 73 73 29 29 3b 0a 20 20 62 6c 6f 62 5f 72 &css));. blob_r
a620: 65 73 65 74 28 26 63 73 73 29 3b 0a 0a 20 20 2f eset(&css);.. /
a630: 2a 20 54 65 6c 6c 20 43 47 49 20 74 68 61 74 20 * Tell CGI that
a640: 74 68 65 20 63 6f 6e 74 65 6e 74 20 72 65 74 75 the content retu
a650: 72 6e 65 64 20 62 79 20 74 68 69 73 20 70 61 67 rned by this pag
a660: 65 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 e is considered
a670: 63 61 63 68 65 61 62 6c 65 20 2a 2f 0a 20 20 67 cacheable */. g
a680: 2e 69 73 43 6f 6e 73 74 20 3d 20 31 3b 0a 7d 0a .isConst = 1;.}.
a690: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 20 70 6f 73 73 69 ./*.** All possi
a6a0: 62 6c 65 20 63 61 70 61 62 69 6c 69 74 69 65 73 ble capabilities
a6b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 .*/.static const
a6c0: 20 63 68 61 72 20 61 6c 6c 43 61 70 5b 5d 20 3d char allCap[] =
a6d0: 0a 20 20 22 61 62 63 64 65 66 67 68 69 6a 6b 6c . "abcdefghijkl
a6e0: 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 30 31 mnopqrstuvwxyz01
a6f0: 32 33 34 35 36 37 38 39 41 42 43 44 45 46 47 48 23456789ABCDEFGH
a700: 49 4a 4b 4c 22 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f IJKL";../*.** Co
a710: 6d 70 75 74 65 20 74 68 65 20 63 75 72 72 65 6e mpute the curren
a720: 74 20 6c 6f 67 69 6e 20 63 61 70 61 62 69 6c 69 t login capabili
a730: 74 69 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 63 ties.*/.static c
a740: 68 61 72 20 2a 66 69 6e 64 5f 63 61 70 61 62 69 har *find_capabi
a750: 6c 69 74 69 65 73 28 63 68 61 72 20 2a 7a 43 61 lities(char *zCa
a760: 70 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a p){. int i, j;.
a770: 20 20 63 68 61 72 20 63 3b 0a 20 20 66 6f 72 28 char c;. for(
a780: 69 3d 6a 3d 30 3b 20 28 63 20 3d 20 61 6c 6c 43 i=j=0; (c = allC
a790: 61 70 5b 6a 5d 29 21 3d 30 3b 20 6a 2b 2b 29 7b ap[j])!=0; j++){
a7a0: 0a 20 20 20 20 69 66 28 20 6c 6f 67 69 6e 5f 68 . if( login_h
a7b0: 61 73 5f 63 61 70 61 62 69 6c 69 74 79 28 26 63 as_capability(&c
a7c0: 2c 20 31 2c 20 30 29 20 29 20 7a 43 61 70 5b 69 , 1, 0) ) zCap[i
a7d0: 2b 2b 5d 20 3d 20 63 3b 0a 20 20 7d 0a 20 20 7a ++] = c;. }. z
a7e0: 43 61 70 5b 69 5d 20 3d 20 30 3b 0a 20 20 72 65 Cap[i] = 0;. re
a7f0: 74 75 72 6e 20 7a 43 61 70 3b 0a 7d 0a 0a 2f 2a turn zCap;.}../*
a800: 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 .** Compute the
a810: 63 75 72 72 65 6e 74 20 6c 6f 67 69 6e 20 63 61 current login ca
a820: 70 61 62 69 6c 69 74 69 65 73 20 74 68 61 74 20 pabilities that
a830: 77 65 72 65 0a 2a 2a 20 63 6f 6e 74 72 69 62 75 were.** contribu
a840: 74 65 64 20 62 79 20 41 6e 6f 6e 79 6d 6f 75 73 ted by Anonymous
a850: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 .*/.static char
a860: 2a 66 69 6e 64 5f 61 6e 6f 6e 5f 63 61 70 61 62 *find_anon_capab
a870: 69 6c 69 74 69 65 73 28 63 68 61 72 20 2a 7a 43 ilities(char *zC
a880: 61 70 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b ap){. int i, j;
a890: 0a 20 20 63 68 61 72 20 63 3b 0a 20 20 66 6f 72 . char c;. for
a8a0: 28 69 3d 6a 3d 30 3b 20 28 63 20 3d 20 61 6c 6c (i=j=0; (c = all
a8b0: 43 61 70 5b 6a 5d 29 21 3d 30 3b 20 6a 2b 2b 29 Cap[j])!=0; j++)
a8c0: 7b 0a 20 20 20 20 69 66 28 20 6c 6f 67 69 6e 5f {. if( login_
a8d0: 68 61 73 5f 63 61 70 61 62 69 6c 69 74 79 28 26 has_capability(&
a8e0: 63 2c 20 31 2c 20 4c 4f 47 49 4e 5f 41 4e 4f 4e c, 1, LOGIN_ANON
a8f0: 29 0a 20 20 20 20 20 20 26 26 20 21 6c 6f 67 69 ). && !logi
a900: 6e 5f 68 61 73 5f 63 61 70 61 62 69 6c 69 74 79 n_has_capability
a910: 28 26 63 2c 20 31 2c 20 30 29 20 29 20 7a 43 61 (&c, 1, 0) ) zCa
a920: 70 5b 69 2b 2b 5d 20 3d 20 63 3b 0a 20 20 7d 0a p[i++] = c;. }.
a930: 20 20 7a 43 61 70 5b 69 5d 20 3d 20 30 3b 0a 20 zCap[i] = 0;.
a940: 20 72 65 74 75 72 6e 20 7a 43 61 70 3b 0a 7d 0a return zCap;.}.
a950: 0a 2f 2a 0a 2a 2a 20 57 45 42 50 41 47 45 3a 20 ./*.** WEBPAGE:
a960: 74 65 73 74 2d 74 69 74 6c 65 0a 2a 2a 0a 2a 2a test-title.**.**
a970: 20 52 65 6e 64 65 72 20 61 20 74 65 73 74 20 70 Render a test p
a980: 61 67 65 20 69 6e 20 77 68 69 63 68 20 74 68 65 age in which the
a990: 20 70 61 67 65 20 74 69 74 6c 65 20 69 73 20 73 page title is s
a9a0: 65 74 20 62 79 20 74 68 65 20 22 74 69 74 6c 65 et by the "title
a9b0: 22 0a 2a 2a 20 71 75 65 72 79 20 70 61 72 61 6d ".** query param
a9c0: 65 74 65 72 2e 20 20 54 68 69 73 20 63 61 6e 20 eter. This can
a9d0: 62 65 20 75 73 65 64 20 74 6f 20 73 68 6f 77 20 be used to show
a9e0: 74 68 61 74 20 48 54 4d 4c 20 6f 72 20 4a 61 76 that HTML or Jav
a9f0: 61 73 63 72 69 70 74 0a 2a 2a 20 63 6f 6e 74 65 ascript.** conte
aa00: 6e 74 20 69 6e 20 74 68 65 20 74 69 74 6c 65 20 nt in the title
aa10: 64 6f 65 73 20 6e 6f 74 20 6c 65 61 6b 20 74 68 does not leak th
aa20: 72 6f 75 67 68 20 69 6e 74 6f 20 67 65 6e 65 72 rough into gener
aa30: 61 74 65 64 20 70 61 67 65 2c 20 72 65 73 75 6c ated page, resul
aa40: 74 69 6e 67 0a 2a 2a 20 69 6e 20 61 6e 20 58 53 ting.** in an XS
aa50: 53 20 69 73 73 75 65 2e 0a 2a 2a 0a 2a 2a 20 44 S issue..**.** D
aa60: 75 65 20 74 6f 20 74 68 65 20 70 6f 74 65 6e 74 ue to the potent
aa70: 69 61 6c 20 66 6f 72 20 61 62 75 73 65 2c 20 74 ial for abuse, t
aa80: 68 69 73 20 77 65 62 70 61 67 65 20 69 73 20 6f his webpage is o
aa90: 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 74 6f nly available to
aaa0: 0a 2a 2a 20 61 64 6d 69 6e 69 73 74 72 61 74 6f .** administrato
aab0: 72 73 2e 0a 2a 2f 0a 76 6f 69 64 20 70 61 67 65 rs..*/.void page
aac0: 5f 74 65 73 74 5f 74 69 74 6c 65 28 76 6f 69 64 _test_title(void
aad0: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 ){. const char
aae0: 2a 7a 54 69 74 6c 65 3b 0a 20 20 6c 6f 67 69 6e *zTitle;. login
aaf0: 5f 63 68 65 63 6b 5f 63 72 65 64 65 6e 74 69 61 _check_credentia
ab00: 6c 73 28 29 3b 0a 20 20 69 66 28 20 21 67 2e 70 ls();. if( !g.p
ab10: 65 72 6d 2e 41 64 6d 69 6e 20 29 7b 0a 20 20 20 erm.Admin ){.
ab20: 20 6c 6f 67 69 6e 5f 6e 65 65 64 65 64 28 30 29 login_needed(0)
ab30: 3b 0a 20 20 7d 0a 20 20 7a 54 69 74 6c 65 20 3d ;. }. zTitle =
ab40: 20 50 28 22 74 69 74 6c 65 22 29 3b 0a 20 20 69 P("title");. i
ab50: 66 28 20 7a 54 69 74 6c 65 3d 3d 30 20 29 7b 0a f( zTitle==0 ){.
ab60: 20 20 20 20 7a 54 69 74 6c 65 20 3d 20 22 28 4e zTitle = "(N
ab70: 6f 20 54 69 74 6c 65 29 22 3b 0a 20 20 7d 0a 20 o Title)";. }.
ab80: 20 73 74 79 6c 65 5f 68 65 61 64 65 72 28 22 25 style_header("%
ab90: 73 22 2c 20 7a 54 69 74 6c 65 29 3b 0a 20 20 40 s", zTitle);. @
aba0: 20 3c 70 3e 0a 20 20 40 20 54 68 69 73 20 70 61 <p>. @ This pa
abb0: 67 65 20 73 65 74 73 20 69 74 73 20 74 69 74 6c ge sets its titl
abc0: 65 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 6f e to the value o
abd0: 66 20 74 68 65 20 22 74 69 74 6c 65 22 20 71 75 f the "title" qu
abe0: 65 72 79 20 70 61 72 61 6d 65 74 65 72 2e 0a 20 ery parameter..
abf0: 20 40 20 54 68 65 20 66 6f 72 6d 20 62 65 6c 6f @ The form belo
ac00: 77 20 69 73 20 61 20 63 6f 6e 76 65 6e 69 65 6e w is a convenien
ac10: 74 20 77 61 79 20 74 6f 20 73 65 74 20 74 68 65 t way to set the
ac20: 20 74 69 74 6c 65 20 71 75 65 72 79 20 70 61 72 title query par
ac30: 61 6d 65 74 65 72 3a 0a 20 20 40 0a 20 20 40 20 ameter:. @. @
ac40: 3c 66 6f 72 6d 20 6d 65 74 68 6f 64 3d 22 47 45 <form method="GE
ac50: 54 22 3e 0a 20 20 40 20 54 69 74 6c 65 3a 20 3c T">. @ Title: <
ac60: 69 6e 70 75 74 20 74 79 70 65 3d 22 74 65 78 74 input type="text
ac70: 22 20 73 69 7a 65 3d 22 35 30 22 20 6e 61 6d 65 " size="50" name
ac80: 3d 22 74 69 74 6c 65 22 20 76 61 6c 75 65 3d 22 ="title" value="
ac90: 25 68 28 7a 54 69 74 6c 65 29 22 3e 0a 20 20 40 %h(zTitle)">. @
aca0: 20 3c 69 6e 70 75 74 20 74 79 70 65 3d 22 73 75 <input type="su
acb0: 62 6d 69 74 22 20 76 61 6c 75 65 3d 22 53 75 62 bmit" value="Sub
acc0: 6d 69 74 22 3e 0a 20 20 40 20 3c 2f 66 6f 72 6d mit">. @ </form
acd0: 3e 0a 20 20 73 74 79 6c 65 5f 66 69 6e 69 73 68 >. style_finish
ace0: 5f 70 61 67 65 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a _page();.}../*.*
acf0: 2a 20 57 45 42 50 41 47 45 3a 20 74 65 73 74 5f * WEBPAGE: test_
ad00: 65 6e 76 0a 2a 2a 0a 2a 2a 20 44 69 73 70 6c 61 env.**.** Displa
ad10: 79 20 43 47 49 2d 76 61 72 69 61 62 6c 65 73 20 y CGI-variables
ad20: 61 6e 64 20 6f 74 68 65 72 20 61 73 70 65 63 74 and other aspect
ad30: 73 20 6f 66 20 74 68 65 20 72 75 6e 2d 74 69 6d s of the run-tim
ad40: 65 0a 2a 2a 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 e.** environment
ad50: 2c 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20 , for debugging
ad60: 61 6e 64 20 74 72 6f 75 62 6c 65 2d 73 68 6f 6f and trouble-shoo
ad70: 74 69 6e 67 20 70 75 72 70 6f 73 65 73 2e 0a 2a ting purposes..*
ad80: 2f 0a 76 6f 69 64 20 70 61 67 65 5f 74 65 73 74 /.void page_test
ad90: 5f 65 6e 76 28 76 6f 69 64 29 7b 0a 20 20 77 65 _env(void){. we
ada0: 62 70 61 67 65 5f 65 72 72 6f 72 28 22 22 29 3b bpage_error("");
adb0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 45 42 50 41 47 .}../*.** WEBPAG
adc0: 45 3a 20 68 6f 6e 65 79 70 6f 74 0a 2a 2a 20 54 E: honeypot.** T
add0: 68 69 73 20 70 61 67 65 20 69 73 20 61 20 68 6f his page is a ho
ade0: 6e 65 79 70 6f 74 20 66 6f 72 20 73 70 69 64 65 neypot for spide
adf0: 72 73 20 61 6e 64 20 62 6f 74 73 2e 0a 2a 2f 0a rs and bots..*/.
ae00: 76 6f 69 64 20 68 6f 6e 65 79 70 6f 74 5f 70 61 void honeypot_pa
ae10: 67 65 28 76 6f 69 64 29 7b 0a 20 20 75 6e 73 69 ge(void){. unsi
ae20: 67 6e 65 64 20 69 6e 74 20 75 53 65 65 64 20 3d gned int uSeed =
ae30: 20 63 61 70 74 63 68 61 5f 73 65 65 64 28 29 3b captcha_seed();
ae40: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a . const char *z
ae50: 44 65 63 6f 64 65 64 20 3d 20 63 61 70 74 63 68 Decoded = captch
ae60: 61 5f 64 65 63 6f 64 65 28 75 53 65 65 64 2c 20 a_decode(uSeed,
ae70: 30 29 3b 0a 20 20 69 6e 74 20 62 41 75 74 6f 43 0);. int bAutoC
ae80: 61 70 74 63 68 61 20 3d 20 64 62 5f 67 65 74 5f aptcha = db_get_
ae90: 62 6f 6f 6c 65 61 6e 28 22 61 75 74 6f 2d 63 61 boolean("auto-ca
aea0: 70 74 63 68 61 22 2c 20 30 29 3b 0a 20 20 63 68 ptcha", 0);. ch
aeb0: 61 72 20 2a 7a 43 61 70 74 63 68 61 20 3d 20 63 ar *zCaptcha = c
aec0: 61 70 74 63 68 61 5f 72 65 6e 64 65 72 28 7a 44 aptcha_render(zD
aed0: 65 63 6f 64 65 64 29 3b 0a 20 20 73 74 79 6c 65 ecoded);. style
aee0: 5f 68 65 61 64 65 72 28 22 49 20 74 68 69 6e 6b _header("I think
aef0: 20 79 6f 75 20 61 72 65 20 61 20 72 6f 62 6f 74 you are a robot
af00: 22 29 3b 0a 20 20 40 20 3c 70 3e 59 6f 75 20 73 ");. @ <p>You s
af10: 65 65 6d 20 6c 69 6b 65 20 61 20 72 6f 62 6f 74 eem like a robot
af20: 2e 3c 2f 70 3e 0a 20 20 40 0a 20 20 40 20 3c 70 .</p>. @. @ <p
af30: 3e 49 73 20 74 68 61 74 20 69 6e 63 6f 72 72 65 >Is that incorre
af40: 63 74 3f 20 20 41 72 65 20 79 6f 75 20 72 65 61 ct? Are you rea
af50: 6c 6c 79 20 68 75 6d 61 6e 3f 0a 20 20 40 20 49 lly human?. @ I
af60: 66 20 73 6f 2c 20 70 6c 65 61 73 65 20 70 72 6f f so, please pro
af70: 76 65 20 69 74 20 62 79 20 74 72 61 6e 73 63 72 ve it by transcr
af80: 69 62 69 6e 67 20 74 68 65 20 63 61 70 74 63 68 ibing the captch
af90: 61 20 74 65 78 74 0a 20 20 40 20 69 6e 74 6f 20 a text. @ into
afa0: 74 68 65 20 65 6e 74 72 79 20 62 6f 78 20 62 65 the entry box be
afb0: 6c 6f 77 20 61 6e 64 20 70 72 65 73 73 69 6e 67 low and pressing
afc0: 20 22 53 75 62 6d 69 74 22 2e 0a 20 20 40 20 3c "Submit".. @ <
afd0: 66 6f 72 6d 20 61 63 74 69 6f 6e 3d 22 25 52 2f form action="%R/
afe0: 6c 6f 67 69 6e 22 20 6d 65 74 68 6f 64 3d 22 70 login" method="p
aff0: 6f 73 74 22 3e 0a 20 20 40 20 3c 69 6e 70 75 74 ost">. @ <input
b000: 20 74 79 70 65 3d 22 68 69 64 64 65 6e 22 20 69 type="hidden" i
b010: 64 3d 22 75 22 20 6e 61 6d 65 3d 22 75 22 20 76 d="u" name="u" v
b020: 61 6c 75 65 3d 22 61 6e 6f 6e 79 6d 6f 75 73 22 alue="anonymous"
b030: 3e 0a 20 20 40 20 3c 70 3e 0a 20 20 40 20 43 61 >. @ <p>. @ Ca
b040: 70 74 63 68 61 3a 20 3c 69 6e 70 75 74 20 74 79 ptcha: <input ty
b050: 70 65 3d 22 74 65 78 74 22 20 69 64 3d 22 70 22 pe="text" id="p"
b060: 20 6e 61 6d 65 3d 22 70 22 20 76 61 6c 75 65 3d name="p" value=
b070: 22 22 3e 0a 20 20 40 20 3c 69 6e 70 75 74 20 74 "">. @ <input t
b080: 79 70 65 3d 22 73 75 62 6d 69 74 22 20 6e 61 6d ype="submit" nam
b090: 65 3d 22 69 6e 22 20 76 61 6c 75 65 3d 22 53 75 e="in" value="Su
b0a0: 62 6d 69 74 22 3e 0a 20 20 40 20 0a 20 20 40 20 bmit">. @ . @
b0b0: 3c 70 3e 41 6c 74 65 72 6e 61 74 69 76 65 6c 79 <p>Alternatively
b0c0: 2c 20 79 6f 75 20 63 61 6e 20 3c 61 20 68 72 65 , you can <a hre
b0d0: 66 3d 22 25 52 2f 6c 6f 67 69 6e 22 3e 6c 6f 67 f="%R/login">log
b0e0: 20 69 6e 3c 2f 61 3e 20 75 73 69 6e 67 20 61 6e in</a> using an
b0f0: 0a 20 20 40 20 65 78 69 73 74 69 6e 67 20 75 73 . @ existing us
b100: 65 72 69 64 2e 0a 20 20 40 0a 20 20 40 20 3c 70 erid.. @. @ <p
b110: 3e 3c 69 6e 70 75 74 20 74 79 70 65 3d 22 68 69 ><input type="hi
b120: 64 64 65 6e 22 20 6e 61 6d 65 3d 22 63 73 22 20 dden" name="cs"
b130: 76 61 6c 75 65 3d 22 25 75 28 75 53 65 65 64 29 value="%u(uSeed)
b140: 22 3e 0a 20 20 40 20 3c 64 69 76 20 63 6c 61 73 ">. @ <div clas
b150: 73 3d 22 63 61 70 74 63 68 61 22 3e 3c 74 61 62 s="captcha"><tab
b160: 6c 65 20 63 6c 61 73 73 3d 22 63 61 70 74 63 68 le class="captch
b170: 61 22 3e 3c 74 72 3e 3c 74 64 3e 5c 0a 20 20 40 a"><tr><td>\. @
b180: 20 3c 70 72 65 20 63 6c 61 73 73 3d 22 63 61 70 <pre class="cap
b190: 74 63 68 61 22 3e 0a 20 20 40 20 25 68 28 7a 43 tcha">. @ %h(zC
b1a0: 61 70 74 63 68 61 29 0a 20 20 40 20 3c 2f 70 72 aptcha). @ </pr
b1b0: 65 3e 3c 2f 74 64 3e 3c 2f 74 72 3e 3c 2f 74 61 e></td></tr></ta
b1c0: 62 6c 65 3e 0a 20 20 69 66 28 20 62 41 75 74 6f ble>. if( bAuto
b1d0: 43 61 70 74 63 68 61 20 29 20 7b 0a 20 20 20 20 Captcha ) {.
b1e0: 20 40 20 3c 69 6e 70 75 74 20 74 79 70 65 3d 22 @ <input type="
b1f0: 62 75 74 74 6f 6e 22 20 76 61 6c 75 65 3d 22 46 button" value="F
b200: 69 6c 6c 20 6f 75 74 20 63 61 70 74 63 68 61 22 ill out captcha"
b210: 20 69 64 3d 27 61 75 74 6f 66 69 6c 6c 42 75 74 id='autofillBut
b220: 74 6f 6e 27 20 5c 0a 20 20 20 20 20 40 20 64 61 ton' \. @ da
b230: 74 61 2d 61 66 3d 27 25 73 28 7a 44 65 63 6f 64 ta-af='%s(zDecod
b240: 65 64 29 27 3e 0a 20 20 20 20 20 62 75 69 6c 74 ed)'>. built
b250: 69 6e 5f 72 65 71 75 65 73 74 5f 6a 73 28 22 6c in_request_js("l
b260: 6f 67 69 6e 2e 6a 73 22 29 3b 0a 20 20 7d 0a 20 ogin.js");. }.
b270: 20 40 20 3c 2f 64 69 76 3e 0a 20 20 66 72 65 65 @ </div>. free
b280: 28 7a 43 61 70 74 63 68 61 29 3b 0a 20 20 40 0a (zCaptcha);. @.
b290: 20 20 40 20 3c 70 3e 57 65 20 72 65 67 72 65 74 @ <p>We regret
b2a0: 20 74 68 69 73 20 69 6e 63 6f 6e 76 65 6e 69 65 this inconvenie
b2b0: 6e 63 65 2e 20 48 6f 77 65 76 65 72 2c 20 72 6f nce. However, ro
b2c0: 62 6f 74 73 20 68 61 76 65 20 62 65 63 6f 6d 65 bots have become
b2d0: 20 73 6f 0a 20 20 40 20 70 72 6f 6c 69 66 69 63 so. @ prolific
b2e0: 20 61 6e 64 20 73 6f 20 61 67 67 72 65 73 73 69 and so aggressi
b2f0: 76 65 20 74 68 61 74 20 74 68 65 79 20 77 69 6c ve that they wil
b300: 6c 20 73 6f 61 6b 20 75 70 20 74 6f 6f 20 6d 75 l soak up too mu
b310: 63 68 20 43 50 55 20 74 69 6d 65 0a 20 20 40 20 ch CPU time. @
b320: 61 6e 64 20 6e 65 74 77 6f 72 6b 20 62 61 6e 64 and network band
b330: 77 69 64 74 68 20 6f 6e 20 6f 75 72 20 73 65 72 width on our ser
b340: 76 65 72 73 20 69 66 20 61 6c 6c 6f 77 65 64 20 vers if allowed
b350: 74 6f 20 72 75 6e 20 75 6e 63 68 65 63 6b 65 64 to run unchecked
b360: 2e 0a 20 20 40 20 59 6f 75 72 20 63 6f 6f 70 65 .. @ Your coope
b370: 72 61 74 69 6f 6e 20 69 6e 20 64 65 6d 6f 6e 73 ration in demons
b380: 74 72 61 74 69 6e 67 20 74 68 61 74 20 79 6f 75 trating that you
b390: 20 61 72 65 20 68 75 6d 61 6e 20 69 73 0a 20 20 are human is.
b3a0: 40 20 61 70 70 72 65 63 69 61 74 65 64 2e 0a 20 @ appreciated..
b3b0: 20 73 74 79 6c 65 5f 66 69 6e 69 73 68 5f 70 61 style_finish_pa
b3c0: 67 65 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 ge();.}../*.** W
b3d0: 65 62 70 61 67 65 73 20 74 68 61 74 20 65 6e 63 ebpages that enc
b3e0: 6f 75 6e 74 65 72 20 61 6e 20 65 72 72 6f 72 20 ounter an error
b3f0: 64 75 65 20 74 6f 20 6d 69 73 73 69 6e 67 20 6f due to missing o
b400: 72 20 69 6e 63 6f 72 72 65 63 74 0a 2a 2a 20 71 r incorrect.** q
b410: 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 73 20 uery parameters
b420: 63 61 6e 20 6a 75 6d 70 20 74 6f 20 74 68 69 73 can jump to this
b430: 20 72 6f 75 74 69 6e 65 20 74 6f 20 72 65 6e 64 routine to rend
b440: 65 72 20 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 6d er an error.** m
b450: 65 73 73 61 67 65 20 73 63 72 65 65 6e 2e 0a 2a essage screen..*
b460: 2a 0a 2a 2a 20 46 6f 72 20 61 64 6d 69 6e 69 73 *.** For adminis
b470: 74 61 74 6f 72 73 2c 20 6f 72 20 69 66 20 74 68 tators, or if th
b480: 65 20 74 65 73 74 5f 65 6e 76 5f 65 6e 61 62 6c e test_env_enabl
b490: 65 20 73 65 74 74 69 6e 67 20 69 73 20 74 72 75 e setting is tru
b4a0: 65 2c 20 74 68 65 6e 0a 2a 2a 20 64 65 74 61 69 e, then.** detai
b4b0: 6c 73 20 6f 66 20 74 68 65 20 72 65 71 75 65 73 ls of the reques
b4c0: 74 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 61 72 t environment ar
b4d0: 65 20 64 69 73 70 6c 61 79 65 64 2e 20 20 4f 74 e displayed. Ot
b4e0: 68 65 72 77 69 73 65 2c 20 6a 75 73 74 0a 2a 2a herwise, just.**
b4f0: 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 the error messa
b500: 67 65 20 69 73 20 73 68 6f 77 6e 2e 0a 2a 2a 0a ge is shown..**.
b510: 2a 2a 20 49 66 20 7a 46 6f 72 6d 61 74 20 69 73 ** If zFormat is
b520: 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 an empty string
b530: 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73 20 74 , then this is t
b540: 68 65 20 2f 74 65 73 74 5f 65 6e 76 20 70 61 67 he /test_env pag
b550: 65 2e 0a 2a 2f 0a 76 6f 69 64 20 77 65 62 70 61 e..*/.void webpa
b560: 67 65 5f 65 72 72 6f 72 28 63 6f 6e 73 74 20 63 ge_error(const c
b570: 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e har *zFormat, ..
b580: 2e 29 7b 0a 20 20 69 6e 74 20 73 68 6f 77 41 6c .){. int showAl
b590: 6c 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a l = 0;. char *z
b5a0: 45 72 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 Err = 0;. int i
b5b0: 73 41 75 74 68 20 3d 20 30 3b 0a 20 20 63 68 61 sAuth = 0;. cha
b5c0: 72 20 7a 43 61 70 5b 31 30 30 5d 3b 0a 0a 20 20 r zCap[100];..
b5d0: 6c 6f 67 69 6e 5f 63 68 65 63 6b 5f 63 72 65 64 login_check_cred
b5e0: 65 6e 74 69 61 6c 73 28 29 3b 0a 20 20 69 66 28 entials();. if(
b5f0: 20 67 2e 70 65 72 6d 2e 41 64 6d 69 6e 20 7c 7c g.perm.Admin ||
b600: 20 67 2e 70 65 72 6d 2e 53 65 74 75 70 20 20 7c g.perm.Setup |
b610: 7c 20 64 62 5f 67 65 74 5f 62 6f 6f 6c 65 61 6e | db_get_boolean
b620: 28 22 74 65 73 74 5f 65 6e 76 5f 65 6e 61 62 6c ("test_env_enabl
b630: 65 22 2c 30 29 20 29 7b 0a 20 20 20 20 69 73 41 e",0) ){. isA
b640: 75 74 68 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 63 uth = 1;. }. c
b650: 67 69 5f 6c 6f 61 64 5f 65 6e 76 69 72 6f 6e 6d gi_load_environm
b660: 65 6e 74 28 29 3b 0a 20 20 73 74 79 6c 65 5f 73 ent();. style_s
b670: 65 74 5f 63 75 72 72 65 6e 74 5f 66 65 61 74 75 et_current_featu
b680: 72 65 28 7a 46 6f 72 6d 61 74 5b 30 5d 3d 3d 30 re(zFormat[0]==0
b690: 20 3f 20 22 74 65 73 74 22 20 3a 20 22 65 72 72 ? "test" : "err
b6a0: 6f 72 22 29 3b 0a 20 20 69 66 28 20 7a 46 6f 72 or");. if( zFor
b6b0: 6d 61 74 5b 30 5d 20 29 7b 0a 20 20 20 20 76 61 mat[0] ){. va
b6c0: 5f 6c 69 73 74 20 61 70 3b 0a 20 20 20 20 76 61 _list ap;. va
b6d0: 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d _start(ap, zForm
b6e0: 61 74 29 3b 0a 20 20 20 20 7a 45 72 72 20 3d 20 at);. zErr =
b6f0: 76 6d 70 72 69 6e 74 66 28 7a 46 6f 72 6d 61 74 vmprintf(zFormat
b700: 2c 20 61 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e , ap);. va_en
b710: 64 28 61 70 29 3b 0a 20 20 20 20 73 74 79 6c 65 d(ap);. style
b720: 5f 68 65 61 64 65 72 28 22 42 61 64 20 52 65 71 _header("Bad Req
b730: 75 65 73 74 22 29 3b 0a 20 20 20 20 40 20 3c 68 uest");. @ <h
b740: 31 3e 2f 25 68 28 67 2e 7a 50 61 74 68 29 3a 20 1>/%h(g.zPath):
b750: 25 68 28 7a 45 72 72 29 3c 2f 68 31 3e 0a 20 20 %h(zErr)</h1>.
b760: 20 20 73 68 6f 77 41 6c 6c 20 3d 20 30 3b 0a 20 showAll = 0;.
b770: 20 20 20 63 67 69 5f 73 65 74 5f 73 74 61 74 75 cgi_set_statu
b780: 73 28 35 30 30 2c 20 22 42 61 64 20 52 65 71 75 s(500, "Bad Requ
b790: 65 73 74 22 29 3b 0a 20 20 7d 65 6c 73 65 20 69 est");. }else i
b7a0: 66 28 20 21 69 73 41 75 74 68 20 29 7b 0a 20 20 f( !isAuth ){.
b7b0: 20 20 6c 6f 67 69 6e 5f 6e 65 65 64 65 64 28 30 login_needed(0
b7c0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 );. return;.
b7d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 74 79 6c }else{. styl
b7e0: 65 5f 68 65 61 64 65 72 28 22 45 6e 76 69 72 6f e_header("Enviro
b7f0: 6e 6d 65 6e 74 20 54 65 73 74 22 29 3b 0a 20 20 nment Test");.
b800: 20 20 73 68 6f 77 41 6c 6c 20 3d 20 50 42 28 22 showAll = PB("
b810: 73 68 6f 77 61 6c 6c 22 29 3b 0a 20 20 20 20 73 showall");. s
b820: 74 79 6c 65 5f 73 75 62 6d 65 6e 75 5f 63 68 65 tyle_submenu_che
b830: 63 6b 62 6f 78 28 22 73 68 6f 77 61 6c 6c 22 2c ckbox("showall",
b840: 20 22 43 6f 6f 6b 69 65 73 22 2c 20 30 2c 20 30 "Cookies", 0, 0
b850: 29 3b 0a 20 20 20 20 73 74 79 6c 65 5f 73 75 62 );. style_sub
b860: 6d 65 6e 75 5f 65 6c 65 6d 65 6e 74 28 22 53 74 menu_element("St
b870: 61 74 73 22 2c 20 22 25 52 2f 73 74 61 74 22 29 ats", "%R/stat")
b880: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69 73 41 ;. }.. if( isA
b890: 75 74 68 20 29 7b 0a 20 20 23 69 66 20 21 64 65 uth ){. #if !de
b8a0: 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 0a 20 20 fined(_WIN32).
b8b0: 20 20 40 20 75 69 64 3d 25 64 28 67 65 74 75 69 @ uid=%d(getui
b8c0: 64 28 29 29 2c 20 67 69 64 3d 25 64 28 67 65 74 d()), gid=%d(get
b8d0: 67 69 64 28 29 29 3c 62 72 3e 0a 20 20 23 65 6e gid())<br>. #en
b8e0: 64 69 66 0a 20 20 20 20 40 20 67 2e 7a 42 61 73 dif. @ g.zBas
b8f0: 65 55 52 4c 20 3d 20 25 68 28 67 2e 7a 42 61 73 eURL = %h(g.zBas
b900: 65 55 52 4c 29 3c 62 72 3e 0a 20 20 20 20 40 20 eURL)<br>. @
b910: 67 2e 7a 48 74 74 70 73 55 52 4c 20 3d 20 25 68 g.zHttpsURL = %h
b920: 28 67 2e 7a 48 74 74 70 73 55 52 4c 29 3c 62 72 (g.zHttpsURL)<br
b930: 3e 0a 20 20 20 20 40 20 67 2e 7a 54 6f 70 20 3d >. @ g.zTop =
b940: 20 25 68 28 67 2e 7a 54 6f 70 29 3c 62 72 3e 0a %h(g.zTop)<br>.
b950: 20 20 20 20 40 20 67 2e 7a 50 61 74 68 20 3d 20 @ g.zPath =
b960: 25 68 28 67 2e 7a 50 61 74 68 29 3c 62 72 3e 0a %h(g.zPath)<br>.
b970: 20 20 20 20 40 20 67 2e 75 73 65 72 55 69 64 20 @ g.userUid
b980: 3d 20 25 64 28 67 2e 75 73 65 72 55 69 64 29 3c = %d(g.userUid)<
b990: 62 72 3e 0a 20 20 20 20 40 20 67 2e 7a 4c 6f 67 br>. @ g.zLog
b9a0: 69 6e 20 3d 20 25 68 28 67 2e 7a 4c 6f 67 69 6e in = %h(g.zLogin
b9b0: 29 3c 62 72 3e 0a 20 20 20 20 40 20 67 2e 69 73 )<br>. @ g.is
b9c0: 48 75 6d 61 6e 20 3d 20 25 64 28 67 2e 69 73 48 Human = %d(g.isH
b9d0: 75 6d 61 6e 29 3c 62 72 3e 0a 20 20 20 20 40 20 uman)<br>. @
b9e0: 67 2e 6a 73 48 72 65 66 20 3d 20 25 64 28 67 2e g.jsHref = %d(g.
b9f0: 6a 73 48 72 65 66 29 3c 62 72 3e 0a 20 20 20 20 jsHref)<br>.
ba00: 69 66 28 20 67 2e 7a 4c 6f 63 61 6c 52 6f 6f 74 if( g.zLocalRoot
ba10: 20 29 7b 0a 20 20 20 20 20 20 40 20 67 2e 7a 4c ){. @ g.zL
ba20: 6f 63 61 6c 52 6f 6f 74 20 3d 20 25 68 28 67 2e ocalRoot = %h(g.
ba30: 7a 4c 6f 63 61 6c 52 6f 6f 74 29 3c 62 72 3e 0a zLocalRoot)<br>.
ba40: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 }else{.
ba50: 20 40 20 67 2e 7a 4c 6f 63 61 6c 52 6f 6f 74 20 @ g.zLocalRoot
ba60: 3d 20 3c 69 3e 6e 6f 6e 65 3c 2f 69 3e 3c 62 72 = <i>none</i><br
ba70: 3e 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 >. }. if(
ba80: 67 2e 6e 52 65 71 75 65 73 74 20 29 7b 0a 20 20 g.nRequest ){.
ba90: 20 20 20 20 40 20 67 2e 6e 52 65 71 75 65 73 74 @ g.nRequest
baa0: 20 3d 20 25 64 28 67 2e 6e 52 65 71 75 65 73 74 = %d(g.nRequest
bab0: 29 3c 62 72 3e 0a 20 20 20 20 7d 0a 20 20 20 20 )<br>. }.
bac0: 69 66 28 20 67 2e 6e 50 65 6e 64 69 6e 67 52 65 if( g.nPendingRe
bad0: 71 75 65 73 74 3e 31 20 29 7b 0a 20 20 20 20 20 quest>1 ){.
bae0: 20 40 20 67 2e 6e 50 65 6e 64 69 6e 67 52 65 71 @ g.nPendingReq
baf0: 75 65 73 74 20 3d 20 25 64 28 67 2e 6e 50 65 6e uest = %d(g.nPen
bb00: 64 69 6e 67 52 65 71 75 65 73 74 29 3c 62 72 3e dingRequest)<br>
bb10: 0a 20 20 20 20 7d 0a 20 20 20 20 40 20 63 61 70 . }. @ cap
bb20: 61 62 69 6c 69 74 69 65 73 20 3d 20 25 73 28 66 abilities = %s(f
bb30: 69 6e 64 5f 63 61 70 61 62 69 6c 69 74 69 65 73 ind_capabilities
bb40: 28 7a 43 61 70 29 29 3c 62 72 3e 0a 20 20 20 20 (zCap))<br>.
bb50: 69 66 28 20 7a 43 61 70 5b 30 5d 20 29 7b 0a 20 if( zCap[0] ){.
bb60: 20 20 20 20 20 40 20 61 6e 6f 6e 79 6d 6f 75 73 @ anonymous
bb70: 2d 61 64 64 73 20 3d 20 25 73 28 66 69 6e 64 5f -adds = %s(find_
bb80: 61 6e 6f 6e 5f 63 61 70 61 62 69 6c 69 74 69 65 anon_capabilitie
bb90: 73 28 7a 43 61 70 29 29 3c 62 72 3e 0a 20 20 20 s(zCap))<br>.
bba0: 20 7d 0a 20 20 20 20 40 20 67 2e 7a 52 65 70 6f }. @ g.zRepo
bbb0: 73 69 74 6f 72 79 4e 61 6d 65 20 3d 20 25 68 28 sitoryName = %h(
bbc0: 67 2e 7a 52 65 70 6f 73 69 74 6f 72 79 4e 61 6d g.zRepositoryNam
bbd0: 65 29 3c 62 72 3e 0a 20 20 20 20 40 20 6c 6f 61 e)<br>. @ loa
bbe0: 64 5f 61 76 65 72 61 67 65 28 29 20 3d 20 25 66 d_average() = %f
bbf0: 28 6c 6f 61 64 5f 61 76 65 72 61 67 65 28 29 29 (load_average())
bc00: 3c 62 72 3e 0a 23 69 66 6e 64 65 66 20 5f 57 49 <br>.#ifndef _WI
bc10: 4e 33 32 0a 20 20 20 20 40 20 52 53 53 20 3d 20 N32. @ RSS =
bc20: 25 2e 32 66 28 66 6f 73 73 69 6c 5f 72 73 73 28 %.2f(fossil_rss(
bc30: 29 2f 31 30 30 30 30 30 30 2e 30 29 20 4d 42 3c )/1000000.0) MB<
bc40: 2f 62 72 3e 0a 23 65 6e 64 69 66 0a 20 20 20 20 /br>.#endif.
bc50: 28 76 6f 69 64 29 63 67 69 5f 63 73 72 66 5f 73 (void)cgi_csrf_s
bc60: 61 66 65 28 32 29 3b 0a 20 20 20 20 73 77 69 74 afe(2);. swit
bc70: 63 68 28 20 67 2e 6f 6b 43 73 72 66 20 29 7b 0a ch( g.okCsrf ){.
bc80: 20 20 20 20 20 20 63 61 73 65 20 31 3a 20 7b 0a case 1: {.
bc90: 20 20 20 20 20 20 20 20 20 40 20 43 53 52 46 20 @ CSRF
bca0: 73 61 66 65 74 79 20 3d 20 53 61 6d 65 20 6f 72 safety = Same or
bcb0: 69 67 69 6e 3c 62 72 3e 0a 20 20 20 20 20 20 20 igin<br>.
bcc0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d break;. }
bcd0: 0a 20 20 20 20 20 20 63 61 73 65 20 32 3a 20 7b . case 2: {
bce0: 0a 20 20 20 20 20 20 20 20 20 40 20 43 53 52 46 . @ CSRF
bcf0: 20 73 61 66 65 74 79 20 3d 20 53 61 6d 65 20 6f safety = Same o
bd00: 72 69 67 69 6e 2c 20 50 4f 53 54 3c 62 72 3e 0a rigin, POST<br>.
bd10: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a break;.
bd20: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 }. ca
bd30: 73 65 20 33 3a 20 7b 0a 20 20 20 20 20 20 20 20 se 3: {.
bd40: 20 40 20 43 53 52 46 20 73 61 66 65 74 79 20 3d @ CSRF safety =
bd50: 20 53 61 6d 65 20 6f 72 69 67 69 6e 2c 20 50 4f Same origin, PO
bd60: 53 54 2c 20 43 53 52 46 20 74 6f 6b 65 6e 3c 62 ST, CSRF token<b
bd70: 72 3e 0a 20 20 20 20 20 20 20 20 20 62 72 65 61 r>. brea
bd80: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 k;. }.
bd90: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 default: {.
bda0: 20 20 20 20 20 40 20 43 53 52 46 20 73 61 66 65 @ CSRF safe
bdb0: 74 79 20 3d 20 75 6e 73 61 66 65 3c 62 72 3e 0a ty = unsafe<br>.
bdc0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a break;.
bdd0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 }. }..
bde0: 20 20 20 40 20 66 6f 73 73 69 6c 5f 65 78 65 5f @ fossil_exe_
bdf0: 69 64 28 29 20 3d 20 25 68 28 66 6f 73 73 69 6c id() = %h(fossil
be00: 5f 65 78 65 5f 69 64 28 29 29 3c 62 72 3e 0a 20 _exe_id())<br>.
be10: 20 20 20 69 66 28 20 67 2e 70 65 72 6d 2e 41 64 if( g.perm.Ad
be20: 6d 69 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 min ){. int
be30: 20 6b 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d k;. for(k=
be40: 30 3b 20 67 2e 61 72 67 76 4f 72 69 67 5b 6b 5d 0; g.argvOrig[k]
be50: 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 ; k++){.
be60: 42 6c 6f 62 20 74 3b 0a 20 20 20 20 20 20 20 20 Blob t;.
be70: 62 6c 6f 62 5f 69 6e 69 74 28 26 74 2c 20 30 2c blob_init(&t, 0,
be80: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 62 6c 6f 0);. blo
be90: 62 5f 61 70 70 65 6e 64 5f 65 73 63 61 70 65 64 b_append_escaped
bea0: 5f 61 72 67 28 26 74 2c 20 67 2e 61 72 67 76 4f _arg(&t, g.argvO
beb0: 72 69 67 5b 6b 5d 2c 20 30 29 3b 0a 20 20 20 20 rig[k], 0);.
bec0: 20 20 20 20 40 20 61 72 67 76 5b 25 64 28 6b 29 @ argv[%d(k)
bed0: 5d 20 3d 20 25 68 28 62 6c 6f 62 5f 73 74 72 28 ] = %h(blob_str(
bee0: 26 74 29 29 3c 62 72 3e 0a 20 20 20 20 20 20 20 &t))<br>.
bef0: 20 62 6c 6f 62 5f 7a 65 72 6f 28 26 74 29 3b 0a blob_zero(&t);.
bf00: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 }. }.
bf10: 20 20 40 20 3c 68 72 3e 0a 20 20 20 20 50 28 22 @ <hr>. P("
bf20: 48 54 54 50 5f 55 53 45 52 5f 41 47 45 4e 54 22 HTTP_USER_AGENT"
bf30: 29 3b 0a 20 20 20 20 50 28 22 53 45 52 56 45 52 );. P("SERVER
bf40: 5f 53 4f 46 54 57 41 52 45 22 29 3b 0a 20 20 20 _SOFTWARE");.
bf50: 20 63 67 69 5f 70 72 69 6e 74 5f 61 6c 6c 28 73 cgi_print_all(s
bf60: 68 6f 77 41 6c 6c 2c 20 30 2c 20 30 29 3b 0a 20 howAll, 0, 0);.
bf70: 20 20 20 40 20 3c 70 3e 3c 66 6f 72 6d 20 6d 65 @ <p><form me
bf80: 74 68 6f 64 3d 22 50 4f 53 54 22 20 61 63 74 69 thod="POST" acti
bf90: 6f 6e 3d 22 25 52 2f 74 65 73 74 5f 65 6e 76 22 on="%R/test_env"
bfa0: 3e 0a 20 20 20 20 40 20 3c 69 6e 70 75 74 20 74 >. @ <input t
bfb0: 79 70 65 3d 22 68 69 64 64 65 6e 22 20 6e 61 6d ype="hidden" nam
bfc0: 65 3d 22 73 68 6f 77 61 6c 6c 22 20 76 61 6c 75 e="showall" valu
bfd0: 65 3d 22 25 64 28 73 68 6f 77 41 6c 6c 29 22 3e e="%d(showAll)">
bfe0: 0a 20 20 20 20 40 20 3c 69 6e 70 75 74 20 74 79 . @ <input ty
bff0: 70 65 3d 22 73 75 62 6d 69 74 22 20 6e 61 6d 65 pe="submit" name
c000: 3d 22 70 6f 73 74 2d 74 65 73 74 2d 62 75 74 74 ="post-test-butt
c010: 6f 6e 22 20 76 61 6c 75 65 3d 22 50 4f 53 54 20 on" value="POST
c020: 54 65 73 74 22 3e 0a 20 20 20 20 40 20 3c 2f 66 Test">. @ </f
c030: 6f 72 6d 3e 0a 20 20 20 20 69 66 28 20 73 68 6f orm>. if( sho
c040: 77 41 6c 6c 20 26 26 20 62 6c 6f 62 5f 73 69 7a wAll && blob_siz
c050: 65 28 26 67 2e 68 74 74 70 48 65 61 64 65 72 29 e(&g.httpHeader)
c060: 3e 30 20 29 7b 0a 20 20 20 20 20 20 40 20 3c 68 >0 ){. @ <h
c070: 72 3e 0a 20 20 20 20 20 20 40 20 3c 70 72 65 3e r>. @ <pre>
c080: 0a 20 20 20 20 20 20 40 20 25 68 28 62 6c 6f 62 . @ %h(blob
c090: 5f 73 74 72 28 26 67 2e 68 74 74 70 48 65 61 64 _str(&g.httpHead
c0a0: 65 72 29 29 0a 20 20 20 20 20 20 40 20 3c 2f 70 er)). @ </p
c0b0: 72 65 3e 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 re>. }. }.
c0c0: 69 66 28 20 7a 45 72 72 20 26 26 20 7a 45 72 72 if( zErr && zErr
c0d0: 5b 30 5d 20 29 7b 0a 20 20 20 20 73 74 79 6c 65 [0] ){. style
c0e0: 5f 66 69 6e 69 73 68 5f 70 61 67 65 28 29 3b 0a _finish_page();.
c0f0: 20 20 20 20 63 67 69 5f 72 65 70 6c 79 28 29 3b cgi_reply();
c100: 0a 20 20 20 20 66 6f 73 73 69 6c 5f 65 78 69 74 . fossil_exit
c110: 28 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 (1);. }else{.
c120: 20 20 73 74 79 6c 65 5f 66 69 6e 69 73 68 5f 70 style_finish_p
c130: 61 67 65 28 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a age();. }.}../*
c140: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20 4e .** Generate a N
c150: 6f 74 20 59 65 74 20 49 6d 70 6c 65 6d 65 6e 74 ot Yet Implement
c160: 65 64 20 65 72 72 6f 72 20 70 61 67 65 2e 0a 2a ed error page..*
c170: 2f 0a 76 6f 69 64 20 77 65 62 70 61 67 65 5f 6e /.void webpage_n
c180: 6f 74 5f 79 65 74 5f 69 6d 70 6c 65 6d 65 6e 74 ot_yet_implement
c190: 65 64 28 76 6f 69 64 29 7b 0a 20 20 77 65 62 70 ed(void){. webp
c1a0: 61 67 65 5f 65 72 72 6f 72 28 22 4e 6f 74 20 79 age_error("Not y
c1b0: 65 74 20 69 6d 70 6c 65 6d 65 6e 74 65 64 22 29 et implemented")
c1c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 ;.}../*.** Gener
c1d0: 61 74 65 20 61 20 77 65 62 70 61 67 65 20 66 6f ate a webpage fo
c1e0: 72 20 61 20 77 65 62 70 61 67 65 5f 61 73 73 65 r a webpage_asse
c1f0: 72 74 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 77 65 rt()..*/.void we
c200: 62 70 61 67 65 5f 61 73 73 65 72 74 5f 70 61 67 bpage_assert_pag
c210: 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 e(const char *zF
c220: 69 6c 65 2c 20 69 6e 74 20 69 4c 69 6e 65 2c 20 ile, int iLine,
c230: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 78 70 const char *zExp
c240: 72 29 7b 0a 20 20 66 6f 73 73 69 6c 5f 77 61 72 r){. fossil_war
c250: 6e 69 6e 67 28 22 61 73 73 65 72 74 69 6f 6e 20 ning("assertion
c260: 66 61 75 6c 74 20 61 74 20 25 73 3a 25 64 20 2d fault at %s:%d -
c270: 20 25 73 22 2c 20 7a 46 69 6c 65 2c 20 69 4c 69 %s", zFile, iLi
c280: 6e 65 2c 20 7a 45 78 70 72 29 3b 0a 20 20 63 67 ne, zExpr);. cg
c290: 69 5f 72 65 73 65 74 5f 63 6f 6e 74 65 6e 74 28 i_reset_content(
c2a0: 29 3b 0a 20 20 77 65 62 70 61 67 65 5f 65 72 72 );. webpage_err
c2b0: 6f 72 28 22 61 73 73 65 72 74 69 6f 6e 20 66 61 or("assertion fa
c2c0: 75 6c 74 20 61 74 20 25 73 3a 25 64 20 2d 20 25 ult at %s:%d - %
c2d0: 73 22 2c 20 7a 46 69 6c 65 2c 20 69 4c 69 6e 65 s", zFile, iLine
c2e0: 2c 20 7a 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a , zExpr);.}../*.
c2f0: 2a 2a 20 49 73 73 75 65 20 61 20 34 30 34 20 4e ** Issue a 404 N
c300: 6f 74 20 46 6f 75 6e 64 20 65 72 72 6f 72 20 66 ot Found error f
c310: 6f 72 20 61 20 77 65 62 70 61 67 65 0a 2a 2f 0a or a webpage.*/.
c320: 76 6f 69 64 20 77 65 62 70 61 67 65 5f 6e 6f 74 void webpage_not
c330: 66 6f 75 6e 64 5f 65 72 72 6f 72 28 63 6f 6e 73 found_error(cons
c340: 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c t char *zFormat,
c350: 20 2e 2e 2e 29 7b 0a 20 20 63 68 61 72 20 2a 7a ...){. char *z
c360: 4d 73 67 3b 0a 20 20 76 61 5f 6c 69 73 74 20 61 Msg;. va_list a
c370: 70 3b 0a 20 20 69 66 28 20 7a 46 6f 72 6d 61 74 p;. if( zFormat
c380: 20 29 7b 0a 20 20 20 20 76 61 5f 73 74 61 72 74 ){. va_start
c390: 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 (ap, zFormat);.
c3a0: 20 20 20 7a 4d 73 67 20 3d 20 76 6d 70 72 69 6e zMsg = vmprin
c3b0: 74 66 28 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b tf(zFormat, ap);
c3c0: 0a 20 20 20 20 76 61 5f 65 6e 64 28 61 70 29 3b . va_end(ap);
c3d0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 4d . }else{. zM
c3e0: 73 67 20 3d 20 22 4e 6f 74 20 46 6f 75 6e 64 22 sg = "Not Found"
c3f0: 3b 0a 20 20 7d 0a 20 20 73 74 79 6c 65 5f 73 65 ;. }. style_se
c400: 74 5f 63 75 72 72 65 6e 74 5f 66 65 61 74 75 72 t_current_featur
c410: 65 28 22 65 6e 6f 74 66 6f 75 6e 64 22 29 3b 0a e("enotfound");.
c420: 20 20 73 74 79 6c 65 5f 68 65 61 64 65 72 28 22 style_header("
c430: 4e 6f 74 20 46 6f 75 6e 64 22 29 3b 0a 20 20 40 Not Found");. @
c440: 20 3c 70 3e 25 68 28 7a 4d 73 67 29 3c 2f 70 3e <p>%h(zMsg)</p>
c450: 0a 20 20 63 67 69 5f 73 65 74 5f 73 74 61 74 75 . cgi_set_statu
c460: 73 28 34 30 34 2c 20 22 4e 6f 74 20 46 6f 75 6e s(404, "Not Foun
c470: 64 22 29 3b 0a 20 20 73 74 79 6c 65 5f 66 69 6e d");. style_fin
c480: 69 73 68 5f 70 61 67 65 28 29 3b 0a 7d 0a 0a 23 ish_page();.}..#
c490: 69 66 20 49 4e 54 45 52 46 41 43 45 0a 23 20 64 if INTERFACE.# d
c4a0: 65 66 69 6e 65 20 77 65 62 70 61 67 65 5f 61 73 efine webpage_as
c4b0: 73 65 72 74 28 54 29 20 69 66 28 21 28 54 29 29 sert(T) if(!(T))
c4c0: 7b 77 65 62 70 61 67 65 5f 61 73 73 65 72 74 5f {webpage_assert_
c4d0: 70 61 67 65 28 5f 5f 46 49 4c 45 5f 5f 2c 5f 5f page(__FILE__,__
c4e0: 4c 49 4e 45 5f 5f 2c 23 54 29 3b 7d 0a 23 65 6e LINE__,#T);}.#en
c4f0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 dif../*.** Retur
c500: 6e 73 20 61 20 70 73 65 75 64 6f 2d 72 61 6e 64 ns a pseudo-rand
c510: 6f 6d 20 69 6e 70 75 74 20 66 69 65 6c 64 20 49 om input field I
c520: 44 2c 20 66 6f 72 20 75 73 65 20 69 6e 20 61 73 D, for use in as
c530: 73 6f 63 69 61 74 69 6e 67 20 61 6e 0a 2a 2a 20 sociating an.**
c540: 49 44 2d 6c 65 73 73 20 69 6e 70 75 74 20 66 69 ID-less input fi
c550: 65 6c 64 20 77 69 74 68 20 61 20 6c 61 62 65 6c eld with a label
c560: 2e 20 54 68 65 20 6d 65 6d 6f 72 79 20 69 73 20 . The memory is
c570: 6f 77 6e 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 owned by the.**
c580: 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 caller..*/.stati
c590: 63 20 63 68 61 72 20 2a 20 73 74 79 6c 65 5f 6e c char * style_n
c5a0: 65 78 74 5f 69 6e 70 75 74 5f 69 64 28 29 7b 0a ext_input_id(){.
c5b0: 20 20 73 74 61 74 69 63 20 69 6e 74 20 69 6e 70 static int inp
c5c0: 75 74 49 44 20 3d 20 30 3b 0a 20 20 2b 2b 69 6e utID = 0;. ++in
c5d0: 70 75 74 49 44 3b 0a 20 20 72 65 74 75 72 6e 20 putID;. return
c5e0: 6d 70 72 69 6e 74 66 28 22 69 6e 70 75 74 2d 69 mprintf("input-i
c5f0: 64 2d 25 64 22 2c 20 69 6e 70 75 74 49 44 29 3b d-%d", inputID);
c600: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74 .}../*.** Output
c610: 73 20 61 20 6c 61 62 65 6c 65 64 20 63 68 65 63 s a labeled chec
c620: 6b 62 6f 78 20 65 6c 65 6d 65 6e 74 2e 20 7a 57 kbox element. zW
c630: 72 61 70 70 65 72 49 64 20 69 73 20 61 6e 20 6f rapperId is an o
c640: 70 74 69 6f 6e 61 6c 20 49 44 0a 2a 2a 20 76 61 ptional ID.** va
c650: 6c 75 65 20 66 6f 72 20 74 68 65 20 63 6f 6e 74 lue for the cont
c660: 61 69 6e 69 6e 67 20 65 6c 65 6d 65 6e 74 20 28 aining element (
c670: 73 65 65 20 62 65 6c 6f 77 29 2e 20 7a 46 69 65 see below). zFie
c680: 6c 64 4e 61 6d 65 20 69 73 20 74 68 65 0a 2a 2a ldName is the.**
c690: 20 66 6f 72 6d 20 65 6c 65 6d 65 6e 74 20 6e 61 form element na
c6a0: 6d 65 2e 20 7a 4c 61 62 65 6c 20 69 73 20 74 68 me. zLabel is th
c6b0: 65 20 6c 61 62 65 6c 20 66 6f 72 20 74 68 65 20 e label for the
c6c0: 63 68 65 63 6b 62 6f 78 2e 20 7a 56 61 6c 75 65 checkbox. zValue
c6d0: 20 69 73 0a 2a 2a 20 74 68 65 20 6f 70 74 69 6f is.** the optio
c6e0: 6e 61 6c 20 76 61 6c 75 65 20 66 6f 72 20 74 68 nal value for th
c6f0: 65 20 63 68 65 63 6b 62 6f 78 2e 20 7a 54 69 70 e checkbox. zTip
c700: 20 69 73 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 20 is an optional
c710: 74 6f 6f 6c 74 69 70 2c 0a 2a 2a 20 77 68 69 63 tooltip,.** whic
c720: 68 20 67 65 74 73 20 73 65 74 20 61 73 20 74 68 h gets set as th
c730: 65 20 22 74 69 74 6c 65 22 20 61 74 74 72 69 62 e "title" attrib
c740: 75 74 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72 ute of the outer
c750: 6d 6f 73 74 0a 2a 2a 20 65 6c 65 6d 65 6e 74 2e most.** element.
c760: 20 49 66 20 69 73 43 68 65 63 6b 65 64 20 69 73 If isChecked is
c770: 20 74 72 75 65 2c 20 74 68 65 20 63 68 65 63 6b true, the check
c780: 62 6f 78 20 67 65 74 73 20 74 68 65 20 22 63 68 box gets the "ch
c790: 65 63 6b 65 64 22 0a 2a 2a 20 61 74 74 72 69 62 ecked".** attrib
c7a0: 75 74 65 20 73 65 74 2c 20 65 6c 73 65 20 69 74 ute set, else it
c7b0: 20 69 73 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 52 is not..**.** R
c7c0: 65 73 75 6c 74 69 6e 67 20 73 74 72 75 63 74 75 esulting structu
c7d0: 72 65 3a 0a 2a 2a 0a 2a 2a 20 3c 64 69 76 20 63 re:.**.** <div c
c7e0: 6c 61 73 73 3d 27 69 6e 70 75 74 2d 77 69 74 68 lass='input-with
c7f0: 2d 6c 61 62 65 6c 27 20 74 69 74 6c 65 3d 7b 7b -label' title={{
c800: 7a 54 69 70 7d 7d 20 69 64 3d 7b 7b 7a 57 72 61 zTip}} id={{zWra
c810: 70 70 65 72 49 64 7d 7d 3e 0a 2a 2a 20 20 20 3c pperId}}>.** <
c820: 69 6e 70 75 74 20 74 79 70 65 3d 27 63 68 65 63 input type='chec
c830: 6b 62 6f 78 27 20 6e 61 6d 65 3d 7b 7b 7a 46 69 kbox' name={{zFi
c840: 65 6c 64 4e 61 6d 65 7d 7d 20 76 61 6c 75 65 3d eldName}} value=
c850: 7b 7b 7a 56 61 6c 75 65 7d 7d 0a 2a 2a 20 20 20 {{zValue}}.**
c860: 20 20 20 20 20 20 20 69 64 3d 27 41 20 52 41 4e id='A RAN
c870: 44 4f 4d 20 56 41 4c 55 45 27 0a 2a 2a 20 20 20 DOM VALUE'.**
c880: 20 20 20 20 20 20 20 7b 7b 69 73 43 68 65 63 6b {{isCheck
c890: 65 64 20 3f 20 22 20 63 68 65 63 6b 65 64 20 3a ed ? " checked :
c8a0: 20 22 22 7d 7d 2f 3e 0a 2a 2a 20 20 20 3c 6c 61 ""}}/>.** <la
c8b0: 62 65 6c 20 66 6f 72 3d 27 49 44 20 4f 46 20 54 bel for='ID OF T
c8c0: 48 45 20 49 4e 50 55 54 20 46 49 45 4c 44 27 3e HE INPUT FIELD'>
c8d0: 7b 7b 7a 4c 61 62 65 6c 7d 7d 3c 2f 6c 61 62 65 {{zLabel}}</labe
c8e0: 6c 3e 0a 2a 2a 20 3c 2f 64 69 76 3e 0a 2a 2a 0a l>.** </div>.**.
c8f0: 2a 2a 20 7a 4c 61 62 65 6c 2c 20 61 6e 64 20 7a ** zLabel, and z
c900: 56 61 6c 75 65 20 61 72 65 20 72 65 71 75 69 72 Value are requir
c910: 65 64 2e 20 7a 46 69 65 6c 64 4e 61 6d 65 2c 20 ed. zFieldName,
c920: 7a 57 72 61 70 70 65 72 49 64 2c 20 61 6e 64 20 zWrapperId, and
c930: 7a 54 69 70 0a 2a 2a 20 61 72 65 20 6d 61 79 20 zTip.** are may
c940: 62 65 20 4e 55 4c 4c 20 6f 72 20 65 6d 70 74 79 be NULL or empty
c950: 2e 0a 2a 2a 0a 2a 2a 20 42 65 20 73 75 72 65 20 ..**.** Be sure
c960: 74 68 61 74 20 74 68 65 20 69 6e 70 75 74 2d 77 that the input-w
c970: 69 74 68 2d 6c 61 62 65 6c 20 43 53 53 20 63 6c ith-label CSS cl
c980: 61 73 73 20 69 73 20 64 65 66 69 6e 65 64 20 73 ass is defined s
c990: 65 6e 73 69 62 6c 79 2c 20 69 6e 0a 2a 2a 20 70 ensibly, in.** p
c9a0: 61 72 74 69 63 75 6c 61 72 2c 20 68 61 76 69 6e articular, havin
c9b0: 67 20 69 74 73 20 64 69 73 70 6c 61 79 3a 69 6e g its display:in
c9c0: 6c 69 6e 65 2d 62 6c 6f 63 6b 20 69 73 20 75 73 line-block is us
c9d0: 65 66 75 6c 20 66 6f 72 20 61 6c 69 67 6e 6d 65 eful for alignme
c9e0: 6e 74 0a 2a 2a 20 70 75 72 70 6f 73 65 73 2e 0a nt.** purposes..
c9f0: 2a 2f 0a 76 6f 69 64 20 73 74 79 6c 65 5f 6c 61 */.void style_la
ca00: 62 65 6c 65 64 5f 63 68 65 63 6b 62 6f 78 28 63 beled_checkbox(c
ca10: 6f 6e 73 74 20 63 68 61 72 20 2a 20 7a 57 72 61 onst char * zWra
ca20: 70 70 65 72 49 64 2c 0a 20 20 20 20 20 20 20 20 pperId,.
ca30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
ca40: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a const char *
ca50: 7a 46 69 65 6c 64 4e 61 6d 65 2c 20 63 6f 6e 73 zFieldName, cons
ca60: 74 20 63 68 61 72 20 2a 20 7a 4c 61 62 65 6c 2c t char * zLabel,
ca70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
ca80: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e con
ca90: 73 74 20 63 68 61 72 20 2a 20 7a 56 61 6c 75 65 st char * zValue
caa0: 2c 20 69 6e 74 20 69 73 43 68 65 63 6b 65 64 2c , int isChecked,
cab0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
cac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e con
cad0: 73 74 20 63 68 61 72 20 2a 20 7a 54 69 70 29 7b st char * zTip){
cae0: 0a 20 20 63 68 61 72 20 2a 20 7a 4c 61 62 65 6c . char * zLabel
caf0: 49 44 20 3d 20 73 74 79 6c 65 5f 6e 65 78 74 5f ID = style_next_
cb00: 69 6e 70 75 74 5f 69 64 28 29 3b 0a 20 20 43 58 input_id();. CX
cb10: 28 22 3c 64 69 76 20 63 6c 61 73 73 3d 27 69 6e ("<div class='in
cb20: 70 75 74 2d 77 69 74 68 2d 6c 61 62 65 6c 27 22 put-with-label'"
cb30: 29 3b 0a 20 20 69 66 28 7a 54 69 70 20 26 26 20 );. if(zTip &&
cb40: 2a 7a 54 69 70 29 7b 0a 20 20 20 20 43 58 28 22 *zTip){. CX("
cb50: 20 74 69 74 6c 65 3d 27 25 68 27 22 2c 20 7a 54 title='%h'", zT
cb60: 69 70 29 3b 0a 20 20 7d 0a 20 20 69 66 28 7a 57 ip);. }. if(zW
cb70: 72 61 70 70 65 72 49 64 20 26 26 20 2a 7a 57 72 rapperId && *zWr
cb80: 61 70 70 65 72 49 64 29 7b 0a 20 20 20 20 43 58 apperId){. CX
cb90: 28 22 20 69 64 3d 27 25 73 27 22 2c 7a 57 72 61 (" id='%s'",zWra
cba0: 70 70 65 72 49 64 29 3b 0a 20 20 7d 0a 20 20 43 pperId);. }. C
cbb0: 58 28 22 3e 3c 69 6e 70 75 74 20 74 79 70 65 3d X("><input type=
cbc0: 27 63 68 65 63 6b 62 6f 78 27 20 69 64 3d 27 25 'checkbox' id='%
cbd0: 73 27 20 22 2c 20 7a 4c 61 62 65 6c 49 44 29 3b s' ", zLabelID);
cbe0: 0a 20 20 69 66 28 7a 46 69 65 6c 64 4e 61 6d 65 . if(zFieldName
cbf0: 20 26 26 20 2a 7a 46 69 65 6c 64 4e 61 6d 65 29 && *zFieldName)
cc00: 7b 0a 20 20 20 20 43 58 28 22 6e 61 6d 65 3d 27 {. CX("name='
cc10: 25 73 27 20 22 2c 7a 46 69 65 6c 64 4e 61 6d 65 %s' ",zFieldName
cc20: 29 3b 0a 20 20 7d 0a 20 20 43 58 28 22 76 61 6c );. }. CX("val
cc30: 75 65 3d 27 25 54 27 25 73 2f 3e 22 2c 0a 20 20 ue='%T'%s/>",.
cc40: 20 20 20 7a 56 61 6c 75 65 20 3f 20 7a 56 61 6c zValue ? zVal
cc50: 75 65 20 3a 20 22 22 2c 20 69 73 43 68 65 63 6b ue : "", isCheck
cc60: 65 64 20 3f 20 22 20 63 68 65 63 6b 65 64 22 20 ed ? " checked"
cc70: 3a 20 22 22 29 3b 0a 20 20 43 58 28 22 3c 6c 61 : "");. CX("<la
cc80: 62 65 6c 20 66 6f 72 3d 27 25 73 27 3e 25 68 3c bel for='%s'>%h<
cc90: 2f 6c 61 62 65 6c 3e 3c 2f 64 69 76 3e 22 2c 20 /label></div>",
cca0: 7a 4c 61 62 65 6c 49 44 2c 20 7a 4c 61 62 65 6c zLabelID, zLabel
ccb0: 29 3b 0a 20 20 66 6f 73 73 69 6c 5f 66 72 65 65 );. fossil_free
ccc0: 28 7a 4c 61 62 65 6c 49 44 29 3b 0a 7d 0a 0a 2f (zLabelID);.}../
ccd0: 2a 0a 2a 2a 20 4f 75 74 70 75 74 73 20 61 20 53 *.** Outputs a S
cce0: 45 4c 45 43 54 20 6c 69 73 74 20 66 72 6f 6d 20 ELECT list from
ccf0: 61 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6c a compile-time l
cd00: 69 73 74 20 6f 66 20 69 6e 74 65 67 65 72 73 2e ist of integers.
cd10: 0a 2a 2a 20 54 68 65 20 76 61 72 67 73 20 6d 75 .** The vargs mu
cd20: 73 74 20 62 65 20 61 20 6c 69 73 74 20 6f 66 20 st be a list of
cd30: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 2c 20 69 (const char *, i
cd40: 6e 74 29 20 70 61 69 72 73 2c 20 74 65 72 6d 69 nt) pairs, termi
cd50: 6e 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 61 20 nated.** with a
cd60: 73 69 6e 67 6c 65 20 4e 55 4c 4c 2e 20 45 61 63 single NULL. Eac
cd70: 68 20 70 61 69 72 20 69 73 20 69 6e 74 65 72 70 h pair is interp
cd80: 72 65 74 65 64 20 61 73 2e 2e 2e 0a 2a 2a 0a 2a reted as....**.*
cd90: 2a 20 49 66 20 74 68 65 20 28 63 6f 6e 73 74 20 * If the (const
cda0: 63 68 61 72 20 2a 29 20 69 73 20 4e 55 4c 4c 2c char *) is NULL,
cdb0: 20 69 74 20 69 73 20 74 68 65 20 65 6e 64 20 6f it is the end o
cdc0: 66 20 74 68 65 20 6c 69 73 74 2c 20 65 6c 73 65 f the list, else
cdd0: 0a 2a 2a 20 61 20 6e 65 77 20 4f 50 54 49 4f 4e .** a new OPTION
cde0: 20 65 6e 74 72 79 20 69 73 20 63 72 65 61 74 65 entry is create
cdf0: 64 2e 20 49 66 20 74 68 65 20 73 74 72 69 6e 67 d. If the string
ce00: 20 69 73 20 65 6d 70 74 79 2c 20 74 68 65 0a 2a is empty, the.*
ce10: 2a 20 6c 61 62 65 6c 20 61 6e 64 20 76 61 6c 75 * label and valu
ce20: 65 20 6f 66 20 74 68 65 20 4f 50 54 49 4f 4e 20 e of the OPTION
ce30: 69 73 20 74 68 65 20 69 6e 74 65 67 65 72 20 70 is the integer p
ce40: 61 72 74 20 6f 66 20 74 68 65 20 70 61 69 72 2e art of the pair.
ce50: 0a 2a 2a 20 49 66 20 74 68 65 20 73 74 72 69 6e .** If the strin
ce60: 67 20 69 73 20 6e 6f 74 20 65 6d 70 74 79 2c 20 g is not empty,
ce70: 69 74 20 62 65 63 6f 6d 65 73 20 74 68 65 20 6c it becomes the l
ce80: 61 62 65 6c 20 61 6e 64 20 74 68 65 20 69 6e 74 abel and the int
ce90: 65 67 65 72 0a 2a 2a 20 74 68 65 20 76 61 6c 75 eger.** the valu
cea0: 65 2e 20 49 66 20 74 68 61 74 20 76 61 6c 75 65 e. If that value
ceb0: 20 3d 3d 20 73 65 6c 65 63 74 65 64 56 61 6c 75 == selectedValu
cec0: 65 20 74 68 65 6e 20 74 68 61 74 20 4f 50 54 49 e then that OPTI
ced0: 4f 4e 0a 2a 2a 20 65 6c 65 6d 65 6e 74 20 67 65 ON.** element ge
cee0: 74 73 20 74 68 65 20 27 73 65 6c 65 63 74 65 64 ts the 'selected
cef0: 27 20 61 74 74 72 69 62 75 74 65 2e 0a 2a 2a 0a ' attribute..**.
cf00: 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 ** Note that the
cf10: 20 70 61 69 72 73 20 61 72 65 20 6e 6f 74 20 69 pairs are not i
cf20: 6e 20 28 69 6e 74 2c 20 63 6f 6e 73 74 20 63 68 n (int, const ch
cf30: 61 72 20 2a 29 20 6f 72 64 65 72 20 62 65 63 61 ar *) order beca
cf40: 75 73 65 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 use.** there is
cf50: 6e 6f 20 77 65 6c 6c 2d 6b 6e 6f 77 6e 20 69 6e no well-known in
cf60: 74 65 67 65 72 20 76 61 6c 75 65 20 77 68 69 63 teger value whic
cf70: 68 20 77 65 20 63 61 6e 20 64 65 66 69 6e 69 74 h we can definit
cf80: 69 76 65 6c 79 20 75 73 65 0a 2a 2a 20 61 73 20 ively use.** as
cf90: 61 20 6c 69 73 74 20 74 65 72 6d 69 6e 61 74 6f a list terminato
cfa0: 72 2e 0a 2a 2a 0a 2a 2a 20 7a 57 72 61 70 70 65 r..**.** zWrappe
cfb0: 72 49 64 20 69 73 20 61 6e 20 6f 70 74 69 6f 6e rId is an option
cfc0: 61 6c 20 49 44 20 76 61 6c 75 65 20 66 6f 72 20 al ID value for
cfd0: 74 68 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 65 the containing e
cfe0: 6c 65 6d 65 6e 74 20 28 73 65 65 0a 2a 2a 20 62 lement (see.** b
cff0: 65 6c 6f 77 29 2e 0a 2a 2a 0a 2a 2a 20 7a 46 69 elow)..**.** zFi
d000: 65 6c 64 4e 61 6d 65 20 69 73 20 74 68 65 20 76 eldName is the v
d010: 61 6c 75 65 20 6f 66 20 74 68 65 20 66 6f 72 6d alue of the form
d020: 20 65 6c 65 6d 65 6e 74 27 73 20 6e 61 6d 65 20 element's name
d030: 61 74 74 72 69 62 75 74 65 2e 20 4e 6f 74 65 0a attribute. Note.
d040: 2a 2a 20 74 68 61 74 20 66 6f 73 73 69 6c 20 70 ** that fossil p
d050: 72 65 66 65 72 73 20 75 6e 64 65 72 73 63 6f 72 refers underscor
d060: 65 73 20 6f 76 65 72 20 27 2d 27 20 66 6f 72 20 es over '-' for
d070: 73 65 70 61 72 61 74 6f 72 73 20 69 6e 20 66 6f separators in fo
d080: 72 6d 0a 2a 2a 20 65 6c 65 6d 65 6e 74 20 6e 61 rm.** element na
d090: 6d 65 73 2e 0a 2a 2a 0a 2a 2a 20 7a 4c 61 62 65 mes..**.** zLabe
d0a0: 6c 20 69 73 20 61 6e 20 6f 70 74 69 6f 6e 61 6c l is an optional
d0b0: 20 73 74 72 69 6e 67 20 74 6f 20 75 73 65 20 61 string to use a
d0c0: 73 20 61 20 22 6c 61 62 65 6c 22 20 66 6f 72 20 s a "label" for
d0d0: 74 68 65 20 65 6c 65 6d 65 6e 74 0a 2a 2a 20 28 the element.** (
d0e0: 73 65 65 20 62 65 6c 6f 77 29 2e 0a 2a 2a 0a 2a see below)..**.*
d0f0: 2a 20 7a 54 6f 6f 6c 74 69 70 20 69 73 20 61 6e * zTooltip is an
d100: 20 6f 70 74 69 6f 6e 61 6c 20 76 61 6c 75 65 20 optional value
d110: 66 6f 72 20 74 68 65 20 53 45 4c 45 43 54 27 73 for the SELECT's
d120: 20 74 69 74 6c 65 20 61 74 74 72 69 62 75 74 65 title attribute
d130: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 74 72 75 ..**.** The stru
d140: 63 74 75 72 65 20 6f 66 20 74 68 65 20 65 6d 69 cture of the emi
d150: 74 74 65 64 20 48 54 4d 4c 20 69 73 3a 0a 2a 2a tted HTML is:.**
d160: 0a 2a 2a 20 3c 64 69 76 20 63 6c 61 73 73 3d 27 .** <div class='
d170: 69 6e 70 75 74 2d 77 69 74 68 2d 6c 61 62 65 6c input-with-label
d180: 27 20 74 69 74 6c 65 3d 7b 7b 7a 54 6f 6f 6c 54 ' title={{zToolT
d190: 69 70 7d 7d 20 69 64 3d 7b 7b 7a 57 72 61 70 70 ip}} id={{zWrapp
d1a0: 65 72 49 64 7d 7d 3e 0a 2a 2a 20 20 20 3c 6c 61 erId}}>.** <la
d1b0: 62 65 6c 20 66 6f 72 3d 27 53 45 4c 45 43 54 20 bel for='SELECT
d1c0: 45 4c 45 4d 45 4e 54 20 49 44 27 3e 7b 7b 7a 4c ELEMENT ID'>{{zL
d1d0: 61 62 65 6c 7d 7d 3c 2f 6c 61 62 65 6c 3e 0a 2a abel}}</label>.*
d1e0: 2a 20 20 20 3c 73 65 6c 65 63 74 20 69 64 3d 27 * <select id='
d1f0: 52 41 4e 44 4f 4d 20 49 44 27 20 6e 61 6d 65 3d RANDOM ID' name=
d200: 7b 7b 7a 46 69 65 6c 64 4e 61 6d 65 7d 7d 3e 2e {{zFieldName}}>.
d210: 2e 2e 3c 2f 73 65 6c 65 63 74 3e 0a 2a 2a 20 3c ..</select>.** <
d220: 2f 64 69 76 3e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d /div>.**.** Exam
d230: 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 73 74 79 6c 65 ple:.**.** style
d240: 5f 73 65 6c 65 63 74 5f 6c 69 73 74 5f 69 6e 74 _select_list_int
d250: 28 22 6d 79 2d 67 72 61 70 65 73 22 2c 20 22 6d ("my-grapes", "m
d260: 79 5f 67 72 61 70 65 73 22 2c 20 22 47 72 61 70 y_grapes", "Grap
d270: 65 73 22 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 es",.**
d280: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 53 65 "Se
d290: 6c 65 63 74 20 74 68 65 20 6e 75 6d 62 65 72 20 lect the number
d2a0: 6f 66 20 67 72 61 70 65 73 22 2c 0a 2a 2a 20 20 of grapes",.**
d2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
d2c0: 20 20 20 20 20 61 74 6f 69 28 50 44 28 22 6d 79 atoi(PD("my
d2d0: 5f 66 69 65 6c 64 22 2c 22 30 22 29 29 2c 0a 2a _field","0")),.*
d2e0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 *
d2f0: 20 20 20 20 20 20 20 20 22 22 2c 20 31 2c 20 22 "", 1, "
d300: 32 22 2c 20 32 2c 20 22 54 68 72 65 65 22 2c 20 2", 2, "Three",
d310: 33 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 3,.**
d320: 20 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c NULL
d330: 29 3b 0a 2a 2a 0a 2a 2f 0a 76 6f 69 64 20 73 74 );.**.*/.void st
d340: 79 6c 65 5f 73 65 6c 65 63 74 5f 6c 69 73 74 5f yle_select_list_
d350: 69 6e 74 28 63 6f 6e 73 74 20 63 68 61 72 20 2a int(const char *
d360: 20 7a 57 72 61 70 70 65 72 49 64 2c 0a 20 20 20 zWrapperId,.
d370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
d380: 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 const ch
d390: 61 72 20 2a 7a 46 69 65 6c 64 4e 61 6d 65 2c 20 ar *zFieldName,
d3a0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 20 7a 4c 61 const char * zLa
d3b0: 62 65 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 bel,.
d3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
d3d0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 20 7a 54 6f const char * zTo
d3e0: 6f 6c 54 69 70 2c 20 69 6e 74 20 73 65 6c 65 63 olTip, int selec
d3f0: 74 65 64 56 61 6c 2c 0a 20 20 20 20 20 20 20 20 tedVal,.
d400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
d410: 20 20 20 2e 2e 2e 20 29 7b 0a 20 20 63 68 61 72 ... ){. char
d420: 20 2a 20 7a 4c 61 62 65 6c 49 44 20 3d 20 73 74 * zLabelID = st
d430: 79 6c 65 5f 6e 65 78 74 5f 69 6e 70 75 74 5f 69 yle_next_input_i
d440: 64 28 29 3b 0a 20 20 76 61 5f 6c 69 73 74 20 76 d();. va_list v
d450: 61 72 67 73 3b 0a 0a 20 20 76 61 5f 73 74 61 72 args;.. va_star
d460: 74 28 76 61 72 67 73 2c 73 65 6c 65 63 74 65 64 t(vargs,selected
d470: 56 61 6c 29 3b 0a 20 20 43 58 28 22 3c 64 69 76 Val);. CX("<div
d480: 20 63 6c 61 73 73 3d 27 69 6e 70 75 74 2d 77 69 class='input-wi
d490: 74 68 2d 6c 61 62 65 6c 27 22 29 3b 0a 20 20 69 th-label'");. i
d4a0: 66 28 7a 54 6f 6f 6c 54 69 70 20 26 26 20 2a 7a f(zToolTip && *z
d4b0: 54 6f 6f 6c 54 69 70 29 7b 0a 20 20 20 20 43 58 ToolTip){. CX
d4c0: 28 22 20 74 69 74 6c 65 3d 27 25 68 27 22 2c 7a (" title='%h'",z
d4d0: 54 6f 6f 6c 54 69 70 29 3b 0a 20 20 7d 0a 20 20 ToolTip);. }.
d4e0: 69 66 28 7a 57 72 61 70 70 65 72 49 64 20 26 26 if(zWrapperId &&
d4f0: 20 2a 7a 57 72 61 70 70 65 72 49 64 29 7b 0a 20 *zWrapperId){.
d500: 20 20 20 43 58 28 22 20 69 64 3d 27 25 73 27 22 CX(" id='%s'"
d510: 2c 7a 57 72 61 70 70 65 72 49 64 29 3b 0a 20 20 ,zWrapperId);.
d520: 7d 0a 20 20 43 58 28 22 3e 22 29 3b 0a 20 20 69 }. CX(">");. i
d530: 66 28 7a 4c 61 62 65 6c 20 26 26 20 2a 7a 4c 61 f(zLabel && *zLa
d540: 62 65 6c 29 7b 0a 20 20 20 20 43 58 28 22 3c 6c bel){. CX("<l
d550: 61 62 65 6c 20 66 6f 72 3d 27 25 73 27 3e 25 68 abel for='%s'>%h
d560: 3c 2f 6c 61 62 65 6c 3e 22 2c 20 7a 4c 61 62 65 </label>", zLabe
d570: 6c 49 44 2c 20 7a 4c 61 62 65 6c 29 3b 0a 20 20 lID, zLabel);.
d580: 7d 0a 20 20 43 58 28 22 3c 73 65 6c 65 63 74 20 }. CX("<select
d590: 6e 61 6d 65 3d 27 25 73 27 20 69 64 3d 27 25 73 name='%s' id='%s
d5a0: 27 3e 22 2c 7a 46 69 65 6c 64 4e 61 6d 65 2c 20 '>",zFieldName,
d5b0: 7a 4c 61 62 65 6c 49 44 29 3b 0a 20 20 77 68 69 zLabelID);. whi
d5c0: 6c 65 28 31 29 7b 0a 20 20 20 20 63 6f 6e 73 74 le(1){. const
d5d0: 20 63 68 61 72 20 2a 20 7a 4f 70 74 69 6f 6e 20 char * zOption
d5e0: 3d 20 76 61 5f 61 72 67 28 76 61 72 67 73 2c 63 = va_arg(vargs,c
d5f0: 68 61 72 20 2a 29 3b 0a 20 20 20 20 69 6e 74 20 har *);. int
d600: 76 3b 0a 20 20 20 20 69 66 28 4e 55 4c 4c 3d 3d v;. if(NULL==
d610: 7a 4f 70 74 69 6f 6e 29 7b 0a 20 20 20 20 20 20 zOption){.
d620: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 break;. }.
d630: 20 76 20 3d 20 76 61 5f 61 72 67 28 76 61 72 67 v = va_arg(varg
d640: 73 2c 69 6e 74 29 3b 0a 20 20 20 20 43 58 28 22 s,int);. CX("
d650: 3c 6f 70 74 69 6f 6e 20 76 61 6c 75 65 3d 27 25 <option value='%
d660: 64 27 25 73 3e 22 2c 0a 20 20 20 20 20 20 20 20 d'%s>",.
d670: 20 76 2c 20 76 3d 3d 73 65 6c 65 63 74 65 64 56 v, v==selectedV
d680: 61 6c 20 3f 20 22 20 73 65 6c 65 63 74 65 64 22 al ? " selected"
d690: 20 3a 20 22 22 29 3b 0a 20 20 20 20 69 66 28 2a : "");. if(*
d6a0: 7a 4f 70 74 69 6f 6e 29 7b 0a 20 20 20 20 20 20 zOption){.
d6b0: 43 58 28 22 25 73 22 2c 20 7a 4f 70 74 69 6f 6e CX("%s", zOption
d6c0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 );. }else{.
d6d0: 20 20 20 20 43 58 28 22 25 64 22 2c 76 29 3b 0a CX("%d",v);.
d6e0: 20 20 20 20 7d 0a 20 20 20 20 43 58 28 22 3c 2f }. CX("</
d6f0: 6f 70 74 69 6f 6e 3e 5c 6e 22 29 3b 0a 20 20 7d option>\n");. }
d700: 0a 20 20 43 58 28 22 3c 2f 73 65 6c 65 63 74 3e . CX("</select>
d710: 5c 6e 22 29 3b 0a 20 20 43 58 28 22 3c 2f 64 69 \n");. CX("</di
d720: 76 3e 5c 6e 22 29 3b 0a 20 20 76 61 5f 65 6e 64 v>\n");. va_end
d730: 28 76 61 72 67 73 29 3b 0a 20 20 66 6f 73 73 69 (vargs);. fossi
d740: 6c 5f 66 72 65 65 28 7a 4c 61 62 65 6c 49 44 29 l_free(zLabelID)
d750: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43 ;.}../*.** The C
d760: 2d 73 74 72 69 6e 67 20 63 6f 75 6e 74 65 72 70 -string counterp
d770: 61 72 74 20 6f 66 20 73 74 79 6c 65 5f 73 65 6c art of style_sel
d780: 65 63 74 5f 6c 69 73 74 5f 69 6e 74 28 29 2c 20 ect_list_int(),
d790: 74 68 69 73 20 76 61 72 69 61 6e 74 0a 2a 2a 20 this variant.**
d7a0: 64 69 66 66 65 72 73 20 6f 6e 6c 79 20 69 6e 20 differs only in
d7b0: 74 68 61 74 20 69 74 73 20 76 61 72 69 61 64 69 that its variadi
d7c0: 63 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20 c arguments are
d7d0: 43 2d 73 74 72 69 6e 67 73 20 69 6e 20 70 61 69 C-strings in pai
d7e0: 72 73 0a 2a 2a 20 6f 66 20 28 6f 70 74 69 6f 6e rs.** of (option
d7f0: 4c 61 62 65 6c 2c 20 6f 70 74 69 6f 6e 56 61 6c Label, optionVal
d800: 75 65 29 2e 20 49 66 20 61 20 67 69 76 65 6e 20 ue). If a given
d810: 6f 70 74 69 6f 6e 4c 61 62 65 6c 20 69 73 20 61 optionLabel is a
d820: 6e 20 65 6d 70 74 79 0a 2a 2a 20 73 74 72 69 6e n empty.** strin
d830: 67 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e g, the correspon
d840: 64 69 6e 67 20 6f 70 74 69 6f 6e 56 61 6c 75 65 ding optionValue
d850: 20 69 73 20 75 73 65 64 20 61 73 20 69 74 73 20 is used as its
d860: 6c 61 62 65 6c 2e 20 49 66 20 61 6e 79 0a 2a 2a label. If any.**
d870: 20 67 69 76 65 6e 20 76 61 6c 75 65 20 6d 61 74 given value mat
d880: 63 68 65 73 20 7a 53 65 6c 65 63 74 65 64 56 61 ches zSelectedVa
d890: 6c 2c 20 74 68 61 74 20 6f 70 74 69 6f 6e 20 67 l, that option g
d8a0: 65 74 73 20 70 72 65 73 65 6c 65 63 74 65 64 2e ets preselected.
d8b0: 20 49 66 0a 2a 2a 20 6e 6f 20 6f 70 74 69 6f 6e If.** no option
d8c0: 73 20 6d 61 74 63 68 20 7a 53 65 6c 65 63 74 65 s match zSelecte
d8d0: 64 56 61 6c 20 74 68 65 6e 20 74 68 65 20 66 69 dVal then the fi
d8e0: 72 73 74 20 65 6e 74 72 79 20 69 73 20 73 65 6c rst entry is sel
d8f0: 65 63 74 65 64 20 62 79 0a 2a 2a 20 64 65 66 61 ected by.** defa
d900: 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 6f ult..**.** Any o
d910: 66 20 28 7a 57 72 61 70 70 65 72 49 64 2c 20 7a f (zWrapperId, z
d920: 54 6f 6f 6c 74 69 70 2c 20 7a 53 65 6c 65 63 74 Tooltip, zSelect
d930: 65 64 56 61 6c 29 20 6d 61 79 20 62 65 20 4e 55 edVal) may be NU
d940: 4c 4c 20 6f 72 20 65 6d 70 74 79 2e 0a 2a 2a 0a LL or empty..**.
d950: 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a ** Example:.**.*
d960: 2a 20 73 74 79 6c 65 5f 73 65 6c 65 63 74 5f 6c * style_select_l
d970: 69 73 74 5f 73 74 72 28 22 6d 79 2d 67 72 61 70 ist_str("my-grap
d980: 65 73 22 2c 20 22 6d 79 5f 67 72 61 70 65 73 22 es", "my_grapes"
d990: 2c 20 22 47 72 61 70 65 73 22 2c 0a 2a 2a 20 20 , "Grapes",.**
d9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
d9b0: 20 20 20 20 22 53 65 6c 65 63 74 20 74 68 65 20 "Select the
d9c0: 6e 75 6d 62 65 72 20 6f 66 20 67 72 61 70 65 73 number of grapes
d9d0: 22 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 ",.**
d9e0: 20 20 20 20 20 20 20 20 20 20 20 20 50 28 22 6d P("m
d9f0: 79 5f 66 69 65 6c 64 22 29 2c 0a 2a 2a 20 20 20 y_field"),.**
da00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
da10: 20 20 20 20 22 31 22 2c 20 22 4f 6e 65 22 2c 20 "1", "One",
da20: 22 32 22 2c 20 22 54 77 6f 22 2c 20 22 22 2c 20 "2", "Two", "",
da30: 22 33 22 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 "3",.**
da40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4e 55 NU
da50: 4c 4c 29 3b 0a 2a 2f 0a 76 6f 69 64 20 73 74 79 LL);.*/.void sty
da60: 6c 65 5f 73 65 6c 65 63 74 5f 6c 69 73 74 5f 73 le_select_list_s
da70: 74 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 20 tr(const char *
da80: 7a 57 72 61 70 70 65 72 49 64 2c 0a 20 20 20 20 zWrapperId,.
da90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
daa0: 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 const cha
dab0: 72 20 2a 7a 46 69 65 6c 64 4e 61 6d 65 2c 20 63 r *zFieldName, c
dac0: 6f 6e 73 74 20 63 68 61 72 20 2a 20 7a 4c 61 62 onst char * zLab
dad0: 65 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 el,.
dae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 c
daf0: 6f 6e 73 74 20 63 68 61 72 20 2a 20 7a 54 6f 6f onst char * zToo
db00: 6c 54 69 70 2c 20 63 68 61 72 20 63 6f 6e 73 74 lTip, char const
db10: 20 2a 20 7a 53 65 6c 65 63 74 65 64 56 61 6c 2c * zSelectedVal,
db20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
db30: 20 20 20 20 20 20 20 20 20 20 20 20 2e 2e 2e 20 ...
db40: 29 7b 0a 20 20 63 68 61 72 20 2a 20 7a 4c 61 62 ){. char * zLab
db50: 65 6c 49 44 20 3d 20 73 74 79 6c 65 5f 6e 65 78 elID = style_nex
db60: 74 5f 69 6e 70 75 74 5f 69 64 28 29 3b 0a 20 20 t_input_id();.
db70: 76 61 5f 6c 69 73 74 20 76 61 72 67 73 3b 0a 0a va_list vargs;..
db80: 20 20 76 61 5f 73 74 61 72 74 28 76 61 72 67 73 va_start(vargs
db90: 2c 7a 53 65 6c 65 63 74 65 64 56 61 6c 29 3b 0a ,zSelectedVal);.
dba0: 20 20 69 66 28 21 7a 53 65 6c 65 63 74 65 64 56 if(!zSelectedV
dbb0: 61 6c 29 7b 0a 20 20 20 20 7a 53 65 6c 65 63 74 al){. zSelect
dbc0: 65 64 56 61 6c 20 3d 20 5f 5f 46 49 4c 45 5f 5f edVal = __FILE__
dbd0: 2f 2a 73 6f 6d 65 20 73 74 72 69 6e 67 20 77 65 /*some string we
dbe0: 27 6c 6c 20 6e 65 76 65 72 20 6d 61 74 63 68 2a 'll never match*
dbf0: 2f 3b 0a 20 20 7d 0a 20 20 43 58 28 22 3c 64 69 /;. }. CX("<di
dc00: 76 20 63 6c 61 73 73 3d 27 69 6e 70 75 74 2d 77 v class='input-w
dc10: 69 74 68 2d 6c 61 62 65 6c 27 22 29 3b 0a 20 20 ith-label'");.
dc20: 69 66 28 7a 54 6f 6f 6c 54 69 70 20 26 26 20 2a if(zToolTip && *
dc30: 7a 54 6f 6f 6c 54 69 70 29 7b 0a 20 20 20 20 43 zToolTip){. C
dc40: 58 28 22 20 74 69 74 6c 65 3d 27 25 68 27 22 2c X(" title='%h'",
dc50: 7a 54 6f 6f 6c 54 69 70 29 3b 0a 20 20 7d 0a 20 zToolTip);. }.
dc60: 20 69 66 28 7a 57 72 61 70 70 65 72 49 64 20 26 if(zWrapperId &
dc70: 26 20 2a 7a 57 72 61 70 70 65 72 49 64 29 7b 0a & *zWrapperId){.
dc80: 20 20 20 20 43 58 28 22 20 69 64 3d 27 25 73 27 CX(" id='%s'
dc90: 22 2c 7a 57 72 61 70 70 65 72 49 64 29 3b 0a 20 ",zWrapperId);.
dca0: 20 7d 0a 20 20 43 58 28 22 3e 22 29 3b 0a 20 20 }. CX(">");.
dcb0: 69 66 28 7a 4c 61 62 65 6c 20 26 26 20 2a 7a 4c if(zLabel && *zL
dcc0: 61 62 65 6c 29 7b 0a 20 20 20 20 43 58 28 22 3c abel){. CX("<
dcd0: 6c 61 62 65 6c 20 66 6f 72 3d 27 25 73 27 3e 25 label for='%s'>%
dce0: 68 3c 2f 6c 61 62 65 6c 3e 22 2c 20 7a 4c 61 62 h</label>", zLab
dcf0: 65 6c 49 44 2c 20 7a 4c 61 62 65 6c 29 3b 0a 20 elID, zLabel);.
dd00: 20 7d 0a 20 20 43 58 28 22 3c 73 65 6c 65 63 74 }. CX("<select
dd10: 20 6e 61 6d 65 3d 27 25 73 27 20 69 64 3d 27 25 name='%s' id='%
dd20: 73 27 3e 22 2c 7a 46 69 65 6c 64 4e 61 6d 65 2c s'>",zFieldName,
dd30: 20 7a 4c 61 62 65 6c 49 44 29 3b 0a 20 20 77 68 zLabelID);. wh
dd40: 69 6c 65 28 31 29 7b 0a 20 20 20 20 63 6f 6e 73 ile(1){. cons
dd50: 74 20 63 68 61 72 20 2a 20 7a 4c 61 62 65 6c 20 t char * zLabel
dd60: 3d 20 76 61 5f 61 72 67 28 76 61 72 67 73 2c 63 = va_arg(vargs,c
dd70: 68 61 72 20 2a 29 3b 0a 20 20 20 20 63 6f 6e 73 har *);. cons
dd80: 74 20 63 68 61 72 20 2a 20 7a 56 61 6c 3b 0a 20 t char * zVal;.
dd90: 20 20 20 69 66 28 4e 55 4c 4c 3d 3d 7a 4c 61 62 if(NULL==zLab
dda0: 65 6c 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b el){. break
ddb0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 56 61 6c ;. }. zVal
ddc0: 20 3d 20 76 61 5f 61 72 67 28 76 61 72 67 73 2c = va_arg(vargs,
ddd0: 63 68 61 72 20 2a 29 3b 0a 20 20 20 20 43 58 28 char *);. CX(
dde0: 22 3c 6f 70 74 69 6f 6e 20 76 61 6c 75 65 3d 27 "<option value='
ddf0: 25 54 27 25 73 3e 22 2c 0a 20 20 20 20 20 20 20 %T'%s>",.
de00: 7a 56 61 6c 2c 20 30 3d 3d 66 6f 73 73 69 6c 5f zVal, 0==fossil_
de10: 73 74 72 63 6d 70 28 7a 56 61 6c 2c 20 7a 53 65 strcmp(zVal, zSe
de20: 6c 65 63 74 65 64 56 61 6c 29 20 3f 20 22 20 73 lectedVal) ? " s
de30: 65 6c 65 63 74 65 64 22 20 3a 20 22 22 29 3b 0a elected" : "");.
de40: 20 20 20 20 69 66 28 2a 7a 4c 61 62 65 6c 29 7b if(*zLabel){
de50: 0a 20 20 20 20 20 20 43 58 28 22 25 73 22 2c 20 . CX("%s",
de60: 7a 4c 61 62 65 6c 29 3b 0a 20 20 20 20 7d 65 6c zLabel);. }el
de70: 73 65 7b 0a 20 20 20 20 20 20 43 58 28 22 25 68 se{. CX("%h
de80: 22 2c 7a 56 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 ",zVal);. }.
de90: 20 20 20 43 58 28 22 3c 2f 6f 70 74 69 6f 6e 3e CX("</option>
dea0: 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 43 58 28 22 \n");. }. CX("
deb0: 3c 2f 73 65 6c 65 63 74 3e 5c 6e 22 29 3b 0a 20 </select>\n");.
dec0: 20 43 58 28 22 3c 2f 64 69 76 3e 5c 6e 22 29 3b CX("</div>\n");
ded0: 0a 20 20 76 61 5f 65 6e 64 28 76 61 72 67 73 29 . va_end(vargs)
dee0: 3b 0a 20 20 66 6f 73 73 69 6c 5f 66 72 65 65 28 ;. fossil_free(
def0: 7a 4c 61 62 65 6c 49 44 29 3b 0a 7d 0a 0a 2f 2a zLabelID);.}../*
df00: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20 3c .** Generate a <
df10: 73 63 72 69 70 74 3e 20 77 69 74 68 20 61 6e 20 script> with an
df20: 61 70 70 72 6f 70 72 69 61 74 65 20 6e 6f 6e 63 appropriate nonc
df30: 65 2e 0a 2a 2a 0a 2a 2a 20 7a 4f 72 69 67 69 6e e..**.** zOrigin
df40: 20 61 6e 64 20 69 4c 69 6e 65 20 61 72 65 20 74 and iLine are t
df50: 68 65 20 73 6f 75 72 63 65 20 63 6f 64 65 20 66 he source code f
df60: 69 6c 65 6e 61 6d 65 20 61 6e 64 20 6c 69 6e 65 ilename and line
df70: 20 6e 75 6d 62 65 72 0a 2a 2a 20 74 68 61 74 20 number.** that
df80: 67 65 6e 65 72 61 74 65 64 20 74 68 69 73 20 72 generated this r
df90: 65 71 75 65 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 equest..*/.void
dfa0: 73 74 79 6c 65 5f 73 63 72 69 70 74 5f 62 65 67 style_script_beg
dfb0: 69 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a in(const char *z
dfc0: 4f 72 69 67 69 6e 2c 20 69 6e 74 20 69 4c 69 6e Origin, int iLin
dfd0: 65 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 e){. const char
dfe0: 20 2a 7a 3b 0a 20 20 66 6f 72 28 7a 3d 7a 4f 72 *z;. for(z=zOr
dff0: 69 67 69 6e 3b 20 7a 5b 30 5d 21 3d 30 3b 20 7a igin; z[0]!=0; z
e000: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a 5b 30 ++){. if( z[0
e010: 5d 3d 3d 27 2f 27 20 7c 7c 20 7a 5b 30 5d 3d 3d ]=='/' || z[0]==
e020: 27 5c 5c 27 20 29 7b 0a 20 20 20 20 20 20 7a 4f '\\' ){. zO
e030: 72 69 67 69 6e 20 3d 20 7a 2b 31 3b 0a 20 20 20 rigin = z+1;.
e040: 20 7d 0a 20 20 7d 0a 20 20 43 58 28 22 3c 73 63 }. }. CX("<sc
e050: 72 69 70 74 20 6e 6f 6e 63 65 3d 27 25 73 27 3e ript nonce='%s'>
e060: 2f 2a 20 25 73 3a 25 64 20 2a 2f 5c 6e 22 2c 20 /* %s:%d */\n",
e070: 73 74 79 6c 65 5f 6e 6f 6e 63 65 28 29 2c 20 7a style_nonce(), z
e080: 4f 72 69 67 69 6e 2c 20 69 4c 69 6e 65 29 3b 0a Origin, iLine);.
e090: 7d 0a 0a 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 }../* Generate t
e0a0: 68 65 20 63 6c 6f 73 69 6e 67 20 3c 2f 73 63 72 he closing </scr
e0b0: 69 70 74 3e 20 74 61 67 0a 2a 2f 0a 76 6f 69 64 ipt> tag.*/.void
e0c0: 20 73 74 79 6c 65 5f 73 63 72 69 70 74 5f 65 6e style_script_en
e0d0: 64 28 76 6f 69 64 29 7b 0a 20 20 43 58 28 22 3c d(void){. CX("<
e0e0: 2f 73 63 72 69 70 74 3e 5c 6e 22 29 3b 0a 7d 0a /script>\n");.}.
e0f0: 0a 2f 2a 0a 2a 2a 20 45 6d 69 74 73 20 61 20 4e ./*.** Emits a N
e100: 4f 53 43 52 49 50 54 20 74 61 67 20 77 69 74 68 OSCRIPT tag with
e110: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 an error messag
e120: 65 20 73 74 61 74 69 6e 67 20 74 68 61 74 20 4a e stating that J
e130: 53 20 69 73 0a 2a 2a 20 72 65 71 75 69 72 65 64 S is.** required
e140: 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 for the current
e150: 20 70 61 67 65 2e 20 54 68 69 73 20 22 73 68 6f page. This "sho
e160: 75 6c 64 22 20 62 65 20 63 61 6c 6c 65 64 20 6e uld" be called n
e170: 65 61 72 20 74 68 65 20 74 6f 70 0a 2a 2a 20 6f ear the top.** o
e180: 66 20 70 61 67 65 73 20 77 68 69 63 68 20 2a 72 f pages which *r
e190: 65 71 75 69 72 65 2a 20 4a 53 2e 20 54 68 65 20 equire* JS. The
e1a0: 69 6e 6e 65 72 20 44 49 56 20 68 61 73 20 74 68 inner DIV has th
e1b0: 65 20 43 53 53 20 63 6c 61 73 73 0a 2a 2a 20 27 e CSS class.** '
e1c0: 65 72 72 6f 72 27 20 61 6e 64 20 63 61 6e 20 62 error' and can b
e1d0: 65 20 73 74 79 6c 65 64 20 76 69 61 20 61 20 28 e styled via a (
e1e0: 6e 6f 73 63 72 69 70 74 20 3e 20 2e 65 72 72 6f noscript > .erro
e1f0: 72 29 20 43 53 53 20 73 65 6c 65 63 74 6f 72 2e r) CSS selector.
e200: 0a 2a 2f 0a 76 6f 69 64 20 73 74 79 6c 65 5f 65 .*/.void style_e
e210: 6d 69 74 5f 6e 6f 73 63 72 69 70 74 5f 66 6f 72 mit_noscript_for
e220: 5f 6a 73 5f 70 61 67 65 28 76 6f 69 64 29 7b 0a _js_page(void){.
e230: 20 20 43 58 28 22 3c 6e 6f 73 63 72 69 70 74 3e CX("<noscript>
e240: 3c 64 69 76 20 63 6c 61 73 73 3d 27 65 72 72 6f <div class='erro
e250: 72 27 3e 22 0a 20 20 20 20 20 22 54 68 69 73 20 r'>". "This
e260: 70 61 67 65 20 72 65 71 75 69 72 65 73 20 4a 61 page requires Ja
e270: 76 61 53 63 72 69 70 74 20 28 45 53 32 30 31 35 vaScript (ES2015
e280: 2c 20 61 2e 6b 2e 61 2e 20 45 53 36 2c 20 6f 72 , a.k.a. ES6, or
e290: 20 6e 65 77 65 72 29 2e 22 0a 20 20 20 20 20 22 newer).". "
e2a0: 3c 2f 64 69 76 3e 3c 2f 6e 6f 73 63 72 69 70 74 </div></noscript
e2b0: 3e 22 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 45 >");.}../*.** SE
e2c0: 54 54 49 4e 47 3a 20 72 6f 62 6f 74 73 2d 74 78 TTING: robots-tx
e2d0: 74 20 77 69 64 74 68 3d 37 30 20 62 6c 6f 63 6b t width=70 block
e2e0: 2d 74 65 78 74 20 6b 65 65 70 2d 65 6d 70 74 79 -text keep-empty
e2f0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73 65 74 74 .**.** This sett
e300: 69 6e 67 20 69 73 20 74 68 65 20 6f 76 65 72 72 ing is the overr
e310: 69 64 65 20 76 61 6c 75 65 20 66 6f 72 20 74 68 ide value for th
e320: 65 20 2f 72 6f 62 6f 74 73 2e 74 78 74 20 66 69 e /robots.txt fi
e330: 6c 65 20 74 68 61 74 0a 2a 2a 20 46 6f 73 73 69 le that.** Fossi
e340: 6c 20 72 65 74 75 72 6e 73 20 77 68 65 6e 20 72 l returns when r
e350: 75 6e 20 61 73 20 61 20 73 74 61 6e 64 2d 61 6c un as a stand-al
e360: 6f 6e 65 20 73 65 72 76 65 72 20 66 6f 72 20 61 one server for a
e370: 20 64 6f 6d 61 69 6e 2e 20 20 41 73 0a 2a 2a 20 domain. As.**
e380: 46 6f 73 73 69 6c 20 69 73 20 73 65 6c 64 6f 6d Fossil is seldom
e390: 20 72 75 6e 20 61 73 20 61 20 73 74 61 6e 64 2d run as a stand-
e3a0: 61 6c 6f 6e 65 20 73 65 72 76 65 72 20 28 61 6e alone server (an
e3b0: 64 20 69 73 20 6d 6f 72 65 20 63 6f 6d 6d 6f 6e d is more common
e3c0: 6c 79 0a 2a 2a 20 64 65 70 6c 6f 79 65 64 20 61 ly.** deployed a
e3d0: 73 20 61 20 43 47 49 20 6f 72 20 53 43 47 49 20 s a CGI or SCGI
e3e0: 6f 72 20 62 65 68 69 6e 64 20 61 20 72 65 76 65 or behind a reve
e3f0: 72 73 65 20 70 72 6f 78 79 29 20 74 68 69 73 20 rse proxy) this
e400: 73 65 74 74 69 6e 67 0a 2a 2a 20 72 61 72 65 6c setting.** rarel
e410: 79 20 6e 65 65 64 65 64 2e 20 20 41 20 72 65 61 y needed. A rea
e420: 73 6f 6e 61 62 6c 65 20 64 65 66 61 75 6c 74 20 sonable default
e430: 72 6f 62 6f 74 73 2e 74 78 74 20 69 73 20 73 65 robots.txt is se
e440: 6e 74 20 69 66 20 74 68 69 73 0a 2a 2a 20 73 65 nt if this.** se
e450: 74 74 69 6e 67 20 69 73 20 65 6d 70 74 79 2e 0a tting is empty..
e460: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 57 45 42 50 41 47 */../*.** WEBPAG
e470: 45 3a 20 72 6f 62 6f 74 73 2e 74 78 74 0a 2a 2a E: robots.txt.**
e480: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 65 78 74 2f .** Return text/
e490: 70 6c 61 69 6e 20 77 68 69 63 68 20 69 73 20 74 plain which is t
e4a0: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 he content of th
e4b0: 65 20 22 72 6f 62 6f 74 73 2d 74 78 74 22 20 73 e "robots-txt" s
e4c0: 65 74 74 69 6e 67 2c 20 69 66 0a 2a 2a 20 73 75 etting, if.** su
e4d0: 63 68 20 61 20 73 65 74 74 69 6e 67 20 65 78 69 ch a setting exi
e4e0: 73 74 73 20 61 6e 64 20 69 73 20 6e 6f 6e 2d 65 sts and is non-e
e4f0: 6d 70 74 79 2e 20 20 4f 72 20 63 6f 6e 73 74 72 mpty. Or constr
e500: 75 63 74 20 61 6e 20 52 46 43 2d 39 33 30 39 20 uct an RFC-9309
e510: 63 6f 6d 70 6c 61 69 6e 74 0a 2a 2a 20 72 6f 62 complaint.** rob
e520: 6f 74 73 2e 74 78 74 20 66 69 6c 65 20 61 6e 64 ots.txt file and
e530: 20 72 65 74 75 72 6e 20 74 68 61 74 20 69 66 20 return that if
e540: 74 68 65 72 65 20 69 73 20 6e 6f 74 20 22 72 6f there is not "ro
e550: 62 6f 74 73 2e 74 78 74 22 20 73 65 74 74 69 6e bots.txt" settin
e560: 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 g..**.** This is
e570: 20 75 73 65 66 75 6c 20 66 6f 72 20 72 6f 62 6f useful for robo
e580: 74 20 65 78 63 6c 75 73 69 6f 6e 20 69 6e 20 63 t exclusion in c
e590: 61 73 65 73 20 77 68 65 72 65 20 46 6f 73 73 69 ases where Fossi
e5a0: 6c 20 69 73 20 72 75 6e 20 61 73 20 61 0a 2a 2a l is run as a.**
e5b0: 20 73 74 61 6e 64 2d 61 6c 6f 6e 65 20 73 65 72 stand-alone ser
e5c0: 76 65 72 20 69 6e 20 69 74 73 20 6f 77 6e 20 64 ver in its own d
e5d0: 6f 6d 61 69 6e 2e 20 20 46 6f 72 20 74 68 65 20 omain. For the
e5e0: 6d 6f 72 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 more common case
e5f0: 20 77 68 65 72 65 0a 2a 2a 20 46 6f 73 73 69 6c where.** Fossil
e600: 20 69 73 20 72 75 6e 20 61 73 20 61 20 43 47 49 is run as a CGI
e610: 2c 20 6f 72 20 53 43 47 49 2c 20 6f 72 20 61 20 , or SCGI, or a
e620: 73 65 72 76 65 72 20 74 68 61 74 20 72 65 73 70 server that resp
e630: 6f 6e 64 69 6e 67 20 74 6f 20 61 20 72 65 76 65 onding to a reve
e640: 72 73 65 0a 2a 2a 20 70 72 6f 78 79 2c 20 74 68 rse.** proxy, th
e650: 65 20 72 65 74 75 72 6e 73 20 72 6f 62 6f 74 73 e returns robots
e660: 2e 74 78 74 20 66 69 6c 65 20 77 69 6c 6c 20 6e .txt file will n
e670: 6f 74 20 62 65 20 61 74 20 74 68 65 20 74 6f 70 ot be at the top
e680: 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 0a 2a 2a level of the.**
e690: 20 64 6f 6d 61 69 6e 2c 20 61 6e 64 20 73 6f 20 domain, and so
e6a0: 69 74 20 77 69 6c 6c 20 62 65 20 70 6f 69 6e 74 it will be point
e6b0: 6c 65 73 73 2e 0a 2a 2f 0a 76 6f 69 64 20 72 6f less..*/.void ro
e6c0: 62 6f 74 73 74 78 74 5f 70 61 67 65 28 76 6f 69 botstxt_page(voi
e6d0: 64 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 d){. const char
e6e0: 20 2a 7a 3b 0a 20 20 73 74 61 74 69 63 20 63 6f *z;. static co
e6f0: 6e 73 74 20 63 68 61 72 20 2a 7a 44 66 6c 74 20 nst char *zDflt
e700: 3d 20 0a 20 20 20 20 20 22 55 73 65 72 2d 61 67 = . "User-ag
e710: 65 6e 74 3a 20 2a 5c 6e 22 0a 20 20 20 20 20 22 ent: *\n". "
e720: 41 6c 6c 6f 77 3a 20 2f 64 6f 63 5c 6e 22 0a 20 Allow: /doc\n".
e730: 20 20 20 20 22 41 6c 6c 6f 77 3a 20 2f 68 6f 6d "Allow: /hom
e740: 65 5c 6e 22 0a 20 20 20 20 20 22 41 6c 6c 6f 77 e\n". "Allow
e750: 3a 20 2f 66 6f 72 75 6d 5c 6e 22 0a 20 20 20 20 : /forum\n".
e760: 20 22 41 6c 6c 6f 77 3a 20 2f 74 65 63 68 6e 6f "Allow: /techno
e770: 74 65 5c 6e 22 0a 20 20 20 20 20 22 41 6c 6c 6f te\n". "Allo
e780: 77 3a 20 2f 74 6b 74 76 69 65 77 5c 6e 22 0a 20 w: /tktview\n".
e790: 20 20 20 20 22 41 6c 6c 6f 77 3a 20 2f 77 69 6b "Allow: /wik
e7a0: 69 5c 6e 22 0a 20 20 20 20 20 22 41 6c 6c 6f 77 i\n". "Allow
e7b0: 3a 20 2f 75 76 2f 5c 6e 22 0a 20 20 20 20 20 22 : /uv/\n". "
e7c0: 41 6c 6c 6f 77 3a 20 2f 24 5c 6e 22 0a 20 20 20 Allow: /$\n".
e7d0: 20 20 22 44 69 73 61 6c 6c 6f 77 3a 20 2f 2a 5c "Disallow: /*\
e7e0: 6e 22 0a 20 20 3b 0a 20 20 7a 20 3d 20 64 62 5f n". ;. z = db_
e7f0: 67 65 74 28 22 72 6f 62 6f 74 73 2d 74 78 74 22 get("robots-txt"
e800: 2c 7a 44 66 6c 74 29 3b 0a 20 20 63 67 69 5f 73 ,zDflt);. cgi_s
e810: 65 74 5f 63 6f 6e 74 65 6e 74 5f 74 79 70 65 28 et_content_type(
e820: 22 74 65 78 74 2f 70 6c 61 69 6e 22 29 3b 0a 20 "text/plain");.
e830: 20 63 67 69 5f 61 70 70 65 6e 64 5f 63 6f 6e 74 cgi_append_cont
e840: 65 6e 74 28 7a 2c 20 2d 31 29 3b 0a 7d 0a ent(z, -1);.}.