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 6f 6f 74 lling style_foot
0460: 65 72 28 29 2e 20 20 54 68 65 20 73 74 79 6c 65 er(). The style
0470: 5f 66 6f 6f 74 65 72 28 29 20 72 6f 75 74 69 6e _footer() routin
0480: 65 0a 2a 2a 20 77 69 6c 6c 20 67 65 6e 65 72 61 e.** will genera
0490: 74 65 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 te the appropria
04a0: 74 65 20 48 54 4d 4c 20 74 65 78 74 20 6a 75 73 te HTML text jus
04b0: 74 20 62 65 6c 6f 77 20 74 68 65 20 6d 61 69 6e t below the main
04c0: 0a 2a 2a 20 6d 65 6e 75 2e 0a 2a 2f 0a 73 74 61 .** menu..*/.sta
04d0: 74 69 63 20 73 74 72 75 63 74 20 53 75 62 6d 65 tic struct Subme
04e0: 6e 75 20 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 nu {. const cha
04f0: 72 20 2a 7a 4c 61 62 65 6c 3b 20 20 20 20 20 20 r *zLabel;
0500: 20 20 2f 2a 20 42 75 74 74 6f 6e 20 6c 61 62 65 /* Button labe
0510: 6c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 l */. const cha
0520: 72 20 2a 7a 4c 69 6e 6b 3b 20 20 20 20 20 20 20 r *zLink;
0530: 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 69 /* Jump to thi
0540: 73 20 6c 69 6e 6b 20 77 68 65 6e 20 62 75 74 74 s link when butt
0550: 6f 6e 20 69 73 20 70 72 65 73 73 65 64 20 2a 2f on is pressed */
0560: 0a 7d 20 61 53 75 62 6d 65 6e 75 5b 33 30 5d 3b .} aSubmenu[30];
0570: 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 53 75 62 .static int nSub
0580: 6d 65 6e 75 20 3d 20 30 3b 20 20 20 20 20 2f 2a menu = 0; /*
0590: 20 4e 75 6d 62 65 72 20 6f 66 20 62 75 74 74 6f Number of butto
05a0: 6e 73 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 ns */.static str
05b0: 75 63 74 20 53 75 62 6d 65 6e 75 43 74 72 6c 20 uct SubmenuCtrl
05c0: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a {. const char *
05d0: 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 zName;
05e0: 20 2f 2a 20 46 6f 72 6d 20 71 75 65 72 79 20 70 /* Form query p
05f0: 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20 63 6f arameter */. co
0600: 6e 73 74 20 63 68 61 72 20 2a 7a 4c 61 62 65 6c nst char *zLabel
0610: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 ; /* La
0620: 62 65 6c 2e 20 20 4d 69 67 68 74 20 62 65 20 4e bel. Might be N
0630: 55 4c 4c 20 66 6f 72 20 46 46 5f 4d 55 4c 54 49 ULL for FF_MULTI
0640: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 */. unsigned c
0650: 68 61 72 20 65 54 79 70 65 3b 20 20 20 20 20 20 har eType;
0660: 20 20 20 2f 2a 20 46 46 5f 45 4e 54 52 59 2c 20 /* FF_ENTRY,
0670: 46 46 5f 4d 55 4c 54 49 2c 20 46 46 5f 43 48 45 FF_MULTI, FF_CHE
0680: 43 4b 42 4f 58 20 2a 2f 0a 20 20 75 6e 73 69 67 CKBOX */. unsig
0690: 6e 65 64 20 63 68 61 72 20 65 56 69 73 69 62 6c ned char eVisibl
06a0: 65 3b 20 20 20 20 20 20 2f 2a 20 53 54 59 4c 45 e; /* STYLE
06b0: 5f 4e 4f 52 4d 41 4c 20 6f 72 20 53 54 59 4c 45 _NORMAL or STYLE
06c0: 5f 44 49 53 41 42 4c 45 44 20 2a 2f 0a 20 20 73 _DISABLED */. s
06d0: 68 6f 72 74 20 69 6e 74 20 69 53 69 7a 65 3b 20 hort int iSize;
06e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 /* W
06f0: 69 64 74 68 20 66 6f 72 20 46 46 5f 45 4e 54 52 idth for FF_ENTR
0700: 59 2e 20 20 43 6f 75 6e 74 20 66 6f 72 20 46 46 Y. Count for FF
0710: 5f 4d 55 4c 54 49 20 2a 2f 0a 20 20 63 6f 6e 73 _MULTI */. cons
0720: 74 20 63 68 61 72 20 2a 63 6f 6e 73 74 20 2a 61 t char *const *a
0730: 7a 43 68 6f 69 63 65 3b 20 2f 2a 20 76 61 6c 75 zChoice; /* valu
0740: 65 2f 64 69 73 70 6c 61 79 20 70 61 69 72 73 20 e/display pairs
0750: 66 6f 72 20 46 46 5f 4d 55 4c 54 49 20 2a 2f 0a for FF_MULTI */.
0760: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 const char *zF
0770: 61 6c 73 65 3b 20 20 20 20 20 20 20 20 20 20 2f alse; /
0780: 2a 20 46 46 5f 42 49 4e 41 52 59 20 6c 61 62 65 * FF_BINARY labe
0790: 6c 20 77 68 65 6e 20 66 61 6c 73 65 20 2a 2f 0a l when false */.
07a0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4a const char *zJ
07b0: 53 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f S; /
07c0: 2a 20 4a 61 76 61 73 63 72 69 70 74 20 74 6f 20 * Javascript to
07d0: 72 75 6e 20 6f 6e 20 74 6f 67 67 6c 65 20 2a 2f run on toggle */
07e0: 0a 7d 20 61 53 75 62 6d 65 6e 75 43 74 72 6c 5b .} aSubmenuCtrl[
07f0: 32 30 5d 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 20];.static int
0800: 6e 53 75 62 6d 65 6e 75 43 74 72 6c 20 3d 20 30 nSubmenuCtrl = 0
0810: 3b 0a 23 64 65 66 69 6e 65 20 46 46 5f 45 4e 54 ;.#define FF_ENT
0820: 52 59 20 20 20 20 31 20 20 20 20 20 20 20 20 20 RY 1
0830: 20 2f 2a 20 54 65 78 74 20 65 6e 74 72 79 20 62 /* Text entry b
0840: 6f 78 20 2a 2f 0a 23 64 65 66 69 6e 65 20 46 46 ox */.#define FF
0850: 5f 4d 55 4c 54 49 20 20 20 20 32 20 20 20 20 20 _MULTI 2
0860: 20 20 20 20 20 2f 2a 20 43 6f 6d 62 6f 62 6f 78 /* Combobox
0870: 2e 20 20 4d 75 6c 74 69 70 6c 65 20 63 68 6f 69 . Multiple choi
0880: 63 65 73 2e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 ces. */.#define
0890: 46 46 5f 42 49 4e 41 52 59 20 20 20 33 20 20 20 FF_BINARY 3
08a0: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 72 6f /* Contro
08b0: 6c 20 66 6f 72 20 62 69 6e 61 72 79 20 71 75 65 l for binary que
08c0: 72 79 20 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a ry parameter */.
08d0: 23 64 65 66 69 6e 65 20 46 46 5f 43 48 45 43 4b #define FF_CHECK
08e0: 42 4f 58 20 34 20 20 20 20 20 20 20 20 20 20 2f BOX 4 /
08f0: 2a 20 43 68 65 63 6b 2d 62 6f 78 20 2a 2f 0a 0a * Check-box */..
0900: 23 69 66 20 49 4e 54 45 52 46 41 43 45 0a 23 64 #if INTERFACE.#d
0910: 65 66 69 6e 65 20 53 54 59 4c 45 5f 4e 4f 52 4d efine STYLE_NORM
0920: 41 4c 20 20 20 30 20 20 20 20 20 20 20 2f 2a 20 AL 0 /*
0930: 4e 6f 72 6d 61 6c 20 64 69 73 70 6c 61 79 20 6f Normal display o
0940: 66 20 63 6f 6e 74 72 6f 6c 20 2a 2f 0a 23 64 65 f control */.#de
0950: 66 69 6e 65 20 53 54 59 4c 45 5f 44 49 53 41 42 fine STYLE_DISAB
0960: 4c 45 44 20 31 20 20 20 20 20 20 20 2f 2a 20 43 LED 1 /* C
0970: 6f 6e 74 72 6f 6c 20 69 73 20 64 69 73 61 62 6c ontrol is disabl
0980: 65 64 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 ed */.#endif /*
0990: 49 4e 54 45 52 46 41 43 45 20 2a 2f 0a 0a 2f 2a INTERFACE */../*
09a0: 0a 2a 2a 20 52 65 6d 65 6d 62 65 72 20 74 68 61 .** Remember tha
09b0: 74 20 74 68 65 20 68 65 61 64 65 72 20 68 61 73 t the header has
09c0: 20 62 65 65 6e 20 67 65 6e 65 72 61 74 65 64 2e been generated.
09d0: 20 20 54 68 65 20 66 6f 6f 74 65 72 20 69 73 20 The footer is
09e0: 6f 6d 69 74 74 65 64 0a 2a 2a 20 69 66 20 61 6e omitted.** if an
09f0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 62 65 error occurs be
0a00: 66 6f 72 65 20 74 68 65 20 68 65 61 64 65 72 2e fore the header.
0a10: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 .*/.static int h
0a20: 65 61 64 65 72 48 61 73 42 65 65 6e 47 65 6e 65 eaderHasBeenGene
0a30: 72 61 74 65 64 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a rated = 0;../*.*
0a40: 2a 20 72 65 6d 65 6d 62 65 72 2c 20 69 66 20 61 * remember, if a
0a50: 20 73 69 64 65 62 6f 78 20 77 61 73 20 75 73 65 sidebox was use
0a60: 64 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 d.*/.static int
0a70: 73 69 64 65 62 6f 78 55 73 65 64 20 3d 20 30 3b sideboxUsed = 0;
0a80: 0a 0a 2f 2a 0a 2a 2a 20 41 64 2d 75 6e 69 74 20 ../*.** Ad-unit
0a90: 73 74 79 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 styles..*/.stati
0aa0: 63 20 75 6e 73 69 67 6e 65 64 20 61 64 55 6e 69 c unsigned adUni
0ab0: 74 46 6c 61 67 73 20 3d 20 30 3b 0a 0a 2f 2a 0a tFlags = 0;../*.
0ac0: 2a 2a 20 53 75 62 6d 65 6e 75 20 64 69 73 61 62 ** Submenu disab
0ad0: 6c 65 20 66 6c 61 67 0a 2a 2f 0a 73 74 61 74 69 le flag.*/.stati
0ae0: 63 20 69 6e 74 20 73 75 62 6d 65 6e 75 45 6e 61 c int submenuEna
0af0: 62 6c 65 20 3d 20 31 3b 0a 0a 2f 2a 0a 2a 2a 20 ble = 1;../*.**
0b00: 46 6c 61 67 73 20 66 6f 72 20 76 61 72 69 6f 75 Flags for variou
0b10: 73 20 6a 61 76 61 73 63 72 69 70 74 20 66 69 6c s javascript fil
0b20: 65 73 20 6e 65 65 64 65 64 20 70 72 69 6f 72 20 es needed prior
0b30: 74 6f 20 3c 2f 62 6f 64 79 3e 0a 2a 2f 0a 73 74 to </body>.*/.st
0b40: 61 74 69 63 20 69 6e 74 20 6e 65 65 64 48 72 65 atic int needHre
0b50: 66 4a 73 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a fJs = 0; /*
0b60: 20 68 72 65 66 2e 6a 73 20 2a 2f 0a 73 74 61 74 href.js */.stat
0b70: 69 63 20 69 6e 74 20 6e 65 65 64 53 6f 72 74 4a ic int needSortJ
0b80: 73 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 73 s = 0; /* s
0b90: 6f 72 74 74 61 62 6c 65 2e 6a 73 20 2a 2f 0a 73 orttable.js */.s
0ba0: 74 61 74 69 63 20 69 6e 74 20 6e 65 65 64 47 72 tatic int needGr
0bb0: 61 70 68 4a 73 20 3d 20 30 3b 20 20 20 20 20 2f aphJs = 0; /
0bc0: 2a 20 67 72 61 70 68 2e 6a 73 20 2a 2f 0a 73 74 * graph.js */.st
0bd0: 61 74 69 63 20 69 6e 74 20 6e 65 65 64 43 6f 70 atic int needCop
0be0: 79 42 74 6e 4a 73 20 3d 20 30 3b 20 20 20 2f 2a yBtnJs = 0; /*
0bf0: 20 63 6f 70 79 62 74 6e 2e 6a 73 20 2a 2f 0a 73 copybtn.js */.s
0c00: 74 61 74 69 63 20 69 6e 74 20 6e 65 65 64 41 63 tatic int needAc
0c10: 63 6f 72 64 69 6f 6e 4a 73 20 3d 20 30 3b 20 2f cordionJs = 0; /
0c20: 2a 20 61 63 63 6f 72 64 69 6f 6e 2e 6a 73 20 2a * accordion.js *
0c30: 2f 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 20 4a /../*.** Extra J
0c40: 53 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 65 S added to the e
0c50: 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 0a nd of the file..
0c60: 2a 2f 0a 73 74 61 74 69 63 20 42 6c 6f 62 20 62 */.static Blob b
0c70: 6c 6f 62 4f 6e 4c 6f 61 64 20 3d 20 42 4c 4f 42 lobOnLoad = BLOB
0c80: 5f 49 4e 49 54 49 41 4c 49 5a 45 52 3b 0a 0a 2f _INITIALIZER;../
0c90: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e *.** Generate an
0ca0: 64 20 72 65 74 75 72 6e 20 61 20 61 6e 63 68 6f d return a ancho
0cb0: 72 20 74 61 67 20 6c 69 6b 65 20 74 68 69 73 3a r tag like this:
0cc0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 3c 61 .**.** <a
0cd0: 20 68 72 65 66 3d 22 55 52 4c 22 3e 0a 2a 2a 20 href="URL">.**
0ce0: 20 6f 72 20 20 20 20 3c 61 20 69 64 3d 22 49 44 or <a id="ID
0cf0: 22 3e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 ">.**.** The for
0d00: 6d 20 6f 66 20 74 68 65 20 61 6e 63 68 6f 72 20 m of the anchor
0d10: 74 61 67 20 69 73 20 64 65 74 65 72 6d 69 6e 65 tag is determine
0d20: 64 20 62 79 20 74 68 65 20 67 2e 6a 61 76 61 73 d by the g.javas
0d30: 63 72 69 70 74 48 79 70 65 72 6c 69 6e 6b 0a 2a criptHyperlink.*
0d40: 2a 20 76 61 72 69 61 62 6c 65 2e 20 20 54 68 65 * variable. The
0d50: 20 68 72 65 66 3d 22 55 52 4c 22 20 66 6f 72 6d href="URL" form
0d60: 20 69 73 20 75 73 65 64 20 69 66 20 67 2e 6a 61 is used if g.ja
0d70: 76 61 73 63 72 69 70 74 48 79 70 65 72 6c 69 6e vascriptHyperlin
0d80: 6b 20 69 73 20 66 61 6c 73 65 2e 0a 2a 2a 20 49 k is false..** I
0d90: 66 20 67 2e 6a 61 76 61 73 63 72 69 70 74 48 79 f g.javascriptHy
0da0: 70 65 72 6c 69 6e 6b 20 69 73 20 74 72 75 65 20 perlink is true
0db0: 74 68 65 6e 20 74 68 65 0a 2a 2a 20 69 64 3d 22 then the.** id="
0dc0: 49 44 22 20 66 6f 72 6d 20 69 73 20 75 73 65 64 ID" form is used
0dd0: 20 61 6e 64 20 6a 61 76 61 73 63 72 69 70 74 20 and javascript
0de0: 69 73 20 67 65 6e 65 72 61 74 65 64 20 69 6e 20 is generated in
0df0: 74 68 65 20 66 6f 6f 74 65 72 20 74 6f 20 63 61 the footer to ca
0e00: 75 73 65 0a 2a 2a 20 68 72 65 66 20 76 61 6c 75 use.** href valu
0e10: 65 73 20 74 6f 20 62 65 20 69 6e 73 65 72 74 65 es to be inserte
0e20: 64 20 61 66 74 65 72 20 74 68 65 20 70 61 67 65 d after the page
0e30: 20 68 61 73 20 6c 6f 61 64 65 64 2e 20 20 49 66 has loaded. If
0e40: 0a 2a 2a 20 67 2e 70 65 72 6d 2e 48 69 73 74 6f .** g.perm.Histo
0e50: 72 79 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65 ry is false, the
0e60: 6e 20 74 68 65 20 3c 61 20 69 64 3d 22 49 44 22 n the <a id="ID"
0e70: 3e 20 66 6f 72 6d 20 69 73 20 73 74 69 6c 6c 0a > form is still.
0e80: 2a 2a 20 67 65 6e 65 72 61 74 65 64 20 62 75 74 ** generated but
0e90: 20 74 68 65 20 6a 61 76 61 73 63 72 69 70 74 20 the javascript
0ea0: 69 73 20 6e 6f 74 20 67 65 6e 65 72 61 74 65 64 is not generated
0eb0: 20 73 6f 20 74 68 65 20 6c 69 6e 6b 73 20 6e 65 so the links ne
0ec0: 76 65 72 0a 2a 2a 20 61 63 74 69 76 61 74 65 2e ver.** activate.
0ed0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 75 73 .**.** If the us
0ee0: 65 72 20 6c 61 63 6b 73 20 74 68 65 20 48 79 70 er lacks the Hyp
0ef0: 65 72 6c 69 6e 6b 20 28 68 29 20 70 72 6f 70 65 erlink (h) prope
0f00: 72 74 79 20 61 6e 64 20 74 68 65 20 22 61 75 74 rty and the "aut
0f10: 6f 2d 68 79 70 65 72 6c 69 6e 6b 22 0a 2a 2a 20 o-hyperlink".**
0f20: 73 65 74 74 69 6e 67 20 69 73 20 74 72 75 65 2c setting is true,
0f30: 20 74 68 65 6e 20 67 2e 70 65 72 6d 2e 48 79 70 then g.perm.Hyp
0f40: 65 72 6c 69 6e 6b 20 69 73 20 63 68 61 6e 67 65 erlink is change
0f50: 64 20 66 72 6f 6d 20 30 20 74 6f 20 31 20 61 6e d from 0 to 1 an
0f60: 64 0a 2a 2a 20 67 2e 6a 61 76 61 73 63 72 69 70 d.** g.javascrip
0f70: 74 48 79 70 65 72 6c 69 6e 6b 20 69 73 20 73 65 tHyperlink is se
0f80: 74 20 74 6f 20 31 2e 20 20 54 68 65 20 67 2e 6a t to 1. The g.j
0f90: 61 76 61 73 63 72 69 70 74 48 79 70 65 72 6c 69 avascriptHyperli
0fa0: 6e 6b 20 64 65 66 61 75 6c 74 73 0a 2a 2a 20 74 nk defaults.** t
0fb0: 6f 20 30 20 61 6e 64 20 6f 6e 6c 79 20 63 68 61 o 0 and only cha
0fc0: 6e 67 65 73 20 74 6f 20 6f 6e 65 20 69 66 20 74 nges to one if t
0fd0: 68 65 20 75 73 65 72 20 6c 61 63 6b 73 20 74 68 he user lacks th
0fe0: 65 20 48 79 70 65 72 6c 69 6e 6b 20 28 68 29 20 e Hyperlink (h)
0ff0: 70 72 6f 70 65 72 74 79 0a 2a 2a 20 61 6e 64 20 property.** and
1000: 74 68 65 20 22 61 75 74 6f 2d 68 79 70 65 72 6c the "auto-hyperl
1010: 69 6e 6b 22 20 73 65 74 74 69 6e 67 20 69 73 20 ink" setting is
1020: 65 6e 61 62 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 enabled..**.** F
1030: 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65 20 68 72 illing in the hr
1040: 65 66 3d 22 55 52 4c 22 20 75 73 69 6e 67 20 6a ef="URL" using j
1050: 61 76 61 73 63 72 69 70 74 20 69 73 20 61 20 64 avascript is a d
1060: 65 66 65 6e 73 65 20 61 67 61 69 6e 73 74 20 62 efense against b
1070: 6f 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e ots..**.** The n
1080: 61 6d 65 20 6f 66 20 74 68 69 73 20 72 6f 75 74 ame of this rout
1090: 69 6e 65 20 69 73 20 64 65 6c 69 62 65 72 61 74 ine is deliberat
10a0: 65 6c 79 20 6b 65 70 74 20 73 68 6f 72 74 20 73 ely kept short s
10b0: 6f 20 74 68 61 74 20 63 61 6e 20 62 65 0a 2a 2a o that can be.**
10c0: 20 65 61 73 69 6c 79 20 75 73 65 64 20 77 69 74 easily used wit
10d0: 68 69 6e 20 40 2d 6c 69 6e 65 73 2e 20 20 45 78 hin @-lines. Ex
10e0: 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 ample:.**.**
10f0: 20 20 40 20 25 7a 28 68 72 65 66 28 22 25 52 2f @ %z(href("%R/
1100: 61 72 74 69 66 61 63 74 2f 25 73 22 2c 7a 55 75 artifact/%s",zUu
1110: 69 64 29 29 25 68 28 7a 46 4e 29 3c 2f 61 3e 0a id))%h(zFN)</a>.
1120: 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 25 7a 20 66 6f **.** Note %z fo
1130: 72 6d 61 74 2e 20 20 54 68 65 20 73 74 72 69 6e rmat. The strin
1140: 67 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 g returned by th
1150: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 is function is a
1160: 6c 77 61 79 73 0a 2a 2a 20 6f 62 74 61 69 6e 65 lways.** obtaine
1170: 64 20 66 72 6f 6d 20 66 6f 73 73 69 6c 5f 6d 61 d from fossil_ma
1180: 6c 6c 6f 63 28 29 20 73 6f 20 72 65 6e 64 65 72 lloc() so render
1190: 69 6e 67 20 69 74 20 77 69 74 68 20 25 7a 20 77 ing it with %z w
11a0: 69 6c 6c 20 72 65 63 6c 61 69 6d 0a 2a 2a 20 74 ill reclaim.** t
11b0: 68 61 74 20 6d 65 6d 6f 72 79 20 73 70 61 63 65 hat memory space
11c0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 ..**.** There ar
11d0: 65 20 74 68 72 65 65 20 76 65 72 73 69 6f 6e 73 e three versions
11e0: 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 of this routine
11f0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 :.**.** (1)
1200: 20 68 72 65 66 28 29 20 64 6f 65 73 20 61 20 70 href() does a p
1210: 6c 61 69 6e 20 68 79 70 65 72 6c 69 6e 6b 0a 2a lain hyperlink.*
1220: 2a 20 20 20 20 28 32 29 20 20 20 78 68 72 65 66 * (2) xhref
1230: 28 29 20 61 64 64 73 20 65 78 74 72 61 20 61 74 () adds extra at
1240: 74 72 69 62 75 74 65 20 74 65 78 74 0a 2a 2a 20 tribute text.**
1250: 20 20 20 28 33 29 20 20 20 63 68 72 65 66 28 29 (3) chref()
1260: 20 61 64 64 73 20 61 20 63 6c 61 73 73 20 6e 61 adds a class na
1270: 6d 65 0a 2a 2a 0a 2a 2a 20 67 2e 70 65 72 6d 2e me.**.** g.perm.
1280: 48 79 70 65 72 6c 69 6e 6b 20 69 73 20 74 72 75 Hyperlink is tru
1290: 65 20 69 66 20 74 68 65 20 75 73 65 72 20 68 61 e if the user ha
12a0: 73 20 74 68 65 20 48 79 70 65 72 6c 69 6e 6b 20 s the Hyperlink
12b0: 28 68 29 20 70 72 6f 70 65 72 74 79 2e 0a 2a 2a (h) property..**
12c0: 20 4d 6f 73 74 20 6c 6f 67 67 65 64 20 69 6e 20 Most logged in
12d0: 75 73 65 72 73 20 73 68 6f 75 6c 64 20 68 61 76 users should hav
12e0: 65 20 74 68 69 73 20 70 72 6f 70 65 72 74 79 2c e this property,
12f0: 20 73 69 6e 63 65 20 77 65 20 63 61 6e 20 61 73 since we can as
1300: 73 75 6d 65 0a 2a 2a 20 74 68 61 74 20 61 20 6c sume.** that a l
1310: 6f 67 67 65 64 20 69 6e 20 75 73 65 72 20 69 73 ogged in user is
1320: 20 6e 6f 74 20 61 20 62 6f 74 2e 20 20 4f 6e 6c not a bot. Onl
1330: 79 20 22 6e 6f 62 6f 64 79 22 20 6c 61 63 6b 73 y "nobody" lacks
1340: 20 67 2e 70 65 72 6d 2e 48 79 70 65 72 6c 69 6e g.perm.Hyperlin
1350: 6b 2c 0a 2a 2a 20 74 79 70 69 63 61 6c 6c 79 2e k,.** typically.
1360: 0a 2a 2f 0a 63 68 61 72 20 2a 78 68 72 65 66 28 .*/.char *xhref(
1370: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 78 74 const char *zExt
1380: 72 61 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a ra, const char *
1390: 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 zFormat, ...){.
13a0: 20 63 68 61 72 20 2a 7a 55 72 6c 3b 0a 20 20 76 char *zUrl;. v
13b0: 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 76 61 5f a_list ap;. va_
13c0: 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 start(ap, zForma
13d0: 74 29 3b 0a 20 20 7a 55 72 6c 20 3d 20 76 6d 70 t);. zUrl = vmp
13e0: 72 69 6e 74 66 28 7a 46 6f 72 6d 61 74 2c 20 61 rintf(zFormat, a
13f0: 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 p);. va_end(ap)
1400: 3b 0a 20 20 69 66 28 20 67 2e 70 65 72 6d 2e 48 ;. if( g.perm.H
1410: 79 70 65 72 6c 69 6e 6b 20 26 26 20 21 67 2e 6a yperlink && !g.j
1420: 61 76 61 73 63 72 69 70 74 48 79 70 65 72 6c 69 avascriptHyperli
1430: 6e 6b 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a nk ){. char *
1440: 7a 48 55 72 6c 3b 0a 20 20 20 20 69 66 28 20 7a zHUrl;. if( z
1450: 45 78 74 72 61 20 29 7b 0a 20 20 20 20 20 20 7a Extra ){. z
1460: 48 55 72 6c 20 3d 20 6d 70 72 69 6e 74 66 28 22 HUrl = mprintf("
1470: 3c 61 20 25 73 20 68 72 65 66 3d 5c 22 25 68 5c <a %s href=\"%h\
1480: 22 3e 22 2c 20 7a 45 78 74 72 61 2c 20 7a 55 72 ">", zExtra, zUr
1490: 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 l);. }else{.
14a0: 20 20 20 20 20 7a 48 55 72 6c 20 3d 20 6d 70 72 zHUrl = mpr
14b0: 69 6e 74 66 28 22 3c 61 20 68 72 65 66 3d 5c 22 intf("<a href=\"
14c0: 25 68 5c 22 3e 22 2c 20 7a 55 72 6c 29 3b 0a 20 %h\">", zUrl);.
14d0: 20 20 20 7d 0a 20 20 20 20 66 6f 73 73 69 6c 5f }. fossil_
14e0: 66 72 65 65 28 7a 55 72 6c 29 3b 0a 20 20 20 20 free(zUrl);.
14f0: 72 65 74 75 72 6e 20 7a 48 55 72 6c 3b 0a 20 20 return zHUrl;.
1500: 7d 0a 20 20 6e 65 65 64 48 72 65 66 4a 73 20 3d }. needHrefJs =
1510: 20 31 3b 0a 20 20 69 66 28 20 7a 45 78 74 72 61 1;. if( zExtra
1520: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 ==0 ){. retur
1530: 6e 20 6d 70 72 69 6e 74 66 28 22 3c 61 20 64 61 n mprintf("<a da
1540: 74 61 2d 68 72 65 66 3d 27 25 7a 27 20 68 72 65 ta-href='%z' hre
1550: 66 3d 27 25 52 2f 68 6f 6e 65 79 70 6f 74 27 3e f='%R/honeypot'>
1560: 22 2c 20 7a 55 72 6c 29 3b 0a 20 20 7d 65 6c 73 ", zUrl);. }els
1570: 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 70 e{. return mp
1580: 72 69 6e 74 66 28 22 3c 61 20 25 73 20 64 61 74 rintf("<a %s dat
1590: 61 2d 68 72 65 66 3d 27 25 7a 27 20 68 72 65 66 a-href='%z' href
15a0: 3d 27 25 52 2f 68 6f 6e 65 79 70 6f 74 27 3e 22 ='%R/honeypot'>"
15b0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,.
15c0: 20 20 20 20 20 7a 45 78 74 72 61 2c 20 7a 55 72 zExtra, zUr
15d0: 6c 29 3b 0a 20 20 7d 0a 7d 0a 63 68 61 72 20 2a l);. }.}.char *
15e0: 63 68 72 65 66 28 63 6f 6e 73 74 20 63 68 61 72 chref(const char
15f0: 20 2a 7a 45 78 74 72 61 2c 20 63 6f 6e 73 74 20 *zExtra, const
1600: 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e char *zFormat, .
1610: 2e 2e 29 7b 0a 20 20 63 68 61 72 20 2a 7a 55 72 ..){. char *zUr
1620: 6c 3b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b l;. va_list ap;
1630: 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 . va_start(ap,
1640: 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 7a 55 72 6c zFormat);. zUrl
1650: 20 3d 20 76 6d 70 72 69 6e 74 66 28 7a 46 6f 72 = vmprintf(zFor
1660: 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 mat, ap);. va_e
1670: 6e 64 28 61 70 29 3b 0a 20 20 69 66 28 20 67 2e nd(ap);. if( g.
1680: 70 65 72 6d 2e 48 79 70 65 72 6c 69 6e 6b 20 26 perm.Hyperlink &
1690: 26 20 21 67 2e 6a 61 76 61 73 63 72 69 70 74 48 & !g.javascriptH
16a0: 79 70 65 72 6c 69 6e 6b 20 29 7b 0a 20 20 20 20 yperlink ){.
16b0: 63 68 61 72 20 2a 7a 48 55 72 6c 20 3d 20 6d 70 char *zHUrl = mp
16c0: 72 69 6e 74 66 28 22 3c 61 20 63 6c 61 73 73 3d rintf("<a class=
16d0: 5c 22 25 73 5c 22 20 68 72 65 66 3d 5c 22 25 68 \"%s\" href=\"%h
16e0: 5c 22 3e 22 2c 20 7a 45 78 74 72 61 2c 20 7a 55 \">", zExtra, zU
16f0: 72 6c 29 3b 0a 20 20 20 20 66 6f 73 73 69 6c 5f rl);. fossil_
1700: 66 72 65 65 28 7a 55 72 6c 29 3b 0a 20 20 20 20 free(zUrl);.
1710: 72 65 74 75 72 6e 20 7a 48 55 72 6c 3b 0a 20 20 return zHUrl;.
1720: 7d 0a 20 20 6e 65 65 64 48 72 65 66 4a 73 20 3d }. needHrefJs =
1730: 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 6d 70 72 1;. return mpr
1740: 69 6e 74 66 28 22 3c 61 20 63 6c 61 73 73 3d 27 intf("<a class='
1750: 25 73 27 20 64 61 74 61 2d 68 72 65 66 3d 27 25 %s' data-href='%
1760: 7a 27 20 68 72 65 66 3d 27 25 52 2f 68 6f 6e 65 z' href='%R/hone
1770: 79 70 6f 74 27 3e 22 2c 0a 20 20 20 20 20 20 20 ypot'>",.
1780: 20 20 20 20 20 20 20 20 20 20 7a 45 78 74 72 61 zExtra
1790: 2c 20 7a 55 72 6c 29 3b 0a 7d 0a 63 68 61 72 20 , zUrl);.}.char
17a0: 2a 68 72 65 66 28 63 6f 6e 73 74 20 63 68 61 72 *href(const char
17b0: 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b *zFormat, ...){
17c0: 0a 20 20 63 68 61 72 20 2a 7a 55 72 6c 3b 0a 20 . char *zUrl;.
17d0: 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 76 va_list ap;. v
17e0: 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 a_start(ap, zFor
17f0: 6d 61 74 29 3b 0a 20 20 7a 55 72 6c 20 3d 20 76 mat);. zUrl = v
1800: 6d 70 72 69 6e 74 66 28 7a 46 6f 72 6d 61 74 2c mprintf(zFormat,
1810: 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 ap);. va_end(a
1820: 70 29 3b 0a 20 20 69 66 28 20 67 2e 70 65 72 6d p);. if( g.perm
1830: 2e 48 79 70 65 72 6c 69 6e 6b 20 26 26 20 21 67 .Hyperlink && !g
1840: 2e 6a 61 76 61 73 63 72 69 70 74 48 79 70 65 72 .javascriptHyper
1850: 6c 69 6e 6b 20 29 7b 0a 20 20 20 20 63 68 61 72 link ){. char
1860: 20 2a 7a 48 55 72 6c 20 3d 20 6d 70 72 69 6e 74 *zHUrl = mprint
1870: 66 28 22 3c 61 20 68 72 65 66 3d 5c 22 25 68 5c f("<a href=\"%h\
1880: 22 3e 22 2c 20 7a 55 72 6c 29 3b 0a 20 20 20 20 ">", zUrl);.
1890: 66 6f 73 73 69 6c 5f 66 72 65 65 28 7a 55 72 6c fossil_free(zUrl
18a0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 7a 48 );. return zH
18b0: 55 72 6c 3b 0a 20 20 7d 0a 20 20 6e 65 65 64 48 Url;. }. needH
18c0: 72 65 66 4a 73 20 3d 20 31 3b 0a 20 20 72 65 74 refJs = 1;. ret
18d0: 75 72 6e 20 6d 70 72 69 6e 74 66 28 22 3c 61 20 urn mprintf("<a
18e0: 64 61 74 61 2d 68 72 65 66 3d 27 25 73 27 20 68 data-href='%s' h
18f0: 72 65 66 3d 27 25 52 2f 68 6f 6e 65 79 70 6f 74 ref='%R/honeypot
1900: 27 3e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 '>",.
1910: 20 20 20 20 20 20 20 7a 55 72 6c 29 3b 0a 7d 0a zUrl);.}.
1920: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 ./*.** Generate
1930: 3c 66 6f 72 6d 20 6d 65 74 68 6f 64 3d 22 70 6f <form method="po
1940: 73 74 22 20 61 63 74 69 6f 6e 3d 41 52 47 3e 2e st" action=ARG>.
1950: 20 20 54 68 65 20 41 52 47 20 76 61 6c 75 65 20 The ARG value
1960: 69 73 20 69 6e 73 65 72 74 65 64 0a 2a 2a 20 62 is inserted.** b
1970: 79 20 6a 61 76 61 73 63 72 69 70 74 2e 0a 2a 2f y javascript..*/
1980: 0a 76 6f 69 64 20 66 6f 72 6d 5f 62 65 67 69 6e .void form_begin
1990: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 74 (const char *zOt
19a0: 68 65 72 41 72 67 73 2c 20 63 6f 6e 73 74 20 63 herArgs, const c
19b0: 68 61 72 20 2a 7a 41 63 74 69 6f 6e 2c 20 2e 2e har *zAction, ..
19c0: 2e 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4c 69 6e .){. char *zLin
19d0: 6b 3b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b k;. va_list ap;
19e0: 0a 20 20 69 66 28 20 7a 4f 74 68 65 72 41 72 67 . if( zOtherArg
19f0: 73 3d 3d 30 20 29 20 7a 4f 74 68 65 72 41 72 67 s==0 ) zOtherArg
1a00: 73 20 3d 20 22 22 3b 0a 20 20 76 61 5f 73 74 61 s = "";. va_sta
1a10: 72 74 28 61 70 2c 20 7a 41 63 74 69 6f 6e 29 3b rt(ap, zAction);
1a20: 0a 20 20 7a 4c 69 6e 6b 20 3d 20 76 6d 70 72 69 . zLink = vmpri
1a30: 6e 74 66 28 7a 41 63 74 69 6f 6e 2c 20 61 70 29 ntf(zAction, ap)
1a40: 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a ;. va_end(ap);.
1a50: 20 20 69 66 28 20 67 2e 70 65 72 6d 2e 48 79 70 if( g.perm.Hyp
1a60: 65 72 6c 69 6e 6b 20 26 26 20 21 67 2e 6a 61 76 erlink && !g.jav
1a70: 61 73 63 72 69 70 74 48 79 70 65 72 6c 69 6e 6b ascriptHyperlink
1a80: 20 29 7b 0a 20 20 20 20 40 20 3c 66 6f 72 6d 20 ){. @ <form
1a90: 6d 65 74 68 6f 64 3d 22 50 4f 53 54 22 20 61 63 method="POST" ac
1aa0: 74 69 6f 6e 3d 22 25 7a 28 7a 4c 69 6e 6b 29 22 tion="%z(zLink)"
1ab0: 20 25 73 28 7a 4f 74 68 65 72 41 72 67 73 29 3e %s(zOtherArgs)>
1ac0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 65 . }else{. ne
1ad0: 65 64 48 72 65 66 4a 73 20 3d 20 31 3b 0a 20 20 edHrefJs = 1;.
1ae0: 20 20 40 20 3c 66 6f 72 6d 20 6d 65 74 68 6f 64 @ <form method
1af0: 3d 22 50 4f 53 54 22 20 64 61 74 61 2d 61 63 74 ="POST" data-act
1b00: 69 6f 6e 3d 27 25 73 28 7a 4c 69 6e 6b 29 27 20 ion='%s(zLink)'
1b10: 61 63 74 69 6f 6e 3d 27 25 52 2f 6c 6f 67 69 6e action='%R/login
1b20: 27 20 5c 0a 20 20 20 20 40 20 25 73 28 7a 4f 74 ' \. @ %s(zOt
1b30: 68 65 72 41 72 67 73 29 3e 0a 20 20 7d 0a 7d 0a herArgs)>. }.}.
1b40: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 ./*.** Add a new
1b50: 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 element to the
1b60: 73 75 62 6d 65 6e 75 0a 2a 2f 0a 76 6f 69 64 20 submenu.*/.void
1b70: 73 74 79 6c 65 5f 73 75 62 6d 65 6e 75 5f 65 6c style_submenu_el
1b80: 65 6d 65 6e 74 28 0a 20 20 63 6f 6e 73 74 20 63 ement(. const c
1b90: 68 61 72 20 2a 7a 4c 61 62 65 6c 2c 0a 20 20 63 har *zLabel,. c
1ba0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 69 6e 6b onst char *zLink
1bb0: 2c 0a 20 20 2e 2e 2e 0a 29 7b 0a 20 20 76 61 5f ,. ....){. va_
1bc0: 6c 69 73 74 20 61 70 3b 0a 20 20 61 73 73 65 72 list ap;. asser
1bd0: 74 28 20 6e 53 75 62 6d 65 6e 75 20 3c 20 63 6f t( nSubmenu < co
1be0: 75 6e 74 28 61 53 75 62 6d 65 6e 75 29 20 29 3b unt(aSubmenu) );
1bf0: 0a 20 20 61 53 75 62 6d 65 6e 75 5b 6e 53 75 62 . aSubmenu[nSub
1c00: 6d 65 6e 75 5d 2e 7a 4c 61 62 65 6c 20 3d 20 7a menu].zLabel = z
1c10: 4c 61 62 65 6c 3b 0a 20 20 76 61 5f 73 74 61 72 Label;. va_star
1c20: 74 28 61 70 2c 20 7a 4c 69 6e 6b 29 3b 0a 20 20 t(ap, zLink);.
1c30: 61 53 75 62 6d 65 6e 75 5b 6e 53 75 62 6d 65 6e aSubmenu[nSubmen
1c40: 75 5d 2e 7a 4c 69 6e 6b 20 3d 20 76 6d 70 72 69 u].zLink = vmpri
1c50: 6e 74 66 28 7a 4c 69 6e 6b 2c 20 61 70 29 3b 0a ntf(zLink, ap);.
1c60: 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 va_end(ap);.
1c70: 6e 53 75 62 6d 65 6e 75 2b 2b 3b 0a 7d 0a 76 6f nSubmenu++;.}.vo
1c80: 69 64 20 73 74 79 6c 65 5f 73 75 62 6d 65 6e 75 id style_submenu
1c90: 5f 65 6e 74 72 79 28 0a 20 20 63 6f 6e 73 74 20 _entry(. const
1ca0: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 char *zName,
1cb0: 20 20 20 2f 2a 20 51 75 65 72 79 20 70 61 72 61 /* Query para
1cc0: 6d 65 74 65 72 20 6e 61 6d 65 20 2a 2f 0a 20 20 meter name */.
1cd0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 61 62 const char *zLab
1ce0: 65 6c 2c 20 20 20 20 20 20 2f 2a 20 4c 61 62 65 el, /* Labe
1cf0: 6c 20 62 65 66 6f 72 65 20 74 68 65 20 65 6e 74 l before the ent
1d00: 72 79 20 62 6f 78 20 2a 2f 0a 20 20 69 6e 74 20 ry box */. int
1d10: 69 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 iSize,
1d20: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 /* Size of
1d30: 74 68 65 20 65 6e 74 72 79 20 62 6f 78 20 2a 2f the entry box */
1d40: 0a 20 20 69 6e 74 20 65 56 69 73 69 62 6c 65 20 . int eVisible
1d50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 /* V
1d60: 69 73 69 62 6c 65 20 6f 72 20 64 69 73 61 62 6c isible or disabl
1d70: 65 64 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 ed */.){. asser
1d80: 74 28 20 6e 53 75 62 6d 65 6e 75 43 74 72 6c 20 t( nSubmenuCtrl
1d90: 3c 20 63 6f 75 6e 74 28 61 53 75 62 6d 65 6e 75 < count(aSubmenu
1da0: 43 74 72 6c 29 20 29 3b 0a 20 20 61 53 75 62 6d Ctrl) );. aSubm
1db0: 65 6e 75 43 74 72 6c 5b 6e 53 75 62 6d 65 6e 75 enuCtrl[nSubmenu
1dc0: 43 74 72 6c 5d 2e 7a 4e 61 6d 65 20 3d 20 7a 4e Ctrl].zName = zN
1dd0: 61 6d 65 3b 0a 20 20 61 53 75 62 6d 65 6e 75 43 ame;. aSubmenuC
1de0: 74 72 6c 5b 6e 53 75 62 6d 65 6e 75 43 74 72 6c trl[nSubmenuCtrl
1df0: 5d 2e 7a 4c 61 62 65 6c 20 3d 20 7a 4c 61 62 65 ].zLabel = zLabe
1e00: 6c 3b 0a 20 20 61 53 75 62 6d 65 6e 75 43 74 72 l;. aSubmenuCtr
1e10: 6c 5b 6e 53 75 62 6d 65 6e 75 43 74 72 6c 5d 2e l[nSubmenuCtrl].
1e20: 69 53 69 7a 65 20 3d 20 69 53 69 7a 65 3b 0a 20 iSize = iSize;.
1e30: 20 61 53 75 62 6d 65 6e 75 43 74 72 6c 5b 6e 53 aSubmenuCtrl[nS
1e40: 75 62 6d 65 6e 75 43 74 72 6c 5d 2e 65 56 69 73 ubmenuCtrl].eVis
1e50: 69 62 6c 65 20 3d 20 65 56 69 73 69 62 6c 65 3b ible = eVisible;
1e60: 0a 20 20 61 53 75 62 6d 65 6e 75 43 74 72 6c 5b . aSubmenuCtrl[
1e70: 6e 53 75 62 6d 65 6e 75 43 74 72 6c 5d 2e 65 54 nSubmenuCtrl].eT
1e80: 79 70 65 20 3d 20 46 46 5f 45 4e 54 52 59 3b 0a ype = FF_ENTRY;.
1e90: 20 20 6e 53 75 62 6d 65 6e 75 43 74 72 6c 2b 2b nSubmenuCtrl++
1ea0: 3b 0a 7d 0a 76 6f 69 64 20 73 74 79 6c 65 5f 73 ;.}.void style_s
1eb0: 75 62 6d 65 6e 75 5f 63 68 65 63 6b 62 6f 78 28 ubmenu_checkbox(
1ec0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a . const char *z
1ed0: 4e 61 6d 65 2c 20 20 20 20 20 20 20 2f 2a 20 51 Name, /* Q
1ee0: 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 20 6e uery parameter n
1ef0: 61 6d 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 ame */. const c
1f00: 68 61 72 20 2a 7a 4c 61 62 65 6c 2c 20 20 20 20 har *zLabel,
1f10: 20 20 2f 2a 20 4c 61 62 65 6c 20 74 6f 20 64 69 /* Label to di
1f20: 73 70 6c 61 79 20 61 66 74 65 72 20 74 68 65 20 splay after the
1f30: 63 68 65 63 6b 62 6f 78 20 2a 2f 0a 20 20 69 6e checkbox */. in
1f40: 74 20 65 56 69 73 69 62 6c 65 2c 20 20 20 20 20 t eVisible,
1f50: 20 20 20 20 20 20 20 2f 2a 20 56 69 73 69 62 6c /* Visibl
1f60: 65 20 6f 72 20 64 69 73 61 62 6c 65 64 20 2a 2f e or disabled */
1f70: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a . const char *z
1f80: 4a 53 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f JS /* O
1f90: 70 74 69 6f 6e 61 6c 20 6a 61 76 61 73 63 72 69 ptional javascri
1fa0: 70 74 20 74 6f 20 72 75 6e 20 6f 6e 20 74 6f 67 pt to run on tog
1fb0: 67 6c 65 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 gle */.){. asse
1fc0: 72 74 28 20 6e 53 75 62 6d 65 6e 75 43 74 72 6c rt( nSubmenuCtrl
1fd0: 20 3c 20 63 6f 75 6e 74 28 61 53 75 62 6d 65 6e < count(aSubmen
1fe0: 75 43 74 72 6c 29 20 29 3b 0a 20 20 61 53 75 62 uCtrl) );. aSub
1ff0: 6d 65 6e 75 43 74 72 6c 5b 6e 53 75 62 6d 65 6e menuCtrl[nSubmen
2000: 75 43 74 72 6c 5d 2e 7a 4e 61 6d 65 20 3d 20 7a uCtrl].zName = z
2010: 4e 61 6d 65 3b 0a 20 20 61 53 75 62 6d 65 6e 75 Name;. aSubmenu
2020: 43 74 72 6c 5b 6e 53 75 62 6d 65 6e 75 43 74 72 Ctrl[nSubmenuCtr
2030: 6c 5d 2e 7a 4c 61 62 65 6c 20 3d 20 7a 4c 61 62 l].zLabel = zLab
2040: 65 6c 3b 0a 20 20 61 53 75 62 6d 65 6e 75 43 74 el;. aSubmenuCt
2050: 72 6c 5b 6e 53 75 62 6d 65 6e 75 43 74 72 6c 5d rl[nSubmenuCtrl]
2060: 2e 65 56 69 73 69 62 6c 65 20 3d 20 65 56 69 73 .eVisible = eVis
2070: 69 62 6c 65 3b 0a 20 20 61 53 75 62 6d 65 6e 75 ible;. aSubmenu
2080: 43 74 72 6c 5b 6e 53 75 62 6d 65 6e 75 43 74 72 Ctrl[nSubmenuCtr
2090: 6c 5d 2e 7a 4a 53 20 3d 20 7a 4a 53 3b 0a 20 20 l].zJS = zJS;.
20a0: 61 53 75 62 6d 65 6e 75 43 74 72 6c 5b 6e 53 75 aSubmenuCtrl[nSu
20b0: 62 6d 65 6e 75 43 74 72 6c 5d 2e 65 54 79 70 65 bmenuCtrl].eType
20c0: 20 3d 20 46 46 5f 43 48 45 43 4b 42 4f 58 3b 0a = FF_CHECKBOX;.
20d0: 20 20 6e 53 75 62 6d 65 6e 75 43 74 72 6c 2b 2b nSubmenuCtrl++
20e0: 3b 0a 7d 0a 76 6f 69 64 20 73 74 79 6c 65 5f 73 ;.}.void style_s
20f0: 75 62 6d 65 6e 75 5f 62 69 6e 61 72 79 28 0a 20 ubmenu_binary(.
2100: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 const char *zNa
2110: 6d 65 2c 20 20 20 20 20 20 20 2f 2a 20 51 75 65 me, /* Que
2120: 72 79 20 70 61 72 61 6d 65 74 65 72 20 6e 61 6d ry parameter nam
2130: 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 e */. const cha
2140: 72 20 2a 7a 54 72 75 65 2c 20 20 20 20 20 20 20 r *zTrue,
2150: 2f 2a 20 4c 61 62 65 6c 20 74 6f 20 73 68 6f 77 /* Label to show
2160: 20 77 68 65 6e 20 70 61 72 61 6d 65 74 65 72 20 when parameter
2170: 69 73 20 74 72 75 65 20 2a 2f 0a 20 20 63 6f 6e is true */. con
2180: 73 74 20 63 68 61 72 20 2a 7a 46 61 6c 73 65 2c st char *zFalse,
2190: 20 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20 74 /* Label t
21a0: 6f 20 73 68 6f 77 20 77 68 65 6e 20 74 68 65 20 o show when the
21b0: 70 61 72 61 6d 65 74 65 72 20 69 73 20 66 61 6c parameter is fal
21c0: 73 65 20 2a 2f 0a 20 20 69 6e 74 20 65 56 69 73 se */. int eVis
21d0: 69 62 6c 65 20 20 20 20 20 20 20 20 20 20 20 20 ible
21e0: 20 2f 2a 20 56 69 73 69 62 6c 65 20 6f 72 20 64 /* Visible or d
21f0: 69 73 61 62 6c 65 64 20 2a 2f 0a 29 7b 0a 20 20 isabled */.){.
2200: 61 73 73 65 72 74 28 20 6e 53 75 62 6d 65 6e 75 assert( nSubmenu
2210: 43 74 72 6c 20 3c 20 63 6f 75 6e 74 28 61 53 75 Ctrl < count(aSu
2220: 62 6d 65 6e 75 43 74 72 6c 29 20 29 3b 0a 20 20 bmenuCtrl) );.
2230: 61 53 75 62 6d 65 6e 75 43 74 72 6c 5b 6e 53 75 aSubmenuCtrl[nSu
2240: 62 6d 65 6e 75 43 74 72 6c 5d 2e 7a 4e 61 6d 65 bmenuCtrl].zName
2250: 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 61 53 75 62 = zName;. aSub
2260: 6d 65 6e 75 43 74 72 6c 5b 6e 53 75 62 6d 65 6e menuCtrl[nSubmen
2270: 75 43 74 72 6c 5d 2e 7a 4c 61 62 65 6c 20 3d 20 uCtrl].zLabel =
2280: 7a 54 72 75 65 3b 0a 20 20 61 53 75 62 6d 65 6e zTrue;. aSubmen
2290: 75 43 74 72 6c 5b 6e 53 75 62 6d 65 6e 75 43 74 uCtrl[nSubmenuCt
22a0: 72 6c 5d 2e 7a 46 61 6c 73 65 20 3d 20 7a 46 61 rl].zFalse = zFa
22b0: 6c 73 65 3b 0a 20 20 61 53 75 62 6d 65 6e 75 43 lse;. aSubmenuC
22c0: 74 72 6c 5b 6e 53 75 62 6d 65 6e 75 43 74 72 6c trl[nSubmenuCtrl
22d0: 5d 2e 65 56 69 73 69 62 6c 65 20 3d 20 65 56 69 ].eVisible = eVi
22e0: 73 69 62 6c 65 3b 0a 20 20 61 53 75 62 6d 65 6e sible;. aSubmen
22f0: 75 43 74 72 6c 5b 6e 53 75 62 6d 65 6e 75 43 74 uCtrl[nSubmenuCt
2300: 72 6c 5d 2e 65 54 79 70 65 20 3d 20 46 46 5f 42 rl].eType = FF_B
2310: 49 4e 41 52 59 3b 0a 20 20 6e 53 75 62 6d 65 6e INARY;. nSubmen
2320: 75 43 74 72 6c 2b 2b 3b 0a 7d 0a 76 6f 69 64 20 uCtrl++;.}.void
2330: 73 74 79 6c 65 5f 73 75 62 6d 65 6e 75 5f 6d 75 style_submenu_mu
2340: 6c 74 69 63 68 6f 69 63 65 28 0a 20 20 63 6f 6e ltichoice(. con
2350: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 st char *zName,
2360: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75 65 /* Que
2370: 72 79 20 70 61 72 61 6d 65 74 65 72 20 6e 61 6d ry parameter nam
2380: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 68 6f 69 e */. int nChoi
2390: 63 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 ce,
23a0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 /* Number of
23b0: 20 6f 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 63 6f options */. co
23c0: 6e 73 74 20 63 68 61 72 20 2a 63 6f 6e 73 74 20 nst char *const
23d0: 2a 61 7a 43 68 6f 69 63 65 2c 20 2f 2a 20 76 61 *azChoice, /* va
23e0: 6c 75 65 2f 64 69 73 70 6c 61 79 20 70 61 69 72 lue/display pair
23f0: 73 2e 20 20 32 2a 6e 43 68 6f 69 63 65 20 65 6e s. 2*nChoice en
2400: 74 72 69 65 73 20 2a 2f 0a 20 20 69 6e 74 20 65 tries */. int e
2410: 56 69 73 69 62 6c 65 20 20 20 20 20 20 20 20 20 Visible
2420: 20 20 20 20 20 20 20 20 2f 2a 20 56 69 73 69 62 /* Visib
2430: 6c 65 20 6f 72 20 64 69 73 61 62 6c 65 64 20 2a le or disabled *
2440: 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 6e /.){. assert( n
2450: 53 75 62 6d 65 6e 75 43 74 72 6c 20 3c 20 63 6f SubmenuCtrl < co
2460: 75 6e 74 28 61 53 75 62 6d 65 6e 75 43 74 72 6c unt(aSubmenuCtrl
2470: 29 20 29 3b 0a 20 20 61 53 75 62 6d 65 6e 75 43 ) );. aSubmenuC
2480: 74 72 6c 5b 6e 53 75 62 6d 65 6e 75 43 74 72 6c trl[nSubmenuCtrl
2490: 5d 2e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b ].zName = zName;
24a0: 0a 20 20 61 53 75 62 6d 65 6e 75 43 74 72 6c 5b . aSubmenuCtrl[
24b0: 6e 53 75 62 6d 65 6e 75 43 74 72 6c 5d 2e 69 53 nSubmenuCtrl].iS
24c0: 69 7a 65 20 3d 20 6e 43 68 6f 69 63 65 3b 0a 20 ize = nChoice;.
24d0: 20 61 53 75 62 6d 65 6e 75 43 74 72 6c 5b 6e 53 aSubmenuCtrl[nS
24e0: 75 62 6d 65 6e 75 43 74 72 6c 5d 2e 61 7a 43 68 ubmenuCtrl].azCh
24f0: 6f 69 63 65 20 3d 20 61 7a 43 68 6f 69 63 65 3b oice = azChoice;
2500: 0a 20 20 61 53 75 62 6d 65 6e 75 43 74 72 6c 5b . aSubmenuCtrl[
2510: 6e 53 75 62 6d 65 6e 75 43 74 72 6c 5d 2e 65 56 nSubmenuCtrl].eV
2520: 69 73 69 62 6c 65 20 3d 20 65 56 69 73 69 62 6c isible = eVisibl
2530: 65 3b 0a 20 20 61 53 75 62 6d 65 6e 75 43 74 72 e;. aSubmenuCtr
2540: 6c 5b 6e 53 75 62 6d 65 6e 75 43 74 72 6c 5d 2e l[nSubmenuCtrl].
2550: 65 54 79 70 65 20 3d 20 46 46 5f 4d 55 4c 54 49 eType = FF_MULTI
2560: 3b 0a 20 20 6e 53 75 62 6d 65 6e 75 43 74 72 6c ;. nSubmenuCtrl
2570: 2b 2b 3b 0a 7d 0a 76 6f 69 64 20 73 74 79 6c 65 ++;.}.void style
2580: 5f 73 75 62 6d 65 6e 75 5f 73 71 6c 28 0a 20 20 _submenu_sql(.
2590: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d const char *zNam
25a0: 65 2c 20 20 20 20 20 20 20 2f 2a 20 51 75 65 72 e, /* Quer
25b0: 79 20 70 61 72 61 6d 65 74 65 72 20 6e 61 6d 65 y parameter name
25c0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 */. const char
25d0: 20 2a 7a 4c 61 62 65 6c 2c 20 20 20 20 20 20 2f *zLabel, /
25e0: 2a 20 4c 61 62 65 6c 20 6f 6e 20 74 68 65 20 63 * Label on the c
25f0: 6f 6e 74 72 6f 6c 20 2a 2f 0a 20 20 63 6f 6e 73 ontrol */. cons
2600: 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c t char *zFormat,
2610: 20 20 20 20 20 2f 2a 20 46 6f 72 6d 61 74 20 73 /* Format s
2620: 74 72 69 6e 67 20 66 6f 72 20 53 51 4c 20 63 6f tring for SQL co
2630: 6d 6d 61 6e 64 20 66 6f 72 20 63 68 6f 69 63 65 mmand for choice
2640: 73 20 2a 2f 0a 20 20 2e 2e 2e 20 20 20 20 20 20 s */. ...
2650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2660: 2f 2a 20 41 72 67 75 6d 65 6e 74 73 20 74 6f 20 /* Arguments to
2670: 74 68 65 20 66 6f 72 6d 61 74 20 73 74 72 69 6e the format strin
2680: 67 20 2a 2f 0a 29 7b 0a 20 20 53 74 6d 74 20 71 g */.){. Stmt q
2690: 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 ;. int n = 0;.
26a0: 20 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20 30 3b int nAlloc = 0;
26b0: 0a 20 20 63 68 61 72 20 2a 2a 61 7a 20 3d 20 30 . char **az = 0
26c0: 3b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a ;. va_list ap;.
26d0: 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 . va_start(ap,
26e0: 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 64 62 5f 76 zFormat);. db_v
26f0: 70 72 65 70 61 72 65 28 26 71 2c 20 30 2c 20 7a prepare(&q, 0, z
2700: 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 Format, ap);. v
2710: 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 77 68 69 a_end(ap);. whi
2720: 6c 65 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d le( SQLITE_ROW==
2730: 64 62 5f 73 74 65 70 28 26 71 29 20 29 7b 0a 20 db_step(&q) ){.
2740: 20 20 20 69 66 28 20 6e 2b 32 3e 3d 6e 41 6c 6c if( n+2>=nAll
2750: 6f 63 20 29 7b 0a 20 20 20 20 20 20 6e 41 6c 6c oc ){. nAll
2760: 6f 63 20 2b 3d 20 6e 41 6c 6c 6f 63 20 2b 20 32 oc += nAlloc + 2
2770: 30 3b 0a 20 20 20 20 20 20 61 7a 20 3d 20 66 6f 0;. az = fo
2780: 73 73 69 6c 5f 72 65 61 6c 6c 6f 63 28 61 7a 2c ssil_realloc(az,
2790: 20 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a 6e sizeof(char*)*n
27a0: 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 7d 0a 20 20 Alloc);. }.
27b0: 20 20 61 7a 5b 6e 2b 2b 5d 20 3d 20 66 6f 73 73 az[n++] = foss
27c0: 69 6c 5f 73 74 72 64 75 70 28 64 62 5f 63 6f 6c il_strdup(db_col
27d0: 75 6d 6e 5f 74 65 78 74 28 26 71 2c 30 29 29 3b umn_text(&q,0));
27e0: 0a 20 20 20 20 61 7a 5b 6e 2b 2b 5d 20 3d 20 66 . az[n++] = f
27f0: 6f 73 73 69 6c 5f 73 74 72 64 75 70 28 64 62 5f ossil_strdup(db_
2800: 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71 2c 31 column_text(&q,1
2810: 29 29 3b 0a 20 20 7d 0a 20 20 64 62 5f 66 69 6e ));. }. db_fin
2820: 61 6c 69 7a 65 28 26 71 29 3b 0a 20 20 69 66 28 alize(&q);. if(
2830: 20 6e 3e 30 20 29 7b 0a 20 20 20 20 61 53 75 62 n>0 ){. aSub
2840: 6d 65 6e 75 43 74 72 6c 5b 6e 53 75 62 6d 65 6e menuCtrl[nSubmen
2850: 75 43 74 72 6c 5d 2e 7a 4e 61 6d 65 20 3d 20 7a uCtrl].zName = z
2860: 4e 61 6d 65 3b 0a 20 20 20 20 61 53 75 62 6d 65 Name;. aSubme
2870: 6e 75 43 74 72 6c 5b 6e 53 75 62 6d 65 6e 75 43 nuCtrl[nSubmenuC
2880: 74 72 6c 5d 2e 7a 4c 61 62 65 6c 20 3d 20 7a 4c trl].zLabel = zL
2890: 61 62 65 6c 3b 0a 20 20 20 20 61 53 75 62 6d 65 abel;. aSubme
28a0: 6e 75 43 74 72 6c 5b 6e 53 75 62 6d 65 6e 75 43 nuCtrl[nSubmenuC
28b0: 74 72 6c 5d 2e 69 53 69 7a 65 20 3d 20 6e 2f 32 trl].iSize = n/2
28c0: 3b 0a 20 20 20 20 61 53 75 62 6d 65 6e 75 43 74 ;. aSubmenuCt
28d0: 72 6c 5b 6e 53 75 62 6d 65 6e 75 43 74 72 6c 5d rl[nSubmenuCtrl]
28e0: 2e 61 7a 43 68 6f 69 63 65 20 3d 20 28 63 6f 6e .azChoice = (con
28f0: 73 74 20 63 68 61 72 20 2a 63 6f 6e 73 74 20 2a st char *const *
2900: 29 61 7a 3b 0a 20 20 20 20 61 53 75 62 6d 65 6e )az;. aSubmen
2910: 75 43 74 72 6c 5b 6e 53 75 62 6d 65 6e 75 43 74 uCtrl[nSubmenuCt
2920: 72 6c 5d 2e 65 56 69 73 69 62 6c 65 20 3d 20 53 rl].eVisible = S
2930: 54 59 4c 45 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 TYLE_NORMAL;.
2940: 20 61 53 75 62 6d 65 6e 75 43 74 72 6c 5b 6e 53 aSubmenuCtrl[nS
2950: 75 62 6d 65 6e 75 43 74 72 6c 5d 2e 65 54 79 70 ubmenuCtrl].eTyp
2960: 65 20 3d 20 46 46 5f 4d 55 4c 54 49 3b 0a 20 20 e = FF_MULTI;.
2970: 20 20 6e 53 75 62 6d 65 6e 75 43 74 72 6c 2b 2b nSubmenuCtrl++
2980: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 ;. }.}../*.** D
2990: 69 73 61 62 6c 65 20 6f 72 20 65 6e 61 62 6c 65 isable or enable
29a0: 20 74 68 65 20 73 75 62 6d 65 6e 75 0a 2a 2f 0a the submenu.*/.
29b0: 76 6f 69 64 20 73 74 79 6c 65 5f 73 75 62 6d 65 void style_subme
29c0: 6e 75 5f 65 6e 61 62 6c 65 28 69 6e 74 20 6f 6e nu_enable(int on
29d0: 4f 66 66 29 7b 0a 20 20 73 75 62 6d 65 6e 75 45 Off){. submenuE
29e0: 6e 61 62 6c 65 20 3d 20 6f 6e 4f 66 66 3b 0a 7d nable = onOff;.}
29f0: 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 .../*.** Compare
2a00: 20 74 77 6f 20 73 75 62 6d 65 6e 75 20 69 74 65 two submenu ite
2a10: 6d 73 20 66 6f 72 20 73 6f 72 74 69 6e 67 20 70 ms for sorting p
2a20: 75 72 70 6f 73 65 73 0a 2a 2f 0a 73 74 61 74 69 urposes.*/.stati
2a30: 63 20 69 6e 74 20 73 75 62 6d 65 6e 75 43 6f 6d c int submenuCom
2a40: 70 61 72 65 28 63 6f 6e 73 74 20 76 6f 69 64 20 pare(const void
2a50: 2a 61 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a *a, const void *
2a60: 62 29 7b 0a 20 20 63 6f 6e 73 74 20 73 74 72 75 b){. const stru
2a70: 63 74 20 53 75 62 6d 65 6e 75 20 2a 41 20 3d 20 ct Submenu *A =
2a80: 28 63 6f 6e 73 74 20 73 74 72 75 63 74 20 53 75 (const struct Su
2a90: 62 6d 65 6e 75 2a 29 61 3b 0a 20 20 63 6f 6e 73 bmenu*)a;. cons
2aa0: 74 20 73 74 72 75 63 74 20 53 75 62 6d 65 6e 75 t struct Submenu
2ab0: 20 2a 42 20 3d 20 28 63 6f 6e 73 74 20 73 74 72 *B = (const str
2ac0: 75 63 74 20 53 75 62 6d 65 6e 75 2a 29 62 3b 0a uct Submenu*)b;.
2ad0: 20 20 72 65 74 75 72 6e 20 66 6f 73 73 69 6c 5f return fossil_
2ae0: 73 74 72 63 6d 70 28 41 2d 3e 7a 4c 61 62 65 6c strcmp(A->zLabel
2af0: 2c 20 42 2d 3e 7a 4c 61 62 65 6c 29 3b 0a 7d 0a , B->zLabel);.}.
2b00: 0a 2f 2a 20 55 73 65 20 74 68 69 73 20 66 6f 72 ./* Use this for
2b10: 20 74 68 65 20 24 63 75 72 72 65 6e 74 5f 70 61 the $current_pa
2b20: 67 65 20 76 61 72 69 61 62 6c 65 20 69 66 20 69 ge variable if i
2b30: 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 20 20 t is not NULL.
2b40: 49 66 20 69 74 0a 2a 2a 20 69 73 20 4e 55 4c 4c If it.** is NULL
2b50: 20 74 68 65 6e 20 75 73 65 20 67 2e 7a 50 61 74 then use g.zPat
2b60: 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 h..*/.static cha
2b70: 72 20 2a 6c 6f 63 61 6c 5f 7a 43 75 72 72 65 6e r *local_zCurren
2b80: 74 50 61 67 65 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a tPage = 0;../*.*
2b90: 2a 20 53 65 74 20 74 68 65 20 64 65 73 69 72 65 * Set the desire
2ba0: 64 20 24 63 75 72 72 65 6e 74 5f 70 61 67 65 20 d $current_page
2bb0: 74 6f 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 to something oth
2bc0: 65 72 20 74 68 61 6e 20 67 2e 7a 50 61 74 68 0a er than g.zPath.
2bd0: 2a 2f 0a 76 6f 69 64 20 73 74 79 6c 65 5f 73 65 */.void style_se
2be0: 74 5f 63 75 72 72 65 6e 74 5f 70 61 67 65 28 63 t_current_page(c
2bf0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d onst char *zForm
2c00: 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 66 6f 73 73 at, ...){. foss
2c10: 69 6c 5f 66 72 65 65 28 6c 6f 63 61 6c 5f 7a 43 il_free(local_zC
2c20: 75 72 72 65 6e 74 50 61 67 65 29 3b 0a 20 20 69 urrentPage);. i
2c30: 66 28 20 7a 46 6f 72 6d 61 74 3d 3d 30 20 29 7b f( zFormat==0 ){
2c40: 0a 20 20 20 20 6c 6f 63 61 6c 5f 7a 43 75 72 72 . local_zCurr
2c50: 65 6e 74 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d entPage = 0;. }
2c60: 65 6c 73 65 7b 0a 20 20 20 20 76 61 5f 6c 69 73 else{. va_lis
2c70: 74 20 61 70 3b 0a 20 20 20 20 76 61 5f 73 74 61 t ap;. va_sta
2c80: 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b rt(ap, zFormat);
2c90: 0a 20 20 20 20 6c 6f 63 61 6c 5f 7a 43 75 72 72 . local_zCurr
2ca0: 65 6e 74 50 61 67 65 20 3d 20 76 6d 70 72 69 6e entPage = vmprin
2cb0: 74 66 28 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b tf(zFormat, ap);
2cc0: 0a 20 20 20 20 76 61 5f 65 6e 64 28 61 70 29 3b . va_end(ap);
2cd0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 . }.}../*.** Cr
2ce0: 65 61 74 65 20 61 20 54 48 31 20 76 61 72 69 61 eate a TH1 varia
2cf0: 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 ble containing t
2d00: 68 65 20 55 52 4c 20 66 6f 72 20 74 68 65 20 73 he URL for the s
2d10: 70 65 63 69 66 69 65 64 20 63 6f 6e 66 69 67 0a pecified config.
2d20: 2a 2a 20 72 65 73 6f 75 72 63 65 2e 20 54 68 65 ** resource. The
2d30: 20 72 65 73 75 6c 74 69 6e 67 20 76 61 72 69 61 resulting varia
2d40: 62 6c 65 20 6e 61 6d 65 20 77 69 6c 6c 20 62 65 ble name will be
2d50: 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 20 of the form.**
2d60: 24 5b 7a 56 61 72 50 72 65 66 69 78 5d 5f 75 72 $[zVarPrefix]_ur
2d70: 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 l..*/.static voi
2d80: 64 20 75 72 6c 5f 76 61 72 28 0a 20 20 63 6f 6e d url_var(. con
2d90: 73 74 20 63 68 61 72 20 2a 7a 56 61 72 50 72 65 st char *zVarPre
2da0: 66 69 78 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 fix,. const cha
2db0: 72 20 2a 7a 43 6f 6e 66 69 67 4e 61 6d 65 2c 0a r *zConfigName,.
2dc0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 const char *zP
2dd0: 61 67 65 4e 61 6d 65 0a 29 7b 0a 20 20 63 68 61 ageName.){. cha
2de0: 72 20 2a 7a 56 61 72 4e 61 6d 65 20 3d 20 6d 70 r *zVarName = mp
2df0: 72 69 6e 74 66 28 22 25 73 5f 75 72 6c 22 2c 20 rintf("%s_url",
2e00: 7a 56 61 72 50 72 65 66 69 78 29 3b 0a 20 20 63 zVarPrefix);. c
2e10: 68 61 72 20 2a 7a 55 72 6c 20 3d 20 30 3b 20 20 har *zUrl = 0;
2e20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 /* s
2e30: 74 79 6c 65 73 68 65 65 74 20 55 52 4c 20 2a 2f tylesheet URL */
2e40: 0a 20 20 69 6e 74 20 68 61 73 42 75 69 6c 74 69 . int hasBuilti
2e50: 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 n = 0;
2e60: 2f 2a 20 74 72 75 65 20 66 6f 72 20 62 75 69 6c /* true for buil
2e70: 74 2d 69 6e 20 70 61 67 65 2d 73 70 65 63 69 66 t-in page-specif
2e80: 69 63 20 43 53 53 20 2a 2f 0a 0a 20 20 69 66 28 ic CSS */.. if(
2e90: 30 3d 3d 73 74 72 63 6d 70 28 22 63 73 73 22 2c 0==strcmp("css",
2ea0: 7a 43 6f 6e 66 69 67 4e 61 6d 65 29 29 7b 0a 20 zConfigName)){.
2eb0: 20 20 20 2f 2a 20 41 63 63 6f 75 6e 74 20 66 6f /* Account fo
2ec0: 72 20 70 61 67 65 2d 73 70 65 63 69 66 69 63 20 r page-specific
2ed0: 43 53 53 2c 20 61 70 70 65 6e 64 69 6e 67 20 61 CSS, appending a
2ee0: 20 2f 7b 7b 67 2e 7a 50 61 74 68 7d 7d 20 74 6f /{{g.zPath}} to
2ef0: 20 74 68 65 0a 20 20 20 20 2a 2a 20 75 72 6c 20 the. ** url
2f00: 6f 6e 6c 79 20 69 66 20 77 65 20 68 61 76 65 20 only if we have
2f10: 61 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 a corresponding
2f20: 62 75 69 6c 74 2d 69 6e 20 70 61 67 65 2d 73 70 built-in page-sp
2f30: 65 63 69 66 69 63 20 43 53 53 0a 20 20 20 20 2a ecific CSS. *
2f40: 2a 20 66 69 6c 65 2e 20 44 6f 20 6e 6f 74 20 61 * file. Do not a
2f50: 70 70 65 6e 64 20 69 74 20 74 6f 20 61 6c 6c 20 ppend it to all
2f60: 70 61 67 65 73 20 62 65 63 61 75 73 65 20 77 65 pages because we
2f70: 20 77 6f 75 6c 64 0a 20 20 20 20 2a 2a 20 65 66 would. ** ef
2f80: 66 65 63 74 69 76 65 6c 79 20 63 61 63 68 65 2d fectively cache-
2f90: 62 75 73 74 20 61 6c 6c 20 70 61 67 65 73 20 77 bust all pages w
2fa0: 68 69 63 68 20 64 6f 20 6e 6f 74 20 68 61 76 65 hich do not have
2fb0: 0a 20 20 20 20 2a 2a 20 70 61 67 65 2d 73 70 65 . ** page-spe
2fc0: 63 69 66 69 63 20 43 53 53 2e 20 2a 2f 0a 20 20 cific CSS. */.
2fd0: 20 20 63 68 61 72 20 2a 20 7a 42 75 69 6c 74 69 char * zBuilti
2fe0: 6e 20 3d 20 6d 70 72 69 6e 74 66 28 22 73 74 79 n = mprintf("sty
2ff0: 6c 65 2e 25 73 2e 63 73 73 22 2c 20 67 2e 7a 50 le.%s.css", g.zP
3000: 61 74 68 29 3b 0a 20 20 20 20 68 61 73 42 75 69 ath);. hasBui
3010: 6c 74 69 6e 20 3d 20 62 75 69 6c 74 69 6e 5f 66 ltin = builtin_f
3020: 69 6c 65 28 7a 42 75 69 6c 74 69 6e 2c 30 29 21 ile(zBuiltin,0)!
3030: 3d 30 3b 0a 20 20 20 20 66 6f 73 73 69 6c 5f 66 =0;. fossil_f
3040: 72 65 65 28 7a 42 75 69 6c 74 69 6e 29 3b 0a 20 ree(zBuiltin);.
3050: 20 7d 0a 20 20 7a 55 72 6c 20 3d 20 6d 70 72 69 }. zUrl = mpri
3060: 6e 74 66 28 22 25 52 2f 25 73 25 73 25 73 3f 69 ntf("%R/%s%s%s?i
3070: 64 3d 25 78 22 2c 20 7a 50 61 67 65 4e 61 6d 65 d=%x", zPageName
3080: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,.
3090: 20 20 20 68 61 73 42 75 69 6c 74 69 6e 20 3f 20 hasBuiltin ?
30a0: 22 2f 22 20 3a 20 22 22 2c 20 68 61 73 42 75 69 "/" : "", hasBui
30b0: 6c 74 69 6e 20 3f 20 67 2e 7a 50 61 74 68 20 3a ltin ? g.zPath :
30c0: 20 22 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 "",.
30d0: 20 20 20 20 20 20 73 6b 69 6e 5f 69 64 28 7a 43 skin_id(zC
30e0: 6f 6e 66 69 67 4e 61 6d 65 29 29 3b 0a 20 20 54 onfigName));. T
30f0: 68 5f 53 74 6f 72 65 28 7a 56 61 72 4e 61 6d 65 h_Store(zVarName
3100: 2c 20 7a 55 72 6c 29 3b 0a 20 20 66 6f 73 73 69 , zUrl);. fossi
3110: 6c 5f 66 72 65 65 28 7a 55 72 6c 29 3b 0a 20 20 l_free(zUrl);.
3120: 66 6f 73 73 69 6c 5f 66 72 65 65 28 7a 56 61 72 fossil_free(zVar
3130: 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 Name);.}../*.**
3140: 43 72 65 61 74 65 20 61 20 54 48 31 20 76 61 72 Create a TH1 var
3150: 69 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 iable containing
3160: 20 74 68 65 20 55 52 4c 20 66 6f 72 20 74 68 65 the URL for the
3170: 20 73 70 65 63 69 66 69 65 64 20 63 6f 6e 66 69 specified confi
3180: 67 20 69 6d 61 67 65 2e 0a 2a 2a 20 54 68 65 20 g image..** The
3190: 72 65 73 75 6c 74 69 6e 67 20 76 61 72 69 61 62 resulting variab
31a0: 6c 65 20 6e 61 6d 65 20 77 69 6c 6c 20 62 65 20 le name will be
31b0: 6f 66 20 74 68 65 20 66 6f 72 6d 20 24 5b 7a 49 of the form $[zI
31c0: 6d 61 67 65 4e 61 6d 65 5d 5f 69 6d 61 67 65 5f mageName]_image_
31d0: 75 72 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 url..*/.static v
31e0: 6f 69 64 20 69 6d 61 67 65 5f 75 72 6c 5f 76 61 oid image_url_va
31f0: 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 r(const char *zI
3200: 6d 61 67 65 4e 61 6d 65 29 7b 0a 20 20 63 68 61 mageName){. cha
3210: 72 20 2a 7a 56 61 72 50 72 65 66 69 78 20 3d 20 r *zVarPrefix =
3220: 6d 70 72 69 6e 74 66 28 22 25 73 5f 69 6d 61 67 mprintf("%s_imag
3230: 65 22 2c 20 7a 49 6d 61 67 65 4e 61 6d 65 29 3b e", zImageName);
3240: 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6e 66 69 67 . char *zConfig
3250: 4e 61 6d 65 20 3d 20 6d 70 72 69 6e 74 66 28 22 Name = mprintf("
3260: 25 73 2d 69 6d 61 67 65 22 2c 20 7a 49 6d 61 67 %s-image", zImag
3270: 65 4e 61 6d 65 29 3b 0a 20 20 75 72 6c 5f 76 61 eName);. url_va
3280: 72 28 7a 56 61 72 50 72 65 66 69 78 2c 20 7a 43 r(zVarPrefix, zC
3290: 6f 6e 66 69 67 4e 61 6d 65 2c 20 7a 49 6d 61 67 onfigName, zImag
32a0: 65 4e 61 6d 65 29 3b 0a 20 20 66 72 65 65 28 7a eName);. free(z
32b0: 56 61 72 50 72 65 66 69 78 29 3b 0a 20 20 66 72 VarPrefix);. fr
32c0: 65 65 28 7a 43 6f 6e 66 69 67 4e 61 6d 65 29 3b ee(zConfigName);
32d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74 .}../*.** Output
32e0: 20 54 45 58 54 20 77 69 74 68 20 61 20 63 6c 69 TEXT with a cli
32f0: 63 6b 2d 74 6f 2d 63 6f 70 79 20 62 75 74 74 6f ck-to-copy butto
3300: 6e 20 6e 65 78 74 20 74 6f 20 69 74 2e 20 4c 6f n next to it. Lo
3310: 61 64 73 20 74 68 65 20 63 6f 70 79 62 74 6e 2e ads the copybtn.
3320: 6a 73 0a 2a 2a 20 4a 61 76 61 73 63 72 69 70 74 js.** Javascript
3330: 20 6d 6f 64 75 6c 65 2c 20 61 6e 64 20 67 65 6e module, and gen
3340: 65 72 61 74 65 73 20 48 54 4d 4c 20 65 6c 65 6d erates HTML elem
3350: 65 6e 74 73 20 77 69 74 68 20 74 68 65 20 66 6f ents with the fo
3360: 6c 6c 6f 77 69 6e 67 20 49 44 73 3a 0a 2a 2a 0a llowing IDs:.**.
3370: 2a 2a 20 20 20 20 54 41 52 47 45 54 49 44 3a 20 ** TARGETID:
3380: 20 20 20 20 20 20 54 68 65 20 3c 73 70 61 6e 3e The <span>
3390: 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20 wrapper around
33a0: 54 45 58 54 2e 0a 2a 2a 20 20 20 20 63 6f 70 79 TEXT..** copy
33b0: 2d 54 41 52 47 45 54 49 44 3a 20 20 54 68 65 20 -TARGETID: The
33c0: 3c 73 70 61 6e 3e 20 66 6f 72 20 74 68 65 20 63 <span> for the c
33d0: 6f 70 79 20 62 75 74 74 6f 6e 2e 0a 2a 2a 0a 2a opy button..**.*
33e0: 2a 20 49 66 20 74 68 65 20 46 4c 49 50 50 45 44 * If the FLIPPED
33f0: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e argument is non
3400: 2d 7a 65 72 6f 2c 20 74 68 65 20 63 6f 70 79 20 -zero, the copy
3410: 62 75 74 74 6f 6e 20 69 73 20 64 69 73 70 6c 61 button is displa
3420: 79 65 64 20 61 66 74 65 72 20 54 45 58 54 2e 0a yed after TEXT..
3430: 2a 2a 0a 2a 2a 20 54 68 65 20 43 4f 50 59 4c 45 **.** The COPYLE
3440: 4e 47 54 48 20 61 72 67 75 6d 65 6e 74 20 64 65 NGTH argument de
3450: 66 69 6e 65 73 20 74 68 65 20 6c 65 6e 67 74 68 fines the length
3460: 20 6f 66 20 74 68 65 20 73 75 62 73 74 72 69 6e of the substrin
3470: 67 20 6f 66 20 54 45 58 54 20 63 6f 70 69 65 64 g of TEXT copied
3480: 20 74 6f 0a 2a 2a 20 63 6c 69 70 62 6f 61 72 64 to.** clipboard
3490: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 3c 3d 20 30 3a :.**.** <= 0:
34a0: 20 20 20 4e 6f 20 6c 69 6d 69 74 20 28 64 65 66 No limit (def
34b0: 61 75 6c 74 20 69 66 20 74 68 65 20 61 72 67 75 ault if the argu
34c0: 6d 65 6e 74 20 69 73 20 6f 6d 69 74 74 65 64 29 ment is omitted)
34d0: 2e 0a 2a 2a 20 20 20 20 3e 3d 20 33 3a 20 20 20 ..** >= 3:
34e0: 54 72 75 6e 63 61 74 65 20 54 45 58 54 20 61 66 Truncate TEXT af
34f0: 74 65 72 20 43 4f 50 59 4c 45 4e 47 54 48 20 28 ter COPYLENGTH (
3500: 73 69 6e 67 6c 65 2d 62 79 74 65 29 20 63 68 61 single-byte) cha
3510: 72 61 63 74 65 72 73 2e 0a 2a 2a 20 20 20 20 20 racters..**
3520: 20 20 31 3a 20 20 20 55 73 65 20 74 68 65 20 22 1: Use the "
3530: 68 61 73 68 2d 64 69 67 69 74 73 22 20 73 65 74 hash-digits" set
3540: 74 69 6e 67 20 61 73 20 74 68 65 20 6c 69 6d 69 ting as the limi
3550: 74 2e 0a 2a 2a 20 20 20 20 20 20 20 32 3a 20 20 t..** 2:
3560: 20 55 73 65 20 74 68 65 20 6c 65 6e 67 74 68 20 Use the length
3570: 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 appropriate for
3580: 55 52 4c 73 20 61 73 20 74 68 65 20 6c 69 6d 69 URLs as the limi
3590: 74 20 28 64 65 66 69 6e 65 64 20 61 74 0a 2a 2a t (defined at.**
35a0: 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6d 70 comp
35b0: 69 6c 65 2d 74 69 6d 65 20 62 79 20 46 4f 53 53 ile-time by FOSS
35c0: 49 4c 5f 48 41 53 48 5f 44 49 47 49 54 53 5f 55 IL_HASH_DIGITS_U
35d0: 52 4c 2c 20 64 65 66 61 75 6c 74 73 20 74 6f 20 RL, defaults to
35e0: 31 36 29 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 74 16)..*/.char *st
35f0: 79 6c 65 5f 63 6f 70 79 5f 62 75 74 74 6f 6e 28 yle_copy_button(
3600: 0a 20 20 69 6e 74 20 62 4f 75 74 70 75 74 43 47 . int bOutputCG
3610: 49 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f I, /* Do
3620: 6e 27 74 20 72 65 74 75 72 6e 20 72 65 73 75 6c n't return resul
3630: 74 2c 20 62 75 74 20 73 65 6e 64 20 74 6f 20 63 t, but send to c
3640: 67 69 5f 70 72 69 6e 74 66 28 29 2e 20 2a 2f 0a gi_printf(). */.
3650: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 const char *zT
3660: 61 72 67 65 74 49 64 2c 20 20 2f 2a 20 54 68 65 argetId, /* The
3670: 20 54 41 52 47 45 54 49 44 20 61 72 67 75 6d 65 TARGETID argume
3680: 6e 74 2e 20 2a 2f 0a 20 20 69 6e 74 20 62 46 6c nt. */. int bFl
3690: 69 70 70 65 64 2c 20 20 20 20 20 20 20 20 20 20 ipped,
36a0: 20 2f 2a 20 54 68 65 20 46 4c 49 50 50 45 44 20 /* The FLIPPED
36b0: 61 72 67 75 6d 65 6e 74 2e 20 2a 2f 0a 20 20 69 argument. */. i
36c0: 6e 74 20 63 63 68 4c 65 6e 67 74 68 2c 20 20 20 nt cchLength,
36d0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 43 4f /* The CO
36e0: 50 59 4c 45 4e 47 54 48 20 61 72 67 75 6d 65 6e PYLENGTH argumen
36f0: 74 2e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 t. */. const ch
3700: 61 72 20 2a 7a 54 65 78 74 46 6d 74 2c 20 20 20 ar *zTextFmt,
3710: 2f 2a 20 46 6f 72 6d 61 74 74 69 6e 67 20 6f 66 /* Formatting of
3720: 20 74 68 65 20 54 45 58 54 20 61 72 67 75 6d 65 the TEXT argume
3730: 6e 74 20 28 68 74 6d 6c 69 7a 65 64 29 2e 20 2a nt (htmlized). *
3740: 2f 0a 20 20 2e 2e 2e 20 20 20 20 20 20 20 20 20 /. ...
3750: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 /* F
3760: 6f 72 6d 61 74 74 69 6e 67 20 70 61 72 61 6d 65 ormatting parame
3770: 74 65 72 73 20 6f 66 20 74 68 65 20 54 45 58 54 ters of the TEXT
3780: 20 61 72 67 75 6d 65 6e 74 2e 20 2a 2f 0a 29 7b argument. */.){
3790: 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 . va_list ap;.
37a0: 20 63 68 61 72 20 2a 7a 54 65 78 74 3b 0a 20 20 char *zText;.
37b0: 63 68 61 72 20 2a 7a 52 65 73 75 6c 74 20 3d 20 char *zResult =
37c0: 30 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 0;. va_start(ap
37d0: 2c 7a 54 65 78 74 46 6d 74 29 3b 0a 20 20 7a 54 ,zTextFmt);. zT
37e0: 65 78 74 20 3d 20 76 6d 70 72 69 6e 74 66 28 7a ext = vmprintf(z
37f0: 54 65 78 74 46 6d 74 2f 2a 77 6f 72 6b 73 2d 6c TextFmt/*works-l
3800: 69 6b 65 3a 3f 2a 2f 2c 61 70 29 3b 0a 20 20 76 ike:?*/,ap);. v
3810: 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 69 66 28 a_end(ap);. if(
3820: 20 63 63 68 4c 65 6e 67 74 68 3d 3d 31 20 29 20 cchLength==1 )
3830: 63 63 68 4c 65 6e 67 74 68 20 3d 20 68 61 73 68 cchLength = hash
3840: 5f 64 69 67 69 74 73 28 30 29 3b 0a 20 20 65 6c _digits(0);. el
3850: 73 65 20 69 66 28 20 63 63 68 4c 65 6e 67 74 68 se if( cchLength
3860: 3d 3d 32 20 29 20 63 63 68 4c 65 6e 67 74 68 20 ==2 ) cchLength
3870: 3d 20 68 61 73 68 5f 64 69 67 69 74 73 28 31 29 = hash_digits(1)
3880: 3b 0a 20 20 69 66 28 20 21 62 46 6c 69 70 70 65 ;. if( !bFlippe
3890: 64 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 d ){. const c
38a0: 68 61 72 20 2a 7a 42 74 6e 46 6d 74 20 3d 0a 20 har *zBtnFmt =.
38b0: 20 20 20 20 20 22 3c 73 70 61 6e 20 63 6c 61 73 "<span clas
38c0: 73 3d 5c 22 6e 6f 62 72 5c 22 3e 22 0a 20 20 20 s=\"nobr\">".
38d0: 20 20 20 22 3c 73 70 61 6e 20 22 0a 20 20 20 20 "<span ".
38e0: 20 20 22 63 6c 61 73 73 3d 5c 22 63 6f 70 79 2d "class=\"copy-
38f0: 62 75 74 74 6f 6e 5c 22 20 22 0a 20 20 20 20 20 button\" ".
3900: 20 22 69 64 3d 5c 22 63 6f 70 79 2d 25 68 5c 22 "id=\"copy-%h\"
3910: 20 22 0a 20 20 20 20 20 20 22 64 61 74 61 2d 63 ". "data-c
3920: 6f 70 79 74 61 72 67 65 74 3d 5c 22 25 68 5c 22 opytarget=\"%h\"
3930: 20 22 0a 20 20 20 20 20 20 22 64 61 74 61 2d 63 ". "data-c
3940: 6f 70 79 6c 65 6e 67 74 68 3d 5c 22 25 64 5c 22 opylength=\"%d\"
3950: 3e 22 0a 20 20 20 20 20 20 22 3c 2f 73 70 61 6e >". "</span
3960: 3e 22 0a 20 20 20 20 20 20 22 3c 73 70 61 6e 20 >". "<span
3970: 69 64 3d 5c 22 25 68 5c 22 3e 22 0a 20 20 20 20 id=\"%h\">".
3980: 20 20 22 25 73 22 0a 20 20 20 20 20 20 22 3c 2f "%s". "</
3990: 73 70 61 6e 3e 22 0a 20 20 20 20 20 20 22 3c 2f span>". "</
39a0: 73 70 61 6e 3e 22 3b 0a 20 20 20 20 69 66 28 20 span>";. if(
39b0: 62 4f 75 74 70 75 74 43 47 49 20 29 7b 0a 20 20 bOutputCGI ){.
39c0: 20 20 20 20 63 67 69 5f 70 72 69 6e 74 66 28 0a cgi_printf(.
39d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
39e0: 20 20 7a 42 74 6e 46 6d 74 2f 2a 77 6f 72 6b 73 zBtnFmt/*works
39f0: 2d 6c 69 6b 65 3a 22 25 68 25 68 25 64 25 68 25 -like:"%h%h%d%h%
3a00: 73 22 2a 2f 2c 0a 20 20 20 20 20 20 20 20 20 20 s"*/,.
3a10: 20 20 20 20 20 20 20 20 7a 54 61 72 67 65 74 49 zTargetI
3a20: 64 2c 7a 54 61 72 67 65 74 49 64 2c 63 63 68 4c d,zTargetId,cchL
3a30: 65 6e 67 74 68 2c 7a 54 61 72 67 65 74 49 64 2c ength,zTargetId,
3a40: 7a 54 65 78 74 29 3b 0a 20 20 20 20 7d 65 6c 73 zText);. }els
3a50: 65 7b 0a 20 20 20 20 20 20 7a 52 65 73 75 6c 74 e{. zResult
3a60: 20 3d 20 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 = mprintf(.
3a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 42 zB
3a80: 74 6e 46 6d 74 2f 2a 77 6f 72 6b 73 2d 6c 69 6b tnFmt/*works-lik
3a90: 65 3a 22 25 68 25 68 25 64 25 68 25 73 22 2a 2f e:"%h%h%d%h%s"*/
3aa0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,.
3ab0: 20 20 20 20 7a 54 61 72 67 65 74 49 64 2c 7a 54 zTargetId,zT
3ac0: 61 72 67 65 74 49 64 2c 63 63 68 4c 65 6e 67 74 argetId,cchLengt
3ad0: 68 2c 7a 54 61 72 67 65 74 49 64 2c 7a 54 65 78 h,zTargetId,zTex
3ae0: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 t);. }. }els
3af0: 65 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 e{. const cha
3b00: 72 20 2a 7a 42 74 6e 46 6d 74 20 3d 0a 20 20 20 r *zBtnFmt =.
3b10: 20 20 20 22 3c 73 70 61 6e 20 63 6c 61 73 73 3d "<span class=
3b20: 5c 22 6e 6f 62 72 5c 22 3e 22 0a 20 20 20 20 20 \"nobr\">".
3b30: 20 22 3c 73 70 61 6e 20 69 64 3d 5c 22 25 68 5c "<span id=\"%h\
3b40: 22 3e 22 0a 20 20 20 20 20 20 22 25 73 22 0a 20 ">". "%s".
3b50: 20 20 20 20 20 22 3c 2f 73 70 61 6e 3e 22 0a 20 "</span>".
3b60: 20 20 20 20 20 22 3c 73 70 61 6e 20 22 0a 20 20 "<span ".
3b70: 20 20 20 20 22 63 6c 61 73 73 3d 5c 22 63 6f 70 "class=\"cop
3b80: 79 2d 62 75 74 74 6f 6e 20 63 6f 70 79 2d 62 75 y-button copy-bu
3b90: 74 74 6f 6e 2d 66 6c 69 70 70 65 64 5c 22 20 22 tton-flipped\" "
3ba0: 0a 20 20 20 20 20 20 22 69 64 3d 5c 22 63 6f 70 . "id=\"cop
3bb0: 79 2d 25 68 5c 22 20 22 0a 20 20 20 20 20 20 22 y-%h\" ". "
3bc0: 64 61 74 61 2d 63 6f 70 79 74 61 72 67 65 74 3d data-copytarget=
3bd0: 5c 22 25 68 5c 22 20 22 0a 20 20 20 20 20 20 22 \"%h\" ". "
3be0: 64 61 74 61 2d 63 6f 70 79 6c 65 6e 67 74 68 3d data-copylength=
3bf0: 5c 22 25 64 5c 22 3e 22 0a 20 20 20 20 20 20 22 \"%d\">". "
3c00: 3c 2f 73 70 61 6e 3e 22 0a 20 20 20 20 20 20 22 </span>". "
3c10: 3c 2f 73 70 61 6e 3e 22 3b 0a 20 20 20 20 69 66 </span>";. if
3c20: 28 20 62 4f 75 74 70 75 74 43 47 49 20 29 7b 0a ( bOutputCGI ){.
3c30: 20 20 20 20 20 20 63 67 69 5f 70 72 69 6e 74 66 cgi_printf
3c40: 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 (.
3c50: 20 20 20 20 7a 42 74 6e 46 6d 74 2f 2a 77 6f 72 zBtnFmt/*wor
3c60: 6b 73 2d 6c 69 6b 65 3a 22 25 68 25 73 25 68 25 ks-like:"%h%s%h%
3c70: 68 25 64 22 2a 2f 2c 0a 20 20 20 20 20 20 20 20 h%d"*/,.
3c80: 20 20 20 20 20 20 20 20 20 20 7a 54 61 72 67 65 zTarge
3c90: 74 49 64 2c 7a 54 65 78 74 2c 7a 54 61 72 67 65 tId,zText,zTarge
3ca0: 74 49 64 2c 7a 54 61 72 67 65 74 49 64 2c 63 63 tId,zTargetId,cc
3cb0: 68 4c 65 6e 67 74 68 29 3b 0a 20 20 20 20 7d 65 hLength);. }e
3cc0: 6c 73 65 7b 0a 20 20 20 20 20 20 7a 52 65 73 75 lse{. zResu
3cd0: 6c 74 20 3d 20 6d 70 72 69 6e 74 66 28 0a 20 20 lt = mprintf(.
3ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
3cf0: 7a 42 74 6e 46 6d 74 2f 2a 77 6f 72 6b 73 2d 6c zBtnFmt/*works-l
3d00: 69 6b 65 3a 22 25 68 25 73 25 68 25 68 25 64 22 ike:"%h%s%h%h%d"
3d10: 2a 2f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 */,.
3d20: 20 20 20 20 20 20 7a 54 61 72 67 65 74 49 64 2c zTargetId,
3d30: 7a 54 65 78 74 2c 7a 54 61 72 67 65 74 49 64 2c zText,zTargetId,
3d40: 7a 54 61 72 67 65 74 49 64 2c 63 63 68 4c 65 6e zTargetId,cchLen
3d50: 67 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a gth);. }. }.
3d60: 20 20 66 72 65 65 28 7a 54 65 78 74 29 3b 0a 20 free(zText);.
3d70: 20 73 74 79 6c 65 5f 63 6f 70 79 62 75 74 74 6f style_copybutto
3d80: 6e 5f 63 6f 6e 74 72 6f 6c 28 29 3b 0a 20 20 72 n_control();. r
3d90: 65 74 75 72 6e 20 7a 52 65 73 75 6c 74 3b 0a 7d eturn zResult;.}
3da0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 ../*.** Return a
3db0: 20 72 61 6e 64 6f 6d 20 6e 6f 6e 63 65 20 74 68 random nonce th
3dc0: 61 74 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 at is stored in
3dd0: 73 74 61 74 69 63 20 73 70 61 63 65 2e 20 20 46 static space. F
3de0: 6f 72 20 61 20 70 61 72 74 69 63 75 6c 61 72 0a or a particular.
3df0: 2a 2a 20 72 75 6e 2c 20 74 68 65 20 73 61 6d 65 ** run, the same
3e00: 20 6e 6f 6e 63 65 20 69 73 20 61 6c 77 61 79 73 nonce is always
3e10: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 63 68 returned..*/.ch
3e20: 61 72 20 2a 73 74 79 6c 65 5f 6e 6f 6e 63 65 28 ar *style_nonce(
3e30: 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20 void){. static
3e40: 63 68 61 72 20 7a 4e 6f 6e 63 65 5b 35 32 5d 3b char zNonce[52];
3e50: 0a 20 20 69 66 28 20 7a 4e 6f 6e 63 65 5b 30 5d . if( zNonce[0]
3e60: 3d 3d 30 20 29 7b 0a 20 20 20 20 75 6e 73 69 67 ==0 ){. unsig
3e70: 6e 65 64 20 63 68 61 72 20 7a 53 65 65 64 5b 32 ned char zSeed[2
3e80: 34 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 4];. sqlite3_
3e90: 72 61 6e 64 6f 6d 6e 65 73 73 28 32 34 2c 20 7a randomness(24, z
3ea0: 53 65 65 64 29 3b 0a 20 20 20 20 65 6e 63 6f 64 Seed);. encod
3eb0: 65 31 36 28 7a 53 65 65 64 2c 28 75 6e 73 69 67 e16(zSeed,(unsig
3ec0: 6e 65 64 20 63 68 61 72 2a 29 7a 4e 6f 6e 63 65 ned char*)zNonce
3ed0: 2c 32 34 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 ,24);. }. retu
3ee0: 72 6e 20 7a 4e 6f 6e 63 65 3b 0a 7d 0a 0a 2f 2a rn zNonce;.}../*
3ef0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 .** Return the d
3f00: 65 66 61 75 6c 74 20 43 6f 6e 74 65 6e 74 20 53 efault Content S
3f10: 65 63 75 72 69 74 79 20 50 6f 6c 69 63 79 20 28 ecurity Policy (
3f20: 43 53 50 29 20 73 74 72 69 6e 67 2e 0a 2a 2a 20 CSP) string..**
3f30: 49 66 20 74 68 65 20 74 6f 48 65 61 64 65 72 20 If the toHeader
3f40: 61 72 67 75 6d 65 6e 74 20 69 73 20 74 72 75 65 argument is true
3f50: 2c 20 74 68 65 6e 20 61 6c 73 6f 20 61 64 64 20 , then also add
3f60: 74 68 65 0a 2a 2a 20 43 53 50 20 74 6f 20 74 68 the.** CSP to th
3f70: 65 20 48 54 54 50 20 72 65 70 6c 79 20 68 65 61 e HTTP reply hea
3f80: 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 43 der..**.** The C
3f90: 53 50 20 63 6f 6d 65 73 20 66 72 6f 6d 20 74 68 SP comes from th
3fa0: 65 20 22 64 65 66 61 75 6c 74 2d 63 73 70 22 20 e "default-csp"
3fb0: 73 65 74 74 69 6e 67 20 69 66 20 69 74 20 65 78 setting if it ex
3fc0: 69 73 74 73 20 61 6e 64 0a 2a 2a 20 69 73 20 6e ists and.** is n
3fd0: 6f 6e 2d 65 6d 70 74 79 2e 20 20 49 66 20 74 68 on-empty. If th
3fe0: 61 74 20 73 65 74 74 69 6e 67 20 69 73 20 61 6e at setting is an
3ff0: 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2c 20 74 empty string, t
4000: 68 65 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e hen the followin
4010: 67 0a 2a 2a 20 64 65 66 61 75 6c 74 20 69 73 20 g.** default is
4020: 75 73 65 64 20 69 6e 73 74 65 61 64 3a 0a 2a 2a used instead:.**
4030: 0a 2a 2a 20 20 20 20 20 64 65 66 61 75 6c 74 2d .** default-
4040: 73 72 63 20 27 73 65 6c 66 27 20 64 61 74 61 3a src 'self' data:
4050: 3b 0a 2a 2a 20 20 20 20 20 73 63 72 69 70 74 2d ;.** script-
4060: 73 72 63 20 27 73 65 6c 66 27 20 27 6e 6f 6e 63 src 'self' 'nonc
4070: 65 2d 24 6e 6f 6e 63 65 27 3b 0a 2a 2a 20 20 20 e-$nonce';.**
4080: 20 20 73 74 79 6c 65 2d 73 72 63 20 27 73 65 6c style-src 'sel
4090: 66 27 20 27 75 6e 73 61 66 65 2d 69 6e 6c 69 6e f' 'unsafe-inlin
40a0: 65 27 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 e';.**.** The te
40b0: 78 74 20 27 24 6e 6f 6e 63 65 27 20 69 73 20 72 xt '$nonce' is r
40c0: 65 70 6c 61 63 65 64 20 62 79 20 73 74 79 6c 65 eplaced by style
40d0: 5f 6e 6f 6e 63 65 28 29 20 69 66 20 61 6e 64 20 _nonce() if and
40e0: 77 68 65 72 65 65 76 65 72 20 69 74 0a 2a 2a 20 whereever it.**
40f0: 6f 63 63 75 72 73 20 69 6e 20 74 68 65 20 69 6e occurs in the in
4100: 70 75 74 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a put string..**.*
4110: 2a 20 54 68 65 20 73 74 72 69 6e 67 20 72 65 74 * The string ret
4120: 75 72 6e 65 64 20 69 73 20 6f 62 74 61 69 6e 65 urned is obtaine
4130: 64 20 66 72 6f 6d 20 66 6f 73 73 69 6c 5f 6d 61 d from fossil_ma
4140: 6c 6c 6f 63 28 29 20 61 6e 64 0a 2a 2a 20 73 68 lloc() and.** sh
4150: 6f 75 6c 64 20 62 65 20 72 65 6c 65 61 73 65 64 ould be released
4160: 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a by the caller..
4170: 2a 2f 0a 63 68 61 72 20 2a 73 74 79 6c 65 5f 63 */.char *style_c
4180: 73 70 28 69 6e 74 20 74 6f 48 65 61 64 65 72 29 sp(int toHeader)
4190: 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 {. static const
41a0: 20 63 68 61 72 20 7a 42 61 63 6b 75 70 43 53 50 char zBackupCSP
41b0: 5b 5d 20 3d 20 0a 20 20 20 22 64 65 66 61 75 6c [] = . "defaul
41c0: 74 2d 73 72 63 20 27 73 65 6c 66 27 20 64 61 74 t-src 'self' dat
41d0: 61 3a 3b 20 22 0a 20 20 20 22 73 63 72 69 70 74 a:; ". "script
41e0: 2d 73 72 63 20 27 73 65 6c 66 27 20 27 6e 6f 6e -src 'self' 'non
41f0: 63 65 2d 24 6e 6f 6e 63 65 27 3b 20 22 0a 20 20 ce-$nonce'; ".
4200: 20 22 73 74 79 6c 65 2d 73 72 63 20 27 73 65 6c "style-src 'sel
4210: 66 27 20 27 75 6e 73 61 66 65 2d 69 6e 6c 69 6e f' 'unsafe-inlin
4220: 65 27 22 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 e'";. const cha
4230: 72 20 2a 7a 46 6f 72 6d 61 74 20 3d 20 64 62 5f r *zFormat = db_
4240: 67 65 74 28 22 64 65 66 61 75 6c 74 2d 63 73 70 get("default-csp
4250: 22 2c 22 22 29 3b 0a 20 20 42 6c 6f 62 20 63 73 ","");. Blob cs
4260: 70 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 6f 6e 63 p;. char *zNonc
4270: 65 3b 0a 20 20 63 68 61 72 20 2a 7a 43 73 70 3b e;. char *zCsp;
4280: 0a 20 20 69 66 28 20 7a 46 6f 72 6d 61 74 5b 30 . if( zFormat[0
4290: 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 46 6f 72 ]==0 ){. zFor
42a0: 6d 61 74 20 3d 20 7a 42 61 63 6b 75 70 43 53 50 mat = zBackupCSP
42b0: 3b 0a 20 20 7d 0a 20 20 62 6c 6f 62 5f 69 6e 69 ;. }. blob_ini
42c0: 74 28 26 63 73 70 2c 20 30 2c 20 30 29 3b 0a 20 t(&csp, 0, 0);.
42d0: 20 77 68 69 6c 65 28 20 7a 46 6f 72 6d 61 74 5b while( zFormat[
42e0: 30 5d 20 26 26 20 28 7a 4e 6f 6e 63 65 20 3d 20 0] && (zNonce =
42f0: 73 74 72 73 74 72 28 7a 46 6f 72 6d 61 74 2c 22 strstr(zFormat,"
4300: 24 6e 6f 6e 63 65 22 29 29 21 3d 30 20 29 7b 0a $nonce"))!=0 ){.
4310: 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 28 blob_append(
4320: 26 63 73 70 2c 20 7a 46 6f 72 6d 61 74 2c 20 28 &csp, zFormat, (
4330: 69 6e 74 29 28 7a 4e 6f 6e 63 65 20 2d 20 7a 46 int)(zNonce - zF
4340: 6f 72 6d 61 74 29 29 3b 0a 20 20 20 20 62 6c 6f ormat));. blo
4350: 62 5f 61 70 70 65 6e 64 28 26 63 73 70 2c 20 73 b_append(&csp, s
4360: 74 79 6c 65 5f 6e 6f 6e 63 65 28 29 2c 20 2d 31 tyle_nonce(), -1
4370: 29 3b 0a 20 20 20 20 7a 46 6f 72 6d 61 74 20 3d );. zFormat =
4380: 20 7a 4e 6f 6e 63 65 20 2b 20 36 3b 0a 20 20 7d zNonce + 6;. }
4390: 0a 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 28 26 . blob_append(&
43a0: 63 73 70 2c 20 7a 46 6f 72 6d 61 74 2c 20 2d 31 csp, zFormat, -1
43b0: 29 3b 0a 20 20 7a 43 73 70 20 3d 20 62 6c 6f 62 );. zCsp = blob
43c0: 5f 73 74 72 28 26 63 73 70 29 3b 0a 20 20 69 66 _str(&csp);. if
43d0: 28 20 74 6f 48 65 61 64 65 72 20 29 7b 0a 20 20 ( toHeader ){.
43e0: 20 20 63 67 69 5f 70 72 69 6e 74 66 5f 68 65 61 cgi_printf_hea
43f0: 64 65 72 28 22 43 6f 6e 74 65 6e 74 2d 53 65 63 der("Content-Sec
4400: 75 72 69 74 79 2d 50 6f 6c 69 63 79 3a 20 25 73 urity-Policy: %s
4410: 5c 72 5c 6e 22 2c 20 7a 43 73 70 29 3b 0a 20 20 \r\n", zCsp);.
4420: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 43 73 70 3b }. return zCsp;
4430: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 61 75 6c .}../*.** Defaul
4440: 74 20 48 54 4d 4c 20 70 61 67 65 20 68 65 61 64 t HTML page head
4450: 65 72 20 74 65 78 74 20 74 68 72 6f 75 67 68 20 er text through
4460: 3c 62 6f 64 79 3e 2e 20 20 49 66 20 74 68 65 20 <body>. If the
4470: 72 65 70 6f 73 69 74 6f 72 79 2d 73 70 65 63 69 repository-speci
4480: 66 69 63 0a 2a 2a 20 68 65 61 64 65 72 20 74 65 fic.** header te
4490: 6d 70 6c 61 74 65 20 6c 61 63 6b 73 20 61 20 3c mplate lacks a <
44a0: 62 6f 64 79 3e 20 74 61 67 2c 20 74 68 65 6e 20 body> tag, then
44b0: 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f all of the follo
44c0: 77 69 6e 67 20 69 73 0a 2a 2a 20 70 72 65 70 65 wing is.** prepe
44d0: 6e 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 nded..*/.static
44e0: 63 68 61 72 20 7a 44 66 6c 74 48 65 61 64 65 72 char zDfltHeader
44f0: 5b 5d 20 3d 20 0a 40 20 3c 68 74 6d 6c 3e 0a 40 [] = .@ <html>.@
4500: 20 3c 68 65 61 64 3e 0a 40 20 3c 62 61 73 65 20 <head>.@ <base
4510: 68 72 65 66 3d 22 24 62 61 73 65 75 72 6c 2f 24 href="$baseurl/$
4520: 63 75 72 72 65 6e 74 5f 70 61 67 65 22 20 2f 3e current_page" />
4530: 0a 40 20 3c 6d 65 74 61 20 68 74 74 70 2d 65 71 .@ <meta http-eq
4540: 75 69 76 3d 22 43 6f 6e 74 65 6e 74 2d 53 65 63 uiv="Content-Sec
4550: 75 72 69 74 79 2d 50 6f 6c 69 63 79 22 20 63 6f urity-Policy" co
4560: 6e 74 65 6e 74 3d 22 24 64 65 66 61 75 6c 74 5f ntent="$default_
4570: 63 73 70 22 20 2f 3e 0a 40 20 3c 6d 65 74 61 20 csp" />.@ <meta
4580: 6e 61 6d 65 3d 22 76 69 65 77 70 6f 72 74 22 20 name="viewport"
4590: 63 6f 6e 74 65 6e 74 3d 22 77 69 64 74 68 3d 64 content="width=d
45a0: 65 76 69 63 65 2d 77 69 64 74 68 2c 20 69 6e 69 evice-width, ini
45b0: 74 69 61 6c 2d 73 63 61 6c 65 3d 31 2e 30 22 3e tial-scale=1.0">
45c0: 0a 40 20 3c 74 69 74 6c 65 3e 24 3c 70 72 6f 6a .@ <title>$<proj
45d0: 65 63 74 5f 6e 61 6d 65 3e 3a 20 24 3c 74 69 74 ect_name>: $<tit
45e0: 6c 65 3e 3c 2f 74 69 74 6c 65 3e 0a 40 20 3c 6c le></title>.@ <l
45f0: 69 6e 6b 20 72 65 6c 3d 22 61 6c 74 65 72 6e 61 ink rel="alterna
4600: 74 65 22 20 74 79 70 65 3d 22 61 70 70 6c 69 63 te" type="applic
4610: 61 74 69 6f 6e 2f 72 73 73 2b 78 6d 6c 22 20 74 ation/rss+xml" t
4620: 69 74 6c 65 3d 22 52 53 53 20 46 65 65 64 22 20 itle="RSS Feed"
4630: 5c 0a 40 20 20 68 72 65 66 3d 22 24 68 6f 6d 65 \.@ href="$home
4640: 2f 74 69 6d 65 6c 69 6e 65 2e 72 73 73 22 20 2f /timeline.rss" /
4650: 3e 0a 40 20 3c 6c 69 6e 6b 20 72 65 6c 3d 22 73 >.@ <link rel="s
4660: 74 79 6c 65 73 68 65 65 74 22 20 68 72 65 66 3d tylesheet" href=
4670: 22 24 73 74 79 6c 65 73 68 65 65 74 5f 75 72 6c "$stylesheet_url
4680: 22 20 74 79 70 65 3d 22 74 65 78 74 2f 63 73 73 " type="text/css
4690: 22 20 2f 3e 0a 40 20 3c 2f 68 65 61 64 3e 0a 40 " />.@ </head>.@
46a0: 20 3c 62 6f 64 79 3e 0a 3b 0a 0a 2f 2a 0a 2a 2a <body>.;../*.**
46b0: 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 6c 6c 20 Initialize all
46c0: 74 68 65 20 64 65 66 61 75 6c 74 20 54 48 31 20 the default TH1
46d0: 76 61 72 69 61 62 6c 65 73 0a 2a 2f 0a 73 74 61 variables.*/.sta
46e0: 74 69 63 20 76 6f 69 64 20 73 74 79 6c 65 5f 69 tic void style_i
46f0: 6e 69 74 5f 74 68 31 5f 76 61 72 73 28 63 6f 6e nit_th1_vars(con
4700: 73 74 20 63 68 61 72 20 2a 7a 54 69 74 6c 65 29 st char *zTitle)
4710: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a {. const char *
4720: 7a 4e 6f 6e 63 65 20 3d 20 73 74 79 6c 65 5f 6e zNonce = style_n
4730: 6f 6e 63 65 28 29 3b 0a 20 20 63 68 61 72 20 2a once();. char *
4740: 7a 44 66 6c 74 43 73 70 3b 0a 0a 20 20 7a 44 66 zDfltCsp;.. zDf
4750: 6c 74 43 73 70 20 3d 20 73 74 79 6c 65 5f 63 73 ltCsp = style_cs
4760: 70 28 31 29 3b 0a 20 20 2f 2a 0a 20 20 2a 2a 20 p(1);. /*. **
4770: 44 6f 20 6e 6f 74 20 6f 76 65 72 77 72 69 74 65 Do not overwrite
4780: 20 74 68 65 20 54 48 31 20 76 61 72 69 61 62 6c the TH1 variabl
4790: 65 20 22 64 65 66 61 75 6c 74 5f 63 73 70 22 20 e "default_csp"
47a0: 69 66 20 69 74 20 65 78 69 73 74 73 2c 20 61 73 if it exists, as
47b0: 20 74 68 69 73 0a 20 20 2a 2a 20 61 6c 6c 6f 77 this. ** allow
47c0: 73 20 69 74 20 74 6f 20 62 65 20 70 72 6f 70 65 s it to be prope
47d0: 72 6c 79 20 6f 76 65 72 72 69 64 64 65 6e 20 76 rly overridden v
47e0: 69 61 20 74 68 65 20 54 48 31 20 73 65 74 75 70 ia the TH1 setup
47f0: 20 73 63 72 69 70 74 20 28 69 2e 65 2e 20 69 74 script (i.e. it
4800: 0a 20 20 2a 2a 20 69 73 20 65 76 61 6c 75 61 74 . ** is evaluat
4810: 65 64 20 62 65 66 6f 72 65 20 74 68 65 20 68 65 ed before the he
4820: 61 64 65 72 20 69 73 20 72 65 6e 64 65 72 65 64 ader is rendered
4830: 29 2e 0a 20 20 2a 2f 0a 20 20 54 68 5f 4d 61 79 ).. */. Th_May
4840: 62 65 53 74 6f 72 65 28 22 64 65 66 61 75 6c 74 beStore("default
4850: 5f 63 73 70 22 2c 20 7a 44 66 6c 74 43 73 70 29 _csp", zDfltCsp)
4860: 3b 0a 20 20 66 6f 73 73 69 6c 5f 66 72 65 65 28 ;. fossil_free(
4870: 7a 44 66 6c 74 43 73 70 29 3b 0a 20 20 54 68 5f zDfltCsp);. Th_
4880: 53 74 6f 72 65 28 22 6e 6f 6e 63 65 22 2c 20 7a Store("nonce", z
4890: 4e 6f 6e 63 65 29 3b 0a 20 20 54 68 5f 53 74 6f Nonce);. Th_Sto
48a0: 72 65 28 22 70 72 6f 6a 65 63 74 5f 6e 61 6d 65 re("project_name
48b0: 22 2c 20 64 62 5f 67 65 74 28 22 70 72 6f 6a 65 ", db_get("proje
48c0: 63 74 2d 6e 61 6d 65 22 2c 22 55 6e 6e 61 6d 65 ct-name","Unname
48d0: 64 20 46 6f 73 73 69 6c 20 50 72 6f 6a 65 63 74 d Fossil Project
48e0: 22 29 29 3b 0a 20 20 54 68 5f 53 74 6f 72 65 28 "));. Th_Store(
48f0: 22 70 72 6f 6a 65 63 74 5f 64 65 73 63 72 69 70 "project_descrip
4900: 74 69 6f 6e 22 2c 20 64 62 5f 67 65 74 28 22 70 tion", db_get("p
4910: 72 6f 6a 65 63 74 2d 64 65 73 63 72 69 70 74 69 roject-descripti
4920: 6f 6e 22 2c 22 22 29 29 3b 0a 20 20 69 66 28 20 on",""));. if(
4930: 7a 54 69 74 6c 65 20 29 20 54 68 5f 53 74 6f 72 zTitle ) Th_Stor
4940: 65 28 22 74 69 74 6c 65 22 2c 20 7a 54 69 74 6c e("title", zTitl
4950: 65 29 3b 0a 20 20 54 68 5f 53 74 6f 72 65 28 22 e);. Th_Store("
4960: 62 61 73 65 75 72 6c 22 2c 20 67 2e 7a 42 61 73 baseurl", g.zBas
4970: 65 55 52 4c 29 3b 0a 20 20 54 68 5f 53 74 6f 72 eURL);. Th_Stor
4980: 65 28 22 73 65 63 75 72 65 75 72 6c 22 2c 20 66 e("secureurl", f
4990: 6f 73 73 69 6c 5f 77 61 6e 74 73 5f 68 74 74 70 ossil_wants_http
49a0: 73 28 31 29 3f 20 67 2e 7a 48 74 74 70 73 55 52 s(1)? g.zHttpsUR
49b0: 4c 3a 20 67 2e 7a 42 61 73 65 55 52 4c 29 3b 0a L: g.zBaseURL);.
49c0: 20 20 54 68 5f 53 74 6f 72 65 28 22 68 6f 6d 65 Th_Store("home
49d0: 22 2c 20 67 2e 7a 54 6f 70 29 3b 0a 20 20 54 68 ", g.zTop);. Th
49e0: 5f 53 74 6f 72 65 28 22 69 6e 64 65 78 5f 70 61 _Store("index_pa
49f0: 67 65 22 2c 20 64 62 5f 67 65 74 28 22 69 6e 64 ge", db_get("ind
4a00: 65 78 2d 70 61 67 65 22 2c 22 2f 68 6f 6d 65 22 ex-page","/home"
4a10: 29 29 3b 0a 20 20 69 66 28 20 6c 6f 63 61 6c 5f ));. if( local_
4a20: 7a 43 75 72 72 65 6e 74 50 61 67 65 3d 3d 30 20 zCurrentPage==0
4a30: 29 20 73 74 79 6c 65 5f 73 65 74 5f 63 75 72 72 ) style_set_curr
4a40: 65 6e 74 5f 70 61 67 65 28 22 25 54 22 2c 20 67 ent_page("%T", g
4a50: 2e 7a 50 61 74 68 29 3b 0a 20 20 54 68 5f 53 74 .zPath);. Th_St
4a60: 6f 72 65 28 22 63 75 72 72 65 6e 74 5f 70 61 67 ore("current_pag
4a70: 65 22 2c 20 6c 6f 63 61 6c 5f 7a 43 75 72 72 65 e", local_zCurre
4a80: 6e 74 50 61 67 65 29 3b 0a 20 20 54 68 5f 53 74 ntPage);. Th_St
4a90: 6f 72 65 28 22 63 73 72 66 5f 74 6f 6b 65 6e 22 ore("csrf_token"
4aa0: 2c 20 67 2e 7a 43 73 72 66 54 6f 6b 65 6e 29 3b , g.zCsrfToken);
4ab0: 0a 20 20 54 68 5f 53 74 6f 72 65 28 22 72 65 6c . Th_Store("rel
4ac0: 65 61 73 65 5f 76 65 72 73 69 6f 6e 22 2c 20 52 ease_version", R
4ad0: 45 4c 45 41 53 45 5f 56 45 52 53 49 4f 4e 29 3b ELEASE_VERSION);
4ae0: 0a 20 20 54 68 5f 53 74 6f 72 65 28 22 6d 61 6e . Th_Store("man
4af0: 69 66 65 73 74 5f 76 65 72 73 69 6f 6e 22 2c 20 ifest_version",
4b00: 4d 41 4e 49 46 45 53 54 5f 56 45 52 53 49 4f 4e MANIFEST_VERSION
4b10: 29 3b 0a 20 20 54 68 5f 53 74 6f 72 65 28 22 6d );. Th_Store("m
4b20: 61 6e 69 66 65 73 74 5f 64 61 74 65 22 2c 20 4d anifest_date", M
4b30: 41 4e 49 46 45 53 54 5f 44 41 54 45 29 3b 0a 20 ANIFEST_DATE);.
4b40: 20 54 68 5f 53 74 6f 72 65 28 22 63 6f 6d 70 69 Th_Store("compi
4b50: 6c 65 72 5f 6e 61 6d 65 22 2c 20 43 4f 4d 50 49 ler_name", COMPI
4b60: 4c 45 52 5f 4e 41 4d 45 29 3b 0a 20 20 75 72 6c LER_NAME);. url
4b70: 5f 76 61 72 28 22 73 74 79 6c 65 73 68 65 65 74 _var("stylesheet
4b80: 22 2c 20 22 63 73 73 22 2c 20 22 73 74 79 6c 65 ", "css", "style
4b90: 2e 63 73 73 22 29 3b 0a 20 20 69 6d 61 67 65 5f .css");. image_
4ba0: 75 72 6c 5f 76 61 72 28 22 6c 6f 67 6f 22 29 3b url_var("logo");
4bb0: 0a 20 20 69 6d 61 67 65 5f 75 72 6c 5f 76 61 72 . image_url_var
4bc0: 28 22 62 61 63 6b 67 72 6f 75 6e 64 22 29 3b 0a ("background");.
4bd0: 20 20 69 66 28 20 21 6c 6f 67 69 6e 5f 69 73 5f if( !login_is_
4be0: 6e 6f 62 6f 64 79 28 29 20 29 7b 0a 20 20 20 20 nobody() ){.
4bf0: 54 68 5f 53 74 6f 72 65 28 22 6c 6f 67 69 6e 22 Th_Store("login"
4c00: 2c 20 67 2e 7a 4c 6f 67 69 6e 29 3b 0a 20 20 7d , g.zLogin);. }
4c10: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 72 61 77 20 74 .}../*.** Draw t
4c20: 68 65 20 68 65 61 64 65 72 2e 0a 2a 2f 0a 76 6f he header..*/.vo
4c30: 69 64 20 73 74 79 6c 65 5f 68 65 61 64 65 72 28 id style_header(
4c40: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 69 74 const char *zTit
4c50: 6c 65 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a leFormat, ...){.
4c60: 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 va_list ap;.
4c70: 63 68 61 72 20 2a 7a 54 69 74 6c 65 3b 0a 20 20 char *zTitle;.
4c80: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 48 65 61 const char *zHea
4c90: 64 65 72 20 3d 20 73 6b 69 6e 5f 67 65 74 28 22 der = skin_get("
4ca0: 68 65 61 64 65 72 22 29 3b 0a 20 20 6c 6f 67 69 header");. logi
4cb0: 6e 5f 63 68 65 63 6b 5f 63 72 65 64 65 6e 74 69 n_check_credenti
4cc0: 61 6c 73 28 29 3b 0a 0a 20 20 76 61 5f 73 74 61 als();.. va_sta
4cd0: 72 74 28 61 70 2c 20 7a 54 69 74 6c 65 46 6f 72 rt(ap, zTitleFor
4ce0: 6d 61 74 29 3b 0a 20 20 7a 54 69 74 6c 65 20 3d mat);. zTitle =
4cf0: 20 76 6d 70 72 69 6e 74 66 28 7a 54 69 74 6c 65 vmprintf(zTitle
4d00: 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 Format, ap);. v
4d10: 61 5f 65 6e 64 28 61 70 29 3b 0a 0a 20 20 63 67 a_end(ap);.. cg
4d20: 69 5f 64 65 73 74 69 6e 61 74 69 6f 6e 28 43 47 i_destination(CG
4d30: 49 5f 48 45 41 44 45 52 29 3b 0a 0a 20 20 40 20 I_HEADER);.. @
4d40: 3c 21 44 4f 43 54 59 50 45 20 68 74 6d 6c 3e 0a <!DOCTYPE html>.
4d50: 0a 20 20 69 66 28 20 67 2e 74 68 54 72 61 63 65 . if( g.thTrace
4d60: 20 29 20 54 68 5f 54 72 61 63 65 28 22 42 45 47 ) Th_Trace("BEG
4d70: 49 4e 5f 48 45 41 44 45 52 3c 62 72 20 2f 3e 5c IN_HEADER<br />\
4d80: 6e 22 2c 20 2d 31 29 3b 0a 0a 20 20 2f 2a 20 47 n", -1);.. /* G
4d90: 65 6e 65 72 61 74 65 20 74 68 65 20 68 65 61 64 enerate the head
4da0: 65 72 20 75 70 20 74 68 72 6f 75 67 68 20 74 68 er up through th
4db0: 65 20 6d 61 69 6e 20 6d 65 6e 75 20 2a 2f 0a 20 e main menu */.
4dc0: 20 73 74 79 6c 65 5f 69 6e 69 74 5f 74 68 31 5f style_init_th1_
4dd0: 76 61 72 73 28 7a 54 69 74 6c 65 29 3b 0a 20 20 vars(zTitle);.
4de0: 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 6c if( sqlite3_strl
4df0: 69 6b 65 28 22 25 3c 62 6f 64 79 25 22 2c 20 7a ike("%<body%", z
4e00: 48 65 61 64 65 72 2c 20 30 29 21 3d 30 20 29 7b Header, 0)!=0 ){
4e10: 0a 20 20 20 20 54 68 5f 52 65 6e 64 65 72 28 7a . Th_Render(z
4e20: 44 66 6c 74 48 65 61 64 65 72 29 3b 0a 20 20 7d DfltHeader);. }
4e30: 0a 20 20 69 66 28 20 67 2e 74 68 54 72 61 63 65 . if( g.thTrace
4e40: 20 29 20 54 68 5f 54 72 61 63 65 28 22 42 45 47 ) Th_Trace("BEG
4e50: 49 4e 5f 48 45 41 44 45 52 5f 53 43 52 49 50 54 IN_HEADER_SCRIPT
4e60: 3c 62 72 20 2f 3e 5c 6e 22 2c 20 2d 31 29 3b 0a <br />\n", -1);.
4e70: 20 20 54 68 5f 52 65 6e 64 65 72 28 7a 48 65 61 Th_Render(zHea
4e80: 64 65 72 29 3b 0a 20 20 69 66 28 20 67 2e 74 68 der);. if( g.th
4e90: 54 72 61 63 65 20 29 20 54 68 5f 54 72 61 63 65 Trace ) Th_Trace
4ea0: 28 22 45 4e 44 5f 48 45 41 44 45 52 3c 62 72 20 ("END_HEADER<br
4eb0: 2f 3e 5c 6e 22 2c 20 2d 31 29 3b 0a 20 20 54 68 />\n", -1);. Th
4ec0: 5f 55 6e 73 74 6f 72 65 28 22 74 69 74 6c 65 22 _Unstore("title"
4ed0: 29 3b 20 20 20 2f 2a 20 41 76 6f 69 64 20 63 6f ); /* Avoid co
4ee0: 6c 6c 69 73 69 6f 6e 73 20 77 69 74 68 20 74 69 llisions with ti
4ef0: 63 6b 65 74 20 66 69 65 6c 64 20 6e 61 6d 65 73 cket field names
4f00: 20 2a 2f 0a 20 20 63 67 69 5f 64 65 73 74 69 6e */. cgi_destin
4f10: 61 74 69 6f 6e 28 43 47 49 5f 42 4f 44 59 29 3b ation(CGI_BODY);
4f20: 0a 20 20 67 2e 63 67 69 4f 75 74 70 75 74 20 3d . g.cgiOutput =
4f30: 20 31 3b 0a 20 20 68 65 61 64 65 72 48 61 73 42 1;. headerHasB
4f40: 65 65 6e 47 65 6e 65 72 61 74 65 64 20 3d 20 31 eenGenerated = 1
4f50: 3b 0a 20 20 73 69 64 65 62 6f 78 55 73 65 64 20 ;. sideboxUsed
4f60: 3d 20 30 3b 0a 20 20 69 66 28 20 67 2e 70 65 72 = 0;. if( g.per
4f70: 6d 2e 44 65 62 75 67 20 26 26 20 50 28 22 73 68 m.Debug && P("sh
4f80: 6f 77 71 70 22 29 20 29 7b 0a 20 20 20 20 40 20 owqp") ){. @
4f90: 3c 64 69 76 20 63 6c 61 73 73 3d 22 64 65 62 75 <div class="debu
4fa0: 67 22 3e 0a 20 20 20 20 63 67 69 5f 70 72 69 6e g">. cgi_prin
4fb0: 74 5f 61 6c 6c 28 30 2c 20 30 29 3b 0a 20 20 20 t_all(0, 0);.
4fc0: 20 40 20 3c 2f 64 69 76 3e 0a 20 20 7d 0a 7d 0a @ </div>. }.}.
4fd0: 0a 23 69 66 20 49 4e 54 45 52 46 41 43 45 0a 2f .#if INTERFACE./
4fe0: 2a 20 41 6c 6c 6f 77 65 64 20 70 61 72 61 6d 65 * Allowed parame
4ff0: 74 65 72 73 20 66 6f 72 20 73 74 79 6c 65 5f 61 ters for style_a
5000: 64 75 6e 69 74 28 29 20 2a 2f 0a 23 64 65 66 69 dunit() */.#defi
5010: 6e 65 20 41 44 55 4e 49 54 5f 4f 46 46 20 20 20 ne ADUNIT_OFF
5020: 20 20 20 20 20 30 78 30 30 30 31 20 20 20 20 20 0x0001
5030: 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f /* Do not allo
5040: 77 20 61 64 73 20 6f 6e 20 74 68 69 73 20 70 61 w ads on this pa
5050: 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 41 44 ge */.#define AD
5060: 55 4e 49 54 5f 52 49 47 48 54 5f 4f 4b 20 20 20 UNIT_RIGHT_OK
5070: 30 78 30 30 30 32 20 20 20 20 20 20 20 2f 2a 20 0x0002 /*
5080: 52 69 67 68 74 2d 73 69 64 65 20 76 65 72 74 69 Right-side verti
5090: 63 61 6c 20 61 64 73 20 6f 6b 20 68 65 72 65 20 cal ads ok here
50a0: 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a */.#endif../*.**
50b0: 20 56 61 72 69 6f 75 73 20 70 61 67 65 20 69 6d Various page im
50c0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 63 61 plementations ca
50d0: 6e 20 69 6e 76 6f 6b 65 20 74 68 69 73 20 69 6e n invoke this in
50e0: 74 65 72 66 61 63 65 20 74 6f 20 6c 65 74 20 74 terface to let t
50f0: 68 65 0a 2a 2a 20 73 74 79 6c 65 20 6d 61 6e 61 he.** style mana
5100: 67 65 72 20 6b 6e 6f 77 20 77 68 61 74 20 6b 69 ger know what ki
5110: 6e 64 73 20 6f 66 20 61 64 73 20 61 72 65 20 61 nds of ads are a
5120: 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74 ppropriate for t
5130: 68 69 73 20 70 61 67 65 2e 0a 2a 2f 0a 76 6f 69 his page..*/.voi
5140: 64 20 73 74 79 6c 65 5f 61 64 75 6e 69 74 5f 63 d style_adunit_c
5150: 6f 6e 66 69 67 28 75 6e 73 69 67 6e 65 64 20 69 onfig(unsigned i
5160: 6e 74 20 6d 46 6c 61 67 73 29 7b 0a 20 20 61 64 nt mFlags){. ad
5170: 55 6e 69 74 46 6c 61 67 73 20 3d 20 6d 46 6c 61 UnitFlags = mFla
5180: 67 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 gs;.}../*.** Ret
5190: 75 72 6e 20 74 68 65 20 74 65 78 74 20 6f 66 20 urn the text of
51a0: 61 6e 20 61 64 2d 75 6e 69 74 2c 20 69 66 20 6f an ad-unit, if o
51b0: 6e 65 20 73 68 6f 75 6c 64 20 62 65 20 72 65 6e ne should be ren
51c0: 64 65 72 65 64 2e 20 20 52 65 74 75 72 6e 0a 2a dered. Return.*
51d0: 2a 20 4e 55 4c 4c 20 69 66 20 6e 6f 20 61 64 2d * NULL if no ad-
51e0: 75 6e 69 74 20 69 73 20 64 65 73 69 72 65 64 2e unit is desired.
51f0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 2a 70 41 64 46 .**.** The *pAdF
5200: 6c 61 67 20 76 61 6c 75 65 20 6d 69 67 68 74 20 lag value might
5210: 62 65 20 73 65 74 20 74 6f 20 41 44 55 4e 49 54 be set to ADUNIT
5220: 5f 52 49 47 48 54 5f 4f 4b 20 69 66 20 74 68 69 _RIGHT_OK if thi
5230: 73 20 69 73 0a 2a 2a 20 61 20 72 69 67 68 74 2d s is.** a right-
5240: 68 61 6e 64 20 76 65 72 74 69 63 61 6c 20 61 64 hand vertical ad
5250: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 ..*/.static cons
5260: 74 20 63 68 61 72 20 2a 73 74 79 6c 65 5f 61 64 t char *style_ad
5270: 75 6e 69 74 5f 74 65 78 74 28 75 6e 73 69 67 6e unit_text(unsign
5280: 65 64 20 69 6e 74 20 2a 70 41 64 46 6c 61 67 29 ed int *pAdFlag)
5290: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a {. const char *
52a0: 7a 41 64 20 3d 20 30 3b 0a 20 20 2a 70 41 64 46 zAd = 0;. *pAdF
52b0: 6c 61 67 20 3d 20 30 3b 0a 20 20 69 66 28 20 61 lag = 0;. if( a
52c0: 64 55 6e 69 74 46 6c 61 67 73 20 26 20 41 44 55 dUnitFlags & ADU
52d0: 4e 49 54 5f 4f 46 46 20 29 20 72 65 74 75 72 6e NIT_OFF ) return
52e0: 20 30 3b 20 20 2f 2a 20 44 69 73 61 6c 6c 6f 77 0; /* Disallow
52f0: 20 61 64 73 20 6f 6e 20 74 68 69 73 20 70 61 67 ads on this pag
5300: 65 20 2a 2f 0a 20 20 69 66 28 20 64 62 5f 67 65 e */. if( db_ge
5310: 74 5f 62 6f 6f 6c 65 61 6e 28 22 61 64 75 6e 69 t_boolean("aduni
5320: 74 2d 64 69 73 61 62 6c 65 22 2c 30 29 20 29 20 t-disable",0) )
5330: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 return 0;. if(
5340: 67 2e 70 65 72 6d 2e 41 64 6d 69 6e 20 26 26 20 g.perm.Admin &&
5350: 64 62 5f 67 65 74 5f 62 6f 6f 6c 65 61 6e 28 22 db_get_boolean("
5360: 61 64 75 6e 69 74 2d 6f 6d 69 74 2d 69 66 2d 61 adunit-omit-if-a
5370: 64 6d 69 6e 22 2c 30 29 20 29 7b 0a 20 20 20 20 dmin",0) ){.
5380: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 return 0;. }.
5390: 69 66 28 20 21 6c 6f 67 69 6e 5f 69 73 5f 6e 6f if( !login_is_no
53a0: 62 6f 64 79 28 29 0a 20 20 20 26 26 20 66 6f 73 body(). && fos
53b0: 73 69 6c 5f 73 74 72 63 6d 70 28 67 2e 7a 4c 6f sil_strcmp(g.zLo
53c0: 67 69 6e 2c 22 61 6e 6f 6e 79 6d 6f 75 73 22 29 gin,"anonymous")
53d0: 21 3d 30 0a 20 20 20 26 26 20 64 62 5f 67 65 74 !=0. && db_get
53e0: 5f 62 6f 6f 6c 65 61 6e 28 22 61 64 75 6e 69 74 _boolean("adunit
53f0: 2d 6f 6d 69 74 2d 69 66 2d 75 73 65 72 22 2c 30 -omit-if-user",0
5400: 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 ). ){. retur
5410: 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 n 0;. }. if( (
5420: 61 64 55 6e 69 74 46 6c 61 67 73 20 26 20 41 44 adUnitFlags & AD
5430: 55 4e 49 54 5f 52 49 47 48 54 5f 4f 4b 29 21 3d UNIT_RIGHT_OK)!=
5440: 30 0a 20 20 20 26 26 20 21 66 6f 73 73 69 6c 5f 0. && !fossil_
5450: 61 6c 6c 5f 77 68 69 74 65 73 70 61 63 65 28 7a all_whitespace(z
5460: 41 64 20 3d 20 64 62 5f 67 65 74 28 22 61 64 75 Ad = db_get("adu
5470: 6e 69 74 2d 72 69 67 68 74 22 2c 20 30 29 29 0a nit-right", 0)).
5480: 20 20 20 26 26 20 21 63 67 69 5f 62 6f 64 79 5f && !cgi_body_
5490: 63 6f 6e 74 61 69 6e 73 28 22 3c 74 61 62 6c 65 contains("<table
54a0: 22 29 0a 20 20 29 7b 0a 20 20 20 20 2a 70 41 64 "). ){. *pAd
54b0: 46 6c 61 67 20 3d 20 41 44 55 4e 49 54 5f 52 49 Flag = ADUNIT_RI
54c0: 47 48 54 5f 4f 4b 3b 0a 20 20 20 20 72 65 74 75 GHT_OK;. retu
54d0: 72 6e 20 7a 41 64 3b 0a 20 20 7d 65 6c 73 65 20 rn zAd;. }else
54e0: 69 66 28 20 21 66 6f 73 73 69 6c 5f 61 6c 6c 5f if( !fossil_all_
54f0: 77 68 69 74 65 73 70 61 63 65 28 7a 41 64 20 3d whitespace(zAd =
5500: 20 64 62 5f 67 65 74 28 22 61 64 75 6e 69 74 22 db_get("adunit"
5510: 2c 30 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75 ,0)) ){. retu
5520: 72 6e 20 7a 41 64 3b 0a 20 20 7d 0a 20 20 72 65 rn zAd;. }. re
5530: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a turn 0;.}../*.**
5540: 20 49 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 Indicate that t
5550: 68 65 20 74 61 62 6c 65 2d 73 6f 72 74 69 6e 67 he table-sorting
5560: 20 6a 61 76 61 73 63 72 69 70 74 20 69 73 20 6e javascript is n
5570: 65 65 64 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 eeded..*/.void s
5580: 74 79 6c 65 5f 74 61 62 6c 65 5f 73 6f 72 74 65 tyle_table_sorte
5590: 72 28 76 6f 69 64 29 7b 0a 20 20 6e 65 65 64 53 r(void){. needS
55a0: 6f 72 74 4a 73 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a ortJs = 1;.}../*
55b0: 0a 2a 2a 20 49 6e 64 69 63 61 74 65 20 74 68 61 .** Indicate tha
55c0: 74 20 74 68 65 20 61 63 63 6f 72 64 69 6f 6e 20 t the accordion
55d0: 6a 61 76 61 73 63 72 69 70 74 20 69 73 20 6e 65 javascript is ne
55e0: 65 64 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 74 eded..*/.void st
55f0: 79 6c 65 5f 61 63 63 6f 72 64 69 6f 6e 28 76 6f yle_accordion(vo
5600: 69 64 29 7b 0a 20 20 6e 65 65 64 41 63 63 6f 72 id){. needAccor
5610: 64 69 6f 6e 4a 73 20 3d 20 31 3b 0a 7d 0a 0a 2f dionJs = 1;.}../
5620: 2a 0a 2a 2a 20 49 6e 64 69 63 61 74 65 20 74 68 *.** Indicate th
5630: 61 74 20 74 68 65 20 74 69 6d 65 6c 69 6e 65 20 at the timeline
5640: 67 72 61 70 68 20 6a 61 76 61 73 63 72 69 70 74 graph javascript
5650: 20 69 73 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 76 is needed..*/.v
5660: 6f 69 64 20 73 74 79 6c 65 5f 67 72 61 70 68 5f oid style_graph_
5670: 67 65 6e 65 72 61 74 6f 72 28 76 6f 69 64 29 7b generator(void){
5680: 0a 20 20 6e 65 65 64 47 72 61 70 68 4a 73 20 3d . needGraphJs =
5690: 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 1;.}../*.** Ind
56a0: 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20 63 icate that the c
56b0: 6f 70 79 20 62 75 74 74 6f 6e 20 6a 61 76 61 73 opy button javas
56c0: 63 72 69 70 74 20 69 73 20 6e 65 65 64 65 64 2e cript is needed.
56d0: 0a 2a 2f 0a 76 6f 69 64 20 73 74 79 6c 65 5f 63 .*/.void style_c
56e0: 6f 70 79 62 75 74 74 6f 6e 5f 63 6f 6e 74 72 6f opybutton_contro
56f0: 6c 28 76 6f 69 64 29 7b 0a 20 20 6e 65 65 64 43 l(void){. needC
5700: 6f 70 79 42 74 6e 4a 73 20 3d 20 31 3b 0a 7d 0a opyBtnJs = 1;.}.
5710: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 ./*.** Generate
5720: 63 6f 64 65 20 74 6f 20 6c 6f 61 64 20 61 20 73 code to load a s
5730: 69 6e 67 6c 65 20 6a 61 76 61 73 63 72 69 70 74 ingle javascript
5740: 20 66 69 6c 65 0a 2a 2f 0a 76 6f 69 64 20 73 74 file.*/.void st
5750: 79 6c 65 5f 6c 6f 61 64 5f 6f 6e 65 5f 6a 73 5f yle_load_one_js_
5760: 66 69 6c 65 28 63 6f 6e 73 74 20 63 68 61 72 20 file(const char
5770: 2a 7a 46 69 6c 65 29 7b 0a 20 20 40 20 3c 73 63 *zFile){. @ <sc
5780: 72 69 70 74 20 73 72 63 3d 27 25 52 2f 62 75 69 ript src='%R/bui
5790: 6c 74 69 6e 2f 25 73 28 7a 46 69 6c 65 29 3f 69 ltin/%s(zFile)?i
57a0: 64 3d 25 53 28 66 6f 73 73 69 6c 5f 65 78 65 5f d=%S(fossil_exe_
57b0: 69 64 28 29 29 27 3e 3c 2f 73 63 72 69 70 74 3e id())'></script>
57c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 20 65 78 .}../*.** All ex
57d0: 74 72 61 20 4a 53 20 66 69 6c 65 73 20 74 6f 20 tra JS files to
57e0: 6c 6f 61 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 load..*/.static
57f0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 4a 73 const char *azJs
5800: 54 6f 4c 6f 61 64 5b 34 5d 3b 0a 73 74 61 74 69 ToLoad[4];.stati
5810: 63 20 69 6e 74 20 6e 4a 73 54 6f 4c 6f 61 64 20 c int nJsToLoad
5820: 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 = 0;../*.** Regi
5830: 73 74 65 72 20 61 20 6e 65 77 20 4a 53 20 66 69 ster a new JS fi
5840: 6c 65 20 74 6f 20 6c 6f 61 64 20 61 74 20 74 68 le to load at th
5850: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64 6f 63 e end of the doc
5860: 75 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 ument..*/.void s
5870: 74 79 6c 65 5f 6c 6f 61 64 5f 6a 73 28 63 6f 6e tyle_load_js(con
5880: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b st char *zName){
5890: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 . int i;. for(
58a0: 69 3d 30 3b 20 69 3c 6e 4a 73 54 6f 4c 6f 61 64 i=0; i<nJsToLoad
58b0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 ; i++){. if(
58c0: 66 6f 73 73 69 6c 5f 73 74 72 63 6d 70 28 7a 4e fossil_strcmp(zN
58d0: 61 6d 65 2c 20 61 7a 4a 73 54 6f 4c 6f 61 64 5b ame, azJsToLoad[
58e0: 69 5d 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b i])==0 ) return;
58f0: 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4a 73 54 6f . }. if( nJsTo
5900: 4c 6f 61 64 3e 3d 73 69 7a 65 6f 66 28 61 7a 4a Load>=sizeof(azJ
5910: 73 54 6f 4c 6f 61 64 29 2f 73 69 7a 65 6f 66 28 sToLoad)/sizeof(
5920: 61 7a 4a 73 54 6f 4c 6f 61 64 5b 30 5d 29 20 29 azJsToLoad[0]) )
5930: 7b 0a 20 20 20 20 66 6f 73 73 69 6c 5f 70 61 6e {. fossil_pan
5940: 69 63 28 22 74 6f 6f 20 6d 61 6e 79 20 4a 53 20 ic("too many JS
5950: 66 69 6c 65 73 22 29 3b 0a 20 20 7d 0a 20 20 61 files");. }. a
5960: 7a 4a 73 54 6f 4c 6f 61 64 5b 6e 4a 73 54 6f 4c zJsToLoad[nJsToL
5970: 6f 61 64 2b 2b 5d 20 3d 20 7a 4e 61 6d 65 3b 0a oad++] = zName;.
5980: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 }../*.** Generat
5990: 65 20 63 6f 64 65 20 74 6f 20 6c 6f 61 64 20 61 e code to load a
59a0: 6c 6c 20 72 65 71 75 69 72 65 64 20 6a 61 76 61 ll required java
59b0: 73 63 72 69 70 74 20 66 69 6c 65 73 2e 0a 2a 2f script files..*/
59c0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 74 79 .static void sty
59d0: 6c 65 5f 6c 6f 61 64 5f 61 6c 6c 5f 6a 73 5f 66 le_load_all_js_f
59e0: 69 6c 65 73 28 76 6f 69 64 29 7b 0a 20 20 69 6e iles(void){. in
59f0: 74 20 69 3b 0a 20 20 69 66 28 20 6e 65 65 64 48 t i;. if( needH
5a00: 72 65 66 4a 73 20 29 7b 0a 20 20 20 20 69 6e 74 refJs ){. int
5a10: 20 6e 44 65 6c 61 79 20 3d 20 64 62 5f 67 65 74 nDelay = db_get
5a20: 5f 69 6e 74 28 22 61 75 74 6f 2d 68 79 70 65 72 _int("auto-hyper
5a30: 6c 69 6e 6b 2d 64 65 6c 61 79 22 2c 30 29 3b 0a link-delay",0);.
5a40: 20 20 20 20 69 6e 74 20 62 4d 6f 75 73 65 6f 76 int bMouseov
5a50: 65 72 20 3d 20 64 62 5f 67 65 74 5f 62 6f 6f 6c er = db_get_bool
5a60: 65 61 6e 28 22 61 75 74 6f 2d 68 79 70 65 72 6c ean("auto-hyperl
5a70: 69 6e 6b 2d 6d 6f 75 73 65 6f 76 65 72 22 2c 30 ink-mouseover",0
5a80: 29 3b 0a 20 20 20 20 40 20 3c 73 63 72 69 70 74 );. @ <script
5a90: 20 69 64 3d 27 68 72 65 66 2d 64 61 74 61 27 20 id='href-data'
5aa0: 74 79 70 65 3d 27 61 70 70 6c 69 63 61 74 69 6f type='applicatio
5ab0: 6e 2f 6a 73 6f 6e 27 3e 5c 0a 20 20 20 20 40 20 n/json'>\. @
5ac0: 7b 22 64 65 6c 61 79 22 3a 25 64 28 6e 44 65 6c {"delay":%d(nDel
5ad0: 61 79 29 2c 22 6d 6f 75 73 65 6f 76 65 72 22 3a ay),"mouseover":
5ae0: 25 64 28 62 4d 6f 75 73 65 6f 76 65 72 29 7d 3c %d(bMouseover)}<
5af0: 2f 73 63 72 69 70 74 3e 0a 20 20 7d 0a 20 20 40 /script>. }. @
5b00: 20 3c 73 63 72 69 70 74 20 6e 6f 6e 63 65 3d 22 <script nonce="
5b10: 25 68 28 73 74 79 6c 65 5f 6e 6f 6e 63 65 28 29 %h(style_nonce()
5b20: 29 22 3e 0a 20 20 40 20 66 75 6e 63 74 69 6f 6e )">. @ function
5b30: 20 64 65 62 75 67 4d 73 67 28 6d 73 67 29 7b 0a debugMsg(msg){.
5b40: 20 20 40 20 76 61 72 20 6e 20 3d 20 64 6f 63 75 @ var n = docu
5b50: 6d 65 6e 74 2e 67 65 74 45 6c 65 6d 65 6e 74 42 ment.getElementB
5b60: 79 49 64 28 22 64 65 62 75 67 4d 73 67 22 29 3b yId("debugMsg");
5b70: 0a 20 20 40 20 69 66 28 6e 29 7b 6e 2e 74 65 78 . @ if(n){n.tex
5b80: 74 43 6f 6e 74 65 6e 74 3d 6d 73 67 3b 7d 0a 20 tContent=msg;}.
5b90: 20 40 20 7d 0a 20 20 69 66 28 20 6e 65 65 64 48 @ }. if( needH
5ba0: 72 65 66 4a 73 20 29 7b 0a 20 20 20 20 63 67 69 refJs ){. cgi
5bb0: 5f 61 70 70 65 6e 64 5f 63 6f 6e 74 65 6e 74 28 _append_content(
5bc0: 62 75 69 6c 74 69 6e 5f 74 65 78 74 28 22 68 72 builtin_text("hr
5bd0: 65 66 2e 6a 73 22 29 2c 2d 31 29 3b 0a 20 20 7d ef.js"),-1);. }
5be0: 0a 20 20 69 66 28 20 6e 65 65 64 53 6f 72 74 4a . if( needSortJ
5bf0: 73 20 29 7b 0a 20 20 20 20 63 67 69 5f 61 70 70 s ){. cgi_app
5c00: 65 6e 64 5f 63 6f 6e 74 65 6e 74 28 62 75 69 6c end_content(buil
5c10: 74 69 6e 5f 74 65 78 74 28 22 73 6f 72 74 74 61 tin_text("sortta
5c20: 62 6c 65 2e 6a 73 22 29 2c 2d 31 29 3b 0a 20 20 ble.js"),-1);.
5c30: 7d 0a 20 20 69 66 28 20 6e 65 65 64 47 72 61 70 }. if( needGrap
5c40: 68 4a 73 20 29 7b 0a 20 20 20 20 63 67 69 5f 61 hJs ){. cgi_a
5c50: 70 70 65 6e 64 5f 63 6f 6e 74 65 6e 74 28 62 75 ppend_content(bu
5c60: 69 6c 74 69 6e 5f 74 65 78 74 28 22 67 72 61 70 iltin_text("grap
5c70: 68 2e 6a 73 22 29 2c 2d 31 29 3b 0a 20 20 7d 0a h.js"),-1);. }.
5c80: 20 20 69 66 28 20 6e 65 65 64 43 6f 70 79 42 74 if( needCopyBt
5c90: 6e 4a 73 20 29 7b 0a 20 20 20 20 63 67 69 5f 61 nJs ){. cgi_a
5ca0: 70 70 65 6e 64 5f 63 6f 6e 74 65 6e 74 28 62 75 ppend_content(bu
5cb0: 69 6c 74 69 6e 5f 74 65 78 74 28 22 63 6f 70 79 iltin_text("copy
5cc0: 62 74 6e 2e 6a 73 22 29 2c 2d 31 29 3b 0a 20 20 btn.js"),-1);.
5cd0: 7d 0a 20 20 69 66 28 20 6e 65 65 64 41 63 63 6f }. if( needAcco
5ce0: 72 64 69 6f 6e 4a 73 20 29 7b 0a 20 20 20 20 63 rdionJs ){. c
5cf0: 67 69 5f 61 70 70 65 6e 64 5f 63 6f 6e 74 65 6e gi_append_conten
5d00: 74 28 62 75 69 6c 74 69 6e 5f 74 65 78 74 28 22 t(builtin_text("
5d10: 61 63 63 6f 72 64 69 6f 6e 2e 6a 73 22 29 2c 2d accordion.js"),-
5d20: 31 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 1);. }. for(i=
5d30: 30 3b 20 69 3c 6e 4a 73 54 6f 4c 6f 61 64 3b 20 0; i<nJsToLoad;
5d40: 69 2b 2b 29 7b 0a 20 20 20 20 63 67 69 5f 61 70 i++){. cgi_ap
5d50: 70 65 6e 64 5f 63 6f 6e 74 65 6e 74 28 62 75 69 pend_content(bui
5d60: 6c 74 69 6e 5f 74 65 78 74 28 61 7a 4a 73 54 6f ltin_text(azJsTo
5d70: 4c 6f 61 64 5b 69 5d 29 2c 2d 31 29 3b 0a 20 20 Load[i]),-1);.
5d80: 7d 0a 20 20 69 66 28 20 62 6c 6f 62 5f 73 69 7a }. if( blob_siz
5d90: 65 28 26 62 6c 6f 62 4f 6e 4c 6f 61 64 29 3e 30 e(&blobOnLoad)>0
5da0: 20 29 7b 0a 20 20 20 20 40 20 77 69 6e 64 6f 77 ){. @ window
5db0: 2e 6f 6e 6c 6f 61 64 20 3d 20 66 75 6e 63 74 69 .onload = functi
5dc0: 6f 6e 28 29 7b 0a 20 20 20 20 63 67 69 5f 61 70 on(){. cgi_ap
5dd0: 70 65 6e 64 5f 63 6f 6e 74 65 6e 74 28 62 6c 6f pend_content(blo
5de0: 62 5f 62 75 66 66 65 72 28 26 62 6c 6f 62 4f 6e b_buffer(&blobOn
5df0: 4c 6f 61 64 29 2c 20 62 6c 6f 62 5f 73 69 7a 65 Load), blob_size
5e00: 28 26 62 6c 6f 62 4f 6e 4c 6f 61 64 29 29 3b 0a (&blobOnLoad));.
5e10: 20 20 20 20 63 67 69 5f 61 70 70 65 6e 64 5f 63 cgi_append_c
5e20: 6f 6e 74 65 6e 74 28 22 5c 6e 7d 5c 6e 22 2c 20 ontent("\n}\n",
5e30: 2d 31 29 3b 0a 20 20 7d 0a 20 20 40 20 3c 2f 73 -1);. }. @ </s
5e40: 63 72 69 70 74 3e 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 cript>.}../*.**
5e50: 45 78 74 72 61 20 4a 53 20 74 6f 20 72 75 6e 20 Extra JS to run
5e60: 61 66 74 65 72 20 61 6c 6c 20 63 6f 6e 74 65 6e after all conten
5e70: 74 20 69 73 20 6c 6f 61 64 65 64 2e 0a 2a 2f 0a t is loaded..*/.
5e80: 76 6f 69 64 20 73 74 79 6c 65 5f 6a 73 5f 6f 6e void style_js_on
5e90: 6c 6f 61 64 28 63 6f 6e 73 74 20 63 68 61 72 20 load(const char
5ea0: 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a *zFormat, ...){.
5eb0: 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 va_list ap;.
5ec0: 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f va_start(ap, zFo
5ed0: 72 6d 61 74 29 3b 0a 20 20 62 6c 6f 62 5f 76 61 rmat);. blob_va
5ee0: 70 70 65 6e 64 66 28 26 62 6c 6f 62 4f 6e 4c 6f ppendf(&blobOnLo
5ef0: 61 64 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 ad, zFormat, ap)
5f00: 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a ;. va_end(ap);.
5f10: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 72 61 77 20 74 68 }../*.** Draw th
5f20: 65 20 66 6f 6f 74 65 72 20 61 74 20 74 68 65 20 e footer at the
5f30: 62 6f 74 74 6f 6d 20 6f 66 20 74 68 65 20 70 61 bottom of the pa
5f40: 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 74 79 6c ge..*/.void styl
5f50: 65 5f 66 6f 6f 74 65 72 28 76 6f 69 64 29 7b 0a e_footer(void){.
5f60: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 const char *zF
5f70: 6f 6f 74 65 72 3b 0a 20 20 63 6f 6e 73 74 20 63 ooter;. const c
5f80: 68 61 72 20 2a 7a 41 64 20 3d 20 30 3b 0a 20 20 har *zAd = 0;.
5f90: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6d 41 64 unsigned int mAd
5fa0: 46 6c 61 67 73 20 3d 20 30 3b 0a 0a 20 20 69 66 Flags = 0;.. if
5fb0: 28 20 21 68 65 61 64 65 72 48 61 73 42 65 65 6e ( !headerHasBeen
5fc0: 47 65 6e 65 72 61 74 65 64 20 29 20 72 65 74 75 Generated ) retu
5fd0: 72 6e 3b 0a 0a 20 20 2f 2a 20 47 6f 20 62 61 63 rn;.. /* Go bac
5fe0: 6b 20 61 6e 64 20 70 75 74 20 74 68 65 20 73 75 k and put the su
5ff0: 62 6d 65 6e 75 20 61 74 20 74 68 65 20 74 6f 70 bmenu at the top
6000: 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20 20 57 of the page. W
6010: 65 20 64 65 6c 61 79 20 74 68 65 0a 20 20 2a 2a e delay the. **
6020: 20 63 72 65 61 74 69 6f 6e 20 6f 66 20 74 68 65 creation of the
6030: 20 73 75 62 6d 65 6e 75 20 75 6e 74 69 6c 20 74 submenu until t
6040: 68 65 20 65 6e 64 20 73 6f 20 74 68 61 74 20 77 he end so that w
6050: 65 20 63 61 6e 20 61 64 64 20 65 6c 65 6d 65 6e e can add elemen
6060: 74 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 73 ts. ** to the s
6070: 75 62 6d 65 6e 75 20 77 68 69 6c 65 20 67 65 6e ubmenu while gen
6080: 65 72 61 74 69 6e 67 20 70 61 67 65 20 74 65 78 erating page tex
6090: 74 2e 0a 20 20 2a 2f 0a 20 20 63 67 69 5f 64 65 t.. */. cgi_de
60a0: 73 74 69 6e 61 74 69 6f 6e 28 43 47 49 5f 48 45 stination(CGI_HE
60b0: 41 44 45 52 29 3b 0a 20 20 69 66 28 20 73 75 62 ADER);. if( sub
60c0: 6d 65 6e 75 45 6e 61 62 6c 65 20 26 26 20 6e 53 menuEnable && nS
60d0: 75 62 6d 65 6e 75 2b 6e 53 75 62 6d 65 6e 75 43 ubmenu+nSubmenuC
60e0: 74 72 6c 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 trl>0 ){. int
60f0: 20 69 3b 0a 20 20 20 20 69 66 28 20 6e 53 75 62 i;. if( nSub
6100: 6d 65 6e 75 43 74 72 6c 20 29 7b 0a 20 20 20 20 menuCtrl ){.
6110: 20 20 40 20 3c 66 6f 72 6d 20 69 64 3d 27 66 30 @ <form id='f0
6120: 31 27 20 6d 65 74 68 6f 64 3d 27 47 45 54 27 20 1' method='GET'
6130: 61 63 74 69 6f 6e 3d 27 25 52 2f 25 73 28 67 2e action='%R/%s(g.
6140: 7a 50 61 74 68 29 27 3e 0a 20 20 20 20 20 20 40 zPath)'>. @
6150: 20 3c 69 6e 70 75 74 20 74 79 70 65 3d 27 68 69 <input type='hi
6160: 64 64 65 6e 27 20 6e 61 6d 65 3d 27 75 64 63 27 dden' name='udc'
6170: 20 76 61 6c 75 65 3d 27 31 27 3e 0a 20 20 20 20 value='1'>.
6180: 20 20 63 67 69 5f 74 61 67 5f 71 75 65 72 79 5f cgi_tag_query_
6190: 70 61 72 61 6d 65 74 65 72 28 22 75 64 63 22 29 parameter("udc")
61a0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 40 20 3c 64 ;. }. @ <d
61b0: 69 76 20 63 6c 61 73 73 3d 22 73 75 62 6d 65 6e iv class="submen
61c0: 75 22 3e 0a 20 20 20 20 69 66 28 20 6e 53 75 62 u">. if( nSub
61d0: 6d 65 6e 75 3e 30 20 29 7b 0a 20 20 20 20 20 20 menu>0 ){.
61e0: 71 73 6f 72 74 28 61 53 75 62 6d 65 6e 75 2c 20 qsort(aSubmenu,
61f0: 6e 53 75 62 6d 65 6e 75 2c 20 73 69 7a 65 6f 66 nSubmenu, sizeof
6200: 28 61 53 75 62 6d 65 6e 75 5b 30 5d 29 2c 20 73 (aSubmenu[0]), s
6210: 75 62 6d 65 6e 75 43 6f 6d 70 61 72 65 29 3b 0a ubmenuCompare);.
6220: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 for(i=0; i
6230: 3c 6e 53 75 62 6d 65 6e 75 3b 20 69 2b 2b 29 7b <nSubmenu; i++){
6240: 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 . struct
6250: 53 75 62 6d 65 6e 75 20 2a 70 20 3d 20 26 61 53 Submenu *p = &aS
6260: 75 62 6d 65 6e 75 5b 69 5d 3b 0a 20 20 20 20 20 ubmenu[i];.
6270: 20 20 20 69 66 28 20 70 2d 3e 7a 4c 69 6e 6b 3d if( p->zLink=
6280: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 =0 ){.
6290: 40 20 3c 73 70 61 6e 20 63 6c 61 73 73 3d 22 6c @ <span class="l
62a0: 61 62 65 6c 22 3e 25 68 28 70 2d 3e 7a 4c 61 62 abel">%h(p->zLab
62b0: 65 6c 29 3c 2f 73 70 61 6e 3e 0a 20 20 20 20 20 el)</span>.
62c0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 }else{.
62d0: 20 20 20 20 40 20 3c 61 20 63 6c 61 73 73 3d 22 @ <a class="
62e0: 6c 61 62 65 6c 22 20 68 72 65 66 3d 22 25 68 28 label" href="%h(
62f0: 70 2d 3e 7a 4c 69 6e 6b 29 22 3e 25 68 28 70 2d p->zLink)">%h(p-
6300: 3e 7a 4c 61 62 65 6c 29 3c 2f 61 3e 0a 20 20 20 >zLabel)</a>.
6310: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 }. }.
6320: 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 }. for(i=0
6330: 3b 20 69 3c 6e 53 75 62 6d 65 6e 75 43 74 72 6c ; i<nSubmenuCtrl
6340: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63 6f ; i++){. co
6350: 6e 73 74 20 63 68 61 72 20 2a 7a 51 50 4e 20 3d nst char *zQPN =
6360: 20 61 53 75 62 6d 65 6e 75 43 74 72 6c 5b 69 5d aSubmenuCtrl[i]
6370: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 63 6f .zName;. co
6380: 6e 73 74 20 63 68 61 72 20 2a 7a 44 69 73 61 62 nst char *zDisab
6390: 6c 65 64 20 3d 20 22 22 3b 0a 20 20 20 20 20 20 led = "";.
63a0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 58 74 72 const char *zXtr
63b0: 61 43 6c 61 73 73 20 3d 20 22 22 3b 0a 20 20 20 aClass = "";.
63c0: 20 20 20 69 66 28 20 61 53 75 62 6d 65 6e 75 43 if( aSubmenuC
63d0: 74 72 6c 5b 69 5d 2e 65 56 69 73 69 62 6c 65 20 trl[i].eVisible
63e0: 26 20 53 54 59 4c 45 5f 44 49 53 41 42 4c 45 44 & STYLE_DISABLED
63f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 44 69 73 ){. zDis
6400: 61 62 6c 65 64 20 3d 20 22 20 64 69 73 61 62 6c abled = " disabl
6410: 65 64 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 ed";. }else
6420: 20 69 66 28 20 7a 51 50 4e 20 29 7b 0a 20 20 20 if( zQPN ){.
6430: 20 20 20 20 20 63 67 69 5f 74 61 67 5f 71 75 65 cgi_tag_que
6440: 72 79 5f 70 61 72 61 6d 65 74 65 72 28 7a 51 50 ry_parameter(zQP
6450: 4e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 N);. }.
6460: 20 20 73 77 69 74 63 68 28 20 61 53 75 62 6d 65 switch( aSubme
6470: 6e 75 43 74 72 6c 5b 69 5d 2e 65 54 79 70 65 20 nuCtrl[i].eType
6480: 29 7b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 ){. case
6490: 46 46 5f 45 4e 54 52 59 3a 0a 20 20 20 20 20 20 FF_ENTRY:.
64a0: 20 20 20 20 40 20 3c 73 70 61 6e 20 63 6c 61 73 @ <span clas
64b0: 73 3d 27 73 75 62 6d 65 6e 75 63 74 72 6c 25 73 s='submenuctrl%s
64c0: 28 7a 58 74 72 61 43 6c 61 73 73 29 27 3e 5c 0a (zXtraClass)'>\.
64d0: 20 20 20 20 20 20 20 20 20 20 40 20 26 6e 62 73 @ &nbs
64e0: 70 3b 25 68 28 61 53 75 62 6d 65 6e 75 43 74 72 p;%h(aSubmenuCtr
64f0: 6c 5b 69 5d 2e 7a 4c 61 62 65 6c 29 5c 0a 20 20 l[i].zLabel)\.
6500: 20 20 20 20 20 20 20 20 40 20 3c 69 6e 70 75 74 @ <input
6510: 20 74 79 70 65 3d 27 74 65 78 74 27 20 6e 61 6d type='text' nam
6520: 65 3d 27 25 73 28 7a 51 50 4e 29 27 20 76 61 6c e='%s(zQPN)' val
6530: 75 65 3d 27 25 68 28 50 44 28 7a 51 50 4e 2c 20 ue='%h(PD(zQPN,
6540: 22 22 29 29 27 20 5c 0a 20 20 20 20 20 20 20 20 ""))' \.
6550: 20 20 69 66 28 20 61 53 75 62 6d 65 6e 75 43 74 if( aSubmenuCt
6560: 72 6c 5b 69 5d 2e 69 53 69 7a 65 3c 30 20 29 7b rl[i].iSize<0 ){
6570: 0a 20 20 20 20 20 20 20 20 20 20 20 20 40 20 73 . @ s
6580: 69 7a 65 3d 27 25 64 28 2d 61 53 75 62 6d 65 6e ize='%d(-aSubmen
6590: 75 43 74 72 6c 5b 69 5d 2e 69 53 69 7a 65 29 27 uCtrl[i].iSize)'
65a0: 20 5c 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c \. }el
65b0: 73 65 20 69 66 28 20 61 53 75 62 6d 65 6e 75 43 se if( aSubmenuC
65c0: 74 72 6c 5b 69 5d 2e 69 53 69 7a 65 3e 30 20 29 trl[i].iSize>0 )
65d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 40 20 {. @
65e0: 73 69 7a 65 3d 27 25 64 28 61 53 75 62 6d 65 6e size='%d(aSubmen
65f0: 75 43 74 72 6c 5b 69 5d 2e 69 53 69 7a 65 29 27 uCtrl[i].iSize)'
6600: 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 40 \. @
6610: 20 6d 61 78 6c 65 6e 67 74 68 3d 27 25 64 28 61 maxlength='%d(a
6620: 53 75 62 6d 65 6e 75 43 74 72 6c 5b 69 5d 2e 69 SubmenuCtrl[i].i
6630: 53 69 7a 65 29 27 20 5c 0a 20 20 20 20 20 20 20 Size)' \.
6640: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 40 }. @
6650: 20 69 64 3d 27 73 75 62 6d 65 6e 75 63 74 72 6c id='submenuctrl
6660: 2d 25 64 28 69 29 27 25 73 28 7a 44 69 73 61 62 -%d(i)'%s(zDisab
6670: 6c 65 64 29 3e 3c 2f 73 70 61 6e 3e 0a 20 20 20 led)></span>.
6680: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 break;.
6690: 20 20 20 20 20 20 63 61 73 65 20 46 46 5f 4d 55 case FF_MU
66a0: 4c 54 49 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 LTI: {.
66b0: 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 int j;.
66c0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 const char *zV
66d0: 61 6c 20 3d 20 50 28 7a 51 50 4e 29 3b 0a 20 20 al = P(zQPN);.
66e0: 20 20 20 20 20 20 20 20 69 66 28 20 7a 58 74 72 if( zXtr
66f0: 61 43 6c 61 73 73 5b 30 5d 20 29 7b 0a 20 20 20 aClass[0] ){.
6700: 20 20 20 20 20 20 20 20 20 40 20 3c 73 70 61 6e @ <span
6710: 20 63 6c 61 73 73 3d 27 25 73 28 7a 58 74 72 61 class='%s(zXtra
6720: 43 6c 61 73 73 2b 31 29 27 3e 0a 20 20 20 20 20 Class+1)'>.
6730: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 }.
6740: 20 69 66 28 20 61 53 75 62 6d 65 6e 75 43 74 72 if( aSubmenuCtr
6750: 6c 5b 69 5d 2e 7a 4c 61 62 65 6c 20 29 7b 0a 20 l[i].zLabel ){.
6760: 20 20 20 20 20 20 20 20 20 20 20 40 20 26 6e 62 @ &nb
6770: 73 70 3b 25 68 28 61 53 75 62 6d 65 6e 75 43 74 sp;%h(aSubmenuCt
6780: 72 6c 5b 69 5d 2e 7a 4c 61 62 65 6c 29 5c 0a 20 rl[i].zLabel)\.
6790: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 }.
67a0: 20 20 20 20 20 40 20 3c 73 65 6c 65 63 74 20 63 @ <select c
67b0: 6c 61 73 73 3d 27 73 75 62 6d 65 6e 75 63 74 72 lass='submenuctr
67c0: 6c 27 20 73 69 7a 65 3d 27 31 27 20 6e 61 6d 65 l' size='1' name
67d0: 3d 27 25 73 28 7a 51 50 4e 29 27 20 5c 0a 20 20 ='%s(zQPN)' \.
67e0: 20 20 20 20 20 20 20 20 40 20 69 64 3d 27 73 75 @ id='su
67f0: 62 6d 65 6e 75 63 74 72 6c 2d 25 64 28 69 29 27 bmenuctrl-%d(i)'
6800: 25 73 28 7a 44 69 73 61 62 6c 65 64 29 3e 0a 20 %s(zDisabled)>.
6810: 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 for(j=0
6820: 3b 20 6a 3c 61 53 75 62 6d 65 6e 75 43 74 72 6c ; j<aSubmenuCtrl
6830: 5b 69 5d 2e 69 53 69 7a 65 2a 32 3b 20 6a 2b 3d [i].iSize*2; j+=
6840: 32 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2){.
6850: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 51 50 56 const char *zQPV
6860: 20 3d 20 61 53 75 62 6d 65 6e 75 43 74 72 6c 5b = aSubmenuCtrl[
6870: 69 5d 2e 61 7a 43 68 6f 69 63 65 5b 6a 5d 3b 0a i].azChoice[j];.
6880: 20 20 20 20 20 20 20 20 20 20 20 20 40 20 3c 6f @ <o
6890: 70 74 69 6f 6e 20 76 61 6c 75 65 3d 27 25 68 28 ption value='%h(
68a0: 7a 51 50 56 29 27 5c 0a 20 20 20 20 20 20 20 20 zQPV)'\.
68b0: 20 20 20 20 69 66 28 20 66 6f 73 73 69 6c 5f 73 if( fossil_s
68c0: 74 72 63 6d 70 28 7a 56 61 6c 2c 20 7a 51 50 56 trcmp(zVal, zQPV
68d0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 )==0 ){.
68e0: 20 20 20 20 20 20 40 20 20 73 65 6c 65 63 74 65 @ selecte
68f0: 64 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d d\. }
6900: 0a 20 20 20 20 20 20 20 20 20 20 20 20 40 20 3e . @ >
6910: 25 68 28 61 53 75 62 6d 65 6e 75 43 74 72 6c 5b %h(aSubmenuCtrl[
6920: 69 5d 2e 61 7a 43 68 6f 69 63 65 5b 6a 2b 31 5d i].azChoice[j+1]
6930: 29 3c 2f 6f 70 74 69 6f 6e 3e 0a 20 20 20 20 20 )</option>.
6940: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 }.
6950: 20 40 20 3c 2f 73 65 6c 65 63 74 3e 0a 20 20 20 @ </select>.
6960: 20 20 20 20 20 20 20 69 66 28 20 7a 58 74 72 61 if( zXtra
6970: 43 6c 61 73 73 5b 30 5d 20 29 7b 0a 20 20 20 20 Class[0] ){.
6980: 20 20 20 20 20 20 20 20 40 20 3c 2f 73 70 61 6e @ </span
6990: 3e 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 >. }.
69a0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 break;.
69b0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 }.
69c0: 20 63 61 73 65 20 46 46 5f 42 49 4e 41 52 59 3a case FF_BINARY:
69d0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 {. int
69e0: 20 69 73 54 72 75 65 20 3d 20 50 42 28 7a 51 50 isTrue = PB(zQP
69f0: 4e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 40 20 N);. @
6a00: 3c 73 65 6c 65 63 74 20 63 6c 61 73 73 3d 27 73 <select class='s
6a10: 75 62 6d 65 6e 75 63 74 72 6c 25 73 28 7a 58 74 ubmenuctrl%s(zXt
6a20: 72 61 43 6c 61 73 73 29 27 20 73 69 7a 65 3d 27 raClass)' size='
6a30: 31 27 20 5c 0a 20 20 20 20 20 20 20 20 20 20 40 1' \. @
6a40: 20 6e 61 6d 65 3d 27 25 73 28 7a 51 50 4e 29 27 name='%s(zQPN)'
6a50: 20 69 64 3d 27 73 75 62 6d 65 6e 75 63 74 72 6c id='submenuctrl
6a60: 2d 25 64 28 69 29 27 25 73 28 7a 44 69 73 61 62 -%d(i)'%s(zDisab
6a70: 6c 65 64 29 3e 0a 20 20 20 20 20 20 20 20 20 20 led)>.
6a80: 40 20 3c 6f 70 74 69 6f 6e 20 76 61 6c 75 65 3d @ <option value=
6a90: 27 31 27 5c 0a 20 20 20 20 20 20 20 20 20 20 69 '1'\. i
6aa0: 66 28 20 69 73 54 72 75 65 20 29 7b 0a 20 20 20 f( isTrue ){.
6ab0: 20 20 20 20 20 20 20 20 20 40 20 20 73 65 6c 65 @ sele
6ac0: 63 74 65 64 5c 0a 20 20 20 20 20 20 20 20 20 20 cted\.
6ad0: 7d 0a 20 20 20 20 20 20 20 20 20 20 40 20 3e 25 }. @ >%
6ae0: 68 28 61 53 75 62 6d 65 6e 75 43 74 72 6c 5b 69 h(aSubmenuCtrl[i
6af0: 5d 2e 7a 4c 61 62 65 6c 29 3c 2f 6f 70 74 69 6f ].zLabel)</optio
6b00: 6e 3e 0a 20 20 20 20 20 20 20 20 20 20 40 20 3c n>. @ <
6b10: 6f 70 74 69 6f 6e 20 76 61 6c 75 65 3d 27 30 27 option value='0'
6b20: 5c 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 \. if(
6b30: 21 69 73 54 72 75 65 20 29 7b 0a 20 20 20 20 20 !isTrue ){.
6b40: 20 20 20 20 20 20 20 40 20 20 73 65 6c 65 63 74 @ select
6b50: 65 64 5c 0a 20 20 20 20 20 20 20 20 20 20 7d 0a ed\. }.
6b60: 20 20 20 20 20 20 20 20 20 20 40 20 3e 25 68 28 @ >%h(
6b70: 61 53 75 62 6d 65 6e 75 43 74 72 6c 5b 69 5d 2e aSubmenuCtrl[i].
6b80: 7a 46 61 6c 73 65 29 3c 2f 6f 70 74 69 6f 6e 3e zFalse)</option>
6b90: 0a 20 20 20 20 20 20 20 20 20 20 40 20 3c 2f 73 . @ </s
6ba0: 65 6c 65 63 74 3e 0a 20 20 20 20 20 20 20 20 20 elect>.
6bb0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 break;.
6bc0: 7d 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 46 }. case F
6bd0: 46 5f 43 48 45 43 4b 42 4f 58 3a 20 7b 0a 20 20 F_CHECKBOX: {.
6be0: 20 20 20 20 20 20 20 20 40 20 3c 6c 61 62 65 6c @ <label
6bf0: 20 63 6c 61 73 73 3d 27 73 75 62 6d 65 6e 75 63 class='submenuc
6c00: 74 72 6c 20 73 75 62 6d 65 6e 75 63 6b 62 6f 78 trl submenuckbox
6c10: 25 73 28 7a 58 74 72 61 43 6c 61 73 73 29 27 3e %s(zXtraClass)'>
6c20: 5c 0a 20 20 20 20 20 20 20 20 20 20 40 20 3c 69 \. @ <i
6c30: 6e 70 75 74 20 74 79 70 65 3d 27 63 68 65 63 6b nput type='check
6c40: 62 6f 78 27 20 6e 61 6d 65 3d 27 25 73 28 7a 51 box' name='%s(zQ
6c50: 50 4e 29 27 20 69 64 3d 27 73 75 62 6d 65 6e 75 PN)' id='submenu
6c60: 63 74 72 6c 2d 25 64 28 69 29 27 20 5c 0a 20 20 ctrl-%d(i)' \.
6c70: 20 20 20 20 20 20 20 20 69 66 28 20 50 42 28 7a if( PB(z
6c80: 51 50 4e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 QPN) ){.
6c90: 20 20 20 20 40 20 63 68 65 63 6b 65 64 20 5c 0a @ checked \.
6ca0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 }.
6cb0: 20 20 20 20 20 20 69 66 28 20 61 53 75 62 6d 65 if( aSubme
6cc0: 6e 75 43 74 72 6c 5b 69 5d 2e 7a 4a 53 20 29 7b nuCtrl[i].zJS ){
6cd0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 40 20 64 . @ d
6ce0: 61 74 61 2d 63 74 72 6c 3d 27 25 73 28 61 53 75 ata-ctrl='%s(aSu
6cf0: 62 6d 65 6e 75 43 74 72 6c 5b 69 5d 2e 7a 4a 53 bmenuCtrl[i].zJS
6d00: 29 27 25 73 28 7a 44 69 73 61 62 6c 65 64 29 3e )'%s(zDisabled)>
6d10: 5c 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 \. }els
6d20: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 40 e{. @
6d30: 20 25 73 28 7a 44 69 73 61 62 6c 65 64 29 3e 5c %s(zDisabled)>\
6d40: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 . }.
6d50: 20 20 20 20 20 20 20 40 20 25 68 28 61 53 75 62 @ %h(aSub
6d60: 6d 65 6e 75 43 74 72 6c 5b 69 5d 2e 7a 4c 61 62 menuCtrl[i].zLab
6d70: 65 6c 29 3c 2f 6c 61 62 65 6c 3e 0a 20 20 20 20 el)</label>.
6d80: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 break;.
6d90: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 }. }.
6da0: 20 20 20 7d 0a 20 20 20 20 40 20 3c 2f 64 69 76 }. @ </div
6db0: 3e 0a 20 20 20 20 69 66 28 20 6e 53 75 62 6d 65 >. if( nSubme
6dc0: 6e 75 43 74 72 6c 20 29 7b 0a 20 20 20 20 20 20 nuCtrl ){.
6dd0: 63 67 69 5f 71 75 65 72 79 5f 70 61 72 61 6d 65 cgi_query_parame
6de0: 74 65 72 73 5f 74 6f 5f 68 69 64 64 65 6e 28 29 ters_to_hidden()
6df0: 3b 0a 20 20 20 20 20 20 63 67 69 5f 74 61 67 5f ;. cgi_tag_
6e00: 71 75 65 72 79 5f 70 61 72 61 6d 65 74 65 72 28 query_parameter(
6e10: 30 29 3b 0a 20 20 20 20 20 20 40 20 3c 2f 66 6f 0);. @ </fo
6e20: 72 6d 3e 0a 20 20 20 20 20 20 73 74 79 6c 65 5f rm>. style_
6e30: 6c 6f 61 64 5f 6f 6e 65 5f 6a 73 5f 66 69 6c 65 load_one_js_file
6e40: 28 22 6d 65 6e 75 2e 6a 73 22 29 3b 0a 20 20 20 ("menu.js");.
6e50: 20 7d 0a 20 20 7d 0a 0a 20 20 7a 41 64 20 3d 20 }. }.. zAd =
6e60: 73 74 79 6c 65 5f 61 64 75 6e 69 74 5f 74 65 78 style_adunit_tex
6e70: 74 28 26 6d 41 64 46 6c 61 67 73 29 3b 0a 20 20 t(&mAdFlags);.
6e80: 69 66 28 20 28 6d 41 64 46 6c 61 67 73 20 26 20 if( (mAdFlags &
6e90: 41 44 55 4e 49 54 5f 52 49 47 48 54 5f 4f 4b 29 ADUNIT_RIGHT_OK)
6ea0: 21 3d 30 20 20 29 7b 0a 20 20 20 20 40 20 3c 64 !=0 ){. @ <d
6eb0: 69 76 20 63 6c 61 73 73 3d 22 63 6f 6e 74 65 6e iv class="conten
6ec0: 74 20 61 64 75 6e 69 74 5f 72 69 67 68 74 5f 63 t adunit_right_c
6ed0: 6f 6e 74 61 69 6e 65 72 22 3e 0a 20 20 20 20 40 ontainer">. @
6ee0: 20 3c 64 69 76 20 63 6c 61 73 73 3d 22 61 64 75 <div class="adu
6ef0: 6e 69 74 5f 72 69 67 68 74 22 3e 0a 20 20 20 20 nit_right">.
6f00: 63 67 69 5f 61 70 70 65 6e 64 5f 63 6f 6e 74 65 cgi_append_conte
6f10: 6e 74 28 7a 41 64 2c 20 2d 31 29 3b 0a 20 20 20 nt(zAd, -1);.
6f20: 20 40 20 3c 2f 64 69 76 3e 0a 20 20 7d 65 6c 73 @ </div>. }els
6f30: 65 7b 0a 20 20 20 20 69 66 28 20 7a 41 64 20 29 e{. if( zAd )
6f40: 7b 0a 20 20 20 20 20 20 40 20 3c 64 69 76 20 63 {. @ <div c
6f50: 6c 61 73 73 3d 22 61 64 75 6e 69 74 5f 62 61 6e lass="adunit_ban
6f60: 6e 65 72 22 3e 0a 20 20 20 20 20 20 63 67 69 5f ner">. cgi_
6f70: 61 70 70 65 6e 64 5f 63 6f 6e 74 65 6e 74 28 7a append_content(z
6f80: 41 64 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 40 Ad, -1);. @
6f90: 20 3c 2f 64 69 76 3e 0a 20 20 20 20 7d 0a 20 20 </div>. }.
6fa0: 20 20 40 20 3c 64 69 76 20 63 6c 61 73 73 3d 22 @ <div class="
6fb0: 63 6f 6e 74 65 6e 74 22 3e 3c 73 70 61 6e 20 69 content"><span i
6fc0: 64 3d 22 64 65 62 75 67 4d 73 67 22 3e 3c 2f 73 d="debugMsg"></s
6fd0: 70 61 6e 3e 0a 20 20 7d 0a 20 20 63 67 69 5f 64 pan>. }. cgi_d
6fe0: 65 73 74 69 6e 61 74 69 6f 6e 28 43 47 49 5f 42 estination(CGI_B
6ff0: 4f 44 59 29 3b 0a 0a 20 20 69 66 28 20 73 69 64 ODY);.. if( sid
7000: 65 62 6f 78 55 73 65 64 20 29 7b 0a 20 20 20 20 eboxUsed ){.
7010: 2f 2a 20 50 75 74 20 74 68 65 20 66 6f 6f 74 65 /* Put the foote
7020: 72 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 20 r at the bottom
7030: 6f 66 20 74 68 65 20 70 61 67 65 2e 0a 20 20 20 of the page..
7040: 20 2a 2a 20 74 68 65 20 61 64 64 69 74 69 6f 6e ** the addition
7050: 61 6c 20 63 6c 65 61 72 2f 62 6f 74 68 20 69 73 al clear/both is
7060: 20 6e 65 65 64 65 64 20 74 6f 20 65 78 74 65 6e needed to exten
7070: 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 0a 20 20 d the content.
7080: 20 20 2a 2a 20 70 61 72 74 20 74 6f 20 74 68 65 ** part to the
7090: 20 65 6e 64 20 6f 66 20 61 6e 20 6f 70 74 69 6f end of an optio
70a0: 6e 61 6c 20 73 69 64 65 62 6f 78 2e 0a 20 20 20 nal sidebox..
70b0: 20 2a 2f 0a 20 20 20 20 40 20 3c 64 69 76 20 63 */. @ <div c
70c0: 6c 61 73 73 3d 22 65 6e 64 43 6f 6e 74 65 6e 74 lass="endContent
70d0: 22 3e 3c 2f 64 69 76 3e 0a 20 20 7d 0a 20 20 40 "></div>. }. @
70e0: 20 3c 2f 64 69 76 3e 0a 0a 0a 0a 20 20 7a 46 6f </div>.... zFo
70f0: 6f 74 65 72 20 3d 20 73 6b 69 6e 5f 67 65 74 28 oter = skin_get(
7100: 22 66 6f 6f 74 65 72 22 29 3b 0a 20 20 69 66 28 "footer");. if(
7110: 20 73 71 6c 69 74 65 33 5f 73 74 72 6c 69 6b 65 sqlite3_strlike
7120: 28 22 25 3c 2f 62 6f 64 79 3e 25 22 2c 20 7a 46 ("%</body>%", zF
7130: 6f 6f 74 65 72 2c 20 30 29 3d 3d 30 20 29 7b 0a ooter, 0)==0 ){.
7140: 20 20 20 20 73 74 79 6c 65 5f 6c 6f 61 64 5f 61 style_load_a
7150: 6c 6c 5f 6a 73 5f 66 69 6c 65 73 28 29 3b 0a 20 ll_js_files();.
7160: 20 7d 0a 20 20 69 66 28 20 67 2e 74 68 54 72 61 }. if( g.thTra
7170: 63 65 20 29 20 54 68 5f 54 72 61 63 65 28 22 42 ce ) Th_Trace("B
7180: 45 47 49 4e 5f 46 4f 4f 54 45 52 3c 62 72 20 2f EGIN_FOOTER<br /
7190: 3e 5c 6e 22 2c 20 2d 31 29 3b 0a 20 20 54 68 5f >\n", -1);. Th_
71a0: 52 65 6e 64 65 72 28 7a 46 6f 6f 74 65 72 29 3b Render(zFooter);
71b0: 0a 20 20 69 66 28 20 67 2e 74 68 54 72 61 63 65 . if( g.thTrace
71c0: 20 29 20 54 68 5f 54 72 61 63 65 28 22 45 4e 44 ) Th_Trace("END
71d0: 5f 46 4f 4f 54 45 52 3c 62 72 20 2f 3e 5c 6e 22 _FOOTER<br />\n"
71e0: 2c 20 2d 31 29 3b 0a 0a 20 20 2f 2a 20 52 65 6e , -1);.. /* Ren
71f0: 64 65 72 20 74 72 61 63 65 20 6c 6f 67 20 69 66 der trace log if
7200: 20 54 48 31 20 74 72 61 63 69 6e 67 20 69 73 20 TH1 tracing is
7210: 65 6e 61 62 6c 65 64 2e 20 2a 2f 0a 20 20 69 66 enabled. */. if
7220: 28 20 67 2e 74 68 54 72 61 63 65 20 29 7b 0a 20 ( g.thTrace ){.
7230: 20 20 20 63 67 69 5f 61 70 70 65 6e 64 5f 63 6f cgi_append_co
7240: 6e 74 65 6e 74 28 22 3c 73 70 61 6e 20 63 6c 61 ntent("<span cla
7250: 73 73 3d 5c 22 74 68 54 72 61 63 65 5c 22 3e 3c ss=\"thTrace\"><
7260: 68 72 20 2f 3e 5c 6e 22 2c 20 2d 31 29 3b 0a 20 hr />\n", -1);.
7270: 20 20 20 63 67 69 5f 61 70 70 65 6e 64 5f 63 6f cgi_append_co
7280: 6e 74 65 6e 74 28 62 6c 6f 62 5f 73 74 72 28 26 ntent(blob_str(&
7290: 67 2e 74 68 4c 6f 67 29 2c 20 62 6c 6f 62 5f 73 g.thLog), blob_s
72a0: 69 7a 65 28 26 67 2e 74 68 4c 6f 67 29 29 3b 0a ize(&g.thLog));.
72b0: 20 20 20 20 63 67 69 5f 61 70 70 65 6e 64 5f 63 cgi_append_c
72c0: 6f 6e 74 65 6e 74 28 22 3c 2f 73 70 61 6e 3e 5c ontent("</span>\
72d0: 6e 22 2c 20 2d 31 29 3b 0a 20 20 7d 0a 0a 20 20 n", -1);. }..
72e0: 2f 2a 20 41 64 64 20 64 6f 63 75 6d 65 6e 74 20 /* Add document
72f0: 65 6e 64 20 6d 61 72 6b 20 69 66 20 69 74 20 77 end mark if it w
7300: 61 73 20 6e 6f 74 20 69 6e 20 74 68 65 20 66 6f as not in the fo
7310: 6f 74 65 72 20 2a 2f 0a 20 20 69 66 28 20 73 71 oter */. if( sq
7320: 6c 69 74 65 33 5f 73 74 72 6c 69 6b 65 28 22 25 lite3_strlike("%
7330: 3c 2f 62 6f 64 79 3e 25 22 2c 20 7a 46 6f 6f 74 </body>%", zFoot
7340: 65 72 2c 20 30 29 21 3d 30 20 29 7b 0a 20 20 20 er, 0)!=0 ){.
7350: 20 73 74 79 6c 65 5f 6c 6f 61 64 5f 61 6c 6c 5f style_load_all_
7360: 6a 73 5f 66 69 6c 65 73 28 29 3b 0a 20 20 20 20 js_files();.
7370: 40 20 3c 2f 62 6f 64 79 3e 0a 20 20 20 20 40 20 @ </body>. @
7380: 3c 2f 68 74 6d 6c 3e 0a 20 20 7d 0a 7d 0a 0a 2f </html>. }.}../
7390: 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20 73 69 64 *.** Begin a sid
73a0: 65 2d 62 6f 78 20 6f 6e 20 74 68 65 20 72 69 67 e-box on the rig
73b0: 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 ht-hand side of
73c0: 61 20 70 61 67 65 2e 20 20 54 68 65 20 74 69 74 a page. The tit
73d0: 6c 65 20 61 6e 64 0a 2a 2a 20 74 68 65 20 77 69 le and.** the wi
73e0: 64 74 68 20 6f 66 20 74 68 65 20 62 6f 78 20 61 dth of the box a
73f0: 72 65 20 67 69 76 65 6e 20 61 73 20 61 72 67 75 re given as argu
7400: 6d 65 6e 74 73 2e 20 20 54 68 65 20 77 69 64 74 ments. The widt
7410: 68 20 69 73 20 75 73 75 61 6c 6c 79 0a 2a 2a 20 h is usually.**
7420: 61 20 70 65 72 63 65 6e 74 61 67 65 20 6f 66 20 a percentage of
7430: 74 6f 74 61 6c 20 73 63 72 65 65 6e 20 77 69 64 total screen wid
7440: 74 68 2e 0a 2a 2f 0a 76 6f 69 64 20 73 74 79 6c th..*/.void styl
7450: 65 5f 73 69 64 65 62 6f 78 5f 62 65 67 69 6e 28 e_sidebox_begin(
7460: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 69 74 const char *zTit
7470: 6c 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a le, const char *
7480: 7a 57 69 64 74 68 29 7b 0a 20 20 73 69 64 65 62 zWidth){. sideb
7490: 6f 78 55 73 65 64 20 3d 20 31 3b 0a 20 20 40 20 oxUsed = 1;. @
74a0: 3c 64 69 76 20 63 6c 61 73 73 3d 22 73 69 64 65 <div class="side
74b0: 62 6f 78 22 20 73 74 79 6c 65 3d 22 77 69 64 74 box" style="widt
74c0: 68 3a 25 73 28 7a 57 69 64 74 68 29 22 3e 0a 20 h:%s(zWidth)">.
74d0: 20 40 20 3c 64 69 76 20 63 6c 61 73 73 3d 22 73 @ <div class="s
74e0: 69 64 65 62 6f 78 54 69 74 6c 65 22 3e 25 68 28 ideboxTitle">%h(
74f0: 7a 54 69 74 6c 65 29 3c 2f 64 69 76 3e 0a 7d 0a zTitle)</div>.}.
7500: 0a 2f 2a 20 45 6e 64 20 74 68 65 20 73 69 64 65 ./* End the side
7510: 2d 62 6f 78 0a 2a 2f 0a 76 6f 69 64 20 73 74 79 -box.*/.void sty
7520: 6c 65 5f 73 69 64 65 62 6f 78 5f 65 6e 64 28 76 le_sidebox_end(v
7530: 6f 69 64 29 7b 0a 20 20 40 20 3c 2f 64 69 76 3e oid){. @ </div>
7540: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 .}../*.** Search
7550: 20 73 74 72 69 6e 67 20 7a 43 73 73 20 66 6f 72 string zCss for
7560: 20 7a 53 65 6c 65 63 74 6f 72 2e 0a 2a 2a 0a 2a zSelector..**.*
7570: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 * Return true if
7580: 20 66 6f 75 6e 64 2e 20 20 52 65 74 75 72 6e 20 found. Return
7590: 66 61 6c 73 65 20 69 66 20 6e 6f 74 20 66 6f 75 false if not fou
75a0: 6e 64 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 nd.*/.static int
75b0: 20 63 6f 6e 74 61 69 6e 73 53 65 6c 65 63 74 6f containsSelecto
75c0: 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 r(const char *zC
75d0: 73 73 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a ss, const char *
75e0: 7a 53 65 6c 65 63 74 6f 72 29 7b 0a 20 20 63 6f zSelector){. co
75f0: 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 nst char *z;. i
7600: 6e 74 20 6e 3b 0a 20 20 69 6e 74 20 73 65 6c 65 nt n;. int sele
7610: 63 74 6f 72 4c 65 6e 20 3d 20 28 69 6e 74 29 73 ctorLen = (int)s
7620: 74 72 6c 65 6e 28 7a 53 65 6c 65 63 74 6f 72 29 trlen(zSelector)
7630: 3b 0a 0a 20 20 66 6f 72 28 7a 3d 7a 43 73 73 3b ;.. for(z=zCss;
7640: 20 2a 7a 3b 20 7a 2b 3d 73 65 6c 65 63 74 6f 72 *z; z+=selector
7650: 4c 65 6e 29 7b 0a 20 20 20 20 7a 20 3d 20 73 74 Len){. z = st
7660: 72 73 74 72 28 7a 2c 20 7a 53 65 6c 65 63 74 6f rstr(z, zSelecto
7670: 72 29 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30 r);. if( z==0
7680: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 ) return 0;.
7690: 20 69 66 28 20 7a 21 3d 7a 43 73 73 20 29 7b 0a if( z!=zCss ){.
76a0: 20 20 20 20 20 20 66 6f 72 28 20 6e 3d 2d 31 3b for( n=-1;
76b0: 20 7a 2b 6e 21 3d 7a 43 73 73 20 26 26 20 66 6f z+n!=zCss && fo
76c0: 73 73 69 6c 5f 69 73 73 70 61 63 65 28 7a 5b 6e ssil_isspace(z[n
76d0: 5d 29 3b 20 6e 2d 2d 29 3b 0a 20 20 20 20 20 20 ]); n--);.
76e0: 69 66 28 20 7a 2b 6e 21 3d 7a 43 73 73 20 26 26 if( z+n!=zCss &&
76f0: 20 7a 5b 6e 5d 21 3d 27 2c 27 20 26 26 20 7a 5b z[n]!=',' && z[
7700: 6e 5d 21 3d 20 27 7d 27 20 26 26 20 7a 5b 6e 5d n]!= '}' && z[n]
7710: 21 3d 27 2f 27 20 29 20 63 6f 6e 74 69 6e 75 65 !='/' ) continue
7720: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 ;. }. for(
7730: 20 6e 3d 73 65 6c 65 63 74 6f 72 4c 65 6e 3b 20 n=selectorLen;
7740: 7a 5b 6e 5d 20 26 26 20 66 6f 73 73 69 6c 5f 69 z[n] && fossil_i
7750: 73 73 70 61 63 65 28 7a 5b 6e 5d 29 3b 20 6e 2b sspace(z[n]); n+
7760: 2b 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 5b 6e + );. if( z[n
7770: 5d 3d 3d 27 2c 27 20 7c 7c 20 7a 5b 6e 5d 3d 3d ]==',' || z[n]==
7780: 27 7b 27 20 7c 7c 20 7a 5b 6e 5d 3d 3d 27 2f 27 '{' || z[n]=='/'
7790: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d ) return 1;. }
77a0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a . return 0;.}..
77b0: 2f 2a 0a 2a 2a 20 43 4f 4d 4d 41 4e 44 3a 20 74 /*.** COMMAND: t
77c0: 65 73 74 2d 63 6f 6e 74 61 69 6e 73 2d 73 65 6c est-contains-sel
77d0: 65 63 74 6f 72 0a 2a 2a 0a 2a 2a 20 55 73 61 67 ector.**.** Usag
77e0: 65 3a 20 25 66 6f 73 73 69 6c 20 74 65 73 74 2d e: %fossil test-
77f0: 63 6f 6e 74 61 69 6e 73 2d 73 65 6c 65 63 74 6f contains-selecto
7800: 72 20 46 49 4c 45 4e 41 4d 45 20 53 45 4c 45 43 r FILENAME SELEC
7810: 54 4f 52 0a 2a 2a 0a 2a 2a 20 44 65 74 65 72 6d TOR.**.** Determ
7820: 69 6e 65 20 69 66 20 74 68 65 20 43 53 53 20 73 ine if the CSS s
7830: 74 79 6c 65 73 68 65 65 74 20 46 49 4c 45 4e 41 tylesheet FILENA
7840: 4d 45 20 63 6f 6e 74 61 69 6e 73 20 53 45 4c 45 ME contains SELE
7850: 43 54 4f 52 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 CTOR..**.** Note
7860: 20 74 68 61 74 20 61 73 20 6f 66 20 32 30 32 30 that as of 2020
7870: 2d 30 35 2d 32 38 2c 20 74 68 65 20 64 65 66 61 -05-28, the defa
7880: 75 6c 74 20 72 75 6c 65 73 20 61 72 65 20 61 6c ult rules are al
7890: 77 61 79 73 20 65 6d 69 74 74 65 64 2c 0a 2a 2a ways emitted,.**
78a0: 20 73 6f 20 74 68 65 20 63 6f 6e 74 61 69 6e 73 so the contains
78b0: 53 65 6c 65 63 74 6f 72 28 29 20 6c 6f 67 69 63 Selector() logic
78c0: 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 61 70 is no longer ap
78d0: 70 6c 69 65 64 20 77 68 65 6e 20 65 6d 69 74 74 plied when emitt
78e0: 69 6e 67 0a 2a 2a 20 73 74 79 6c 65 2e 63 73 73 ing.** style.css
78f0: 2e 20 49 74 20 69 73 20 75 6e 63 6c 65 61 72 20 . It is unclear
7900: 77 68 65 74 68 65 72 20 74 68 69 73 20 74 65 73 whether this tes
7910: 74 20 63 6f 6d 6d 61 6e 64 20 69 73 20 6e 6f 77 t command is now
7920: 20 6f 62 73 6f 6c 65 74 65 0a 2a 2a 20 6f 72 20 obsolete.** or
7930: 77 68 65 74 68 65 72 20 69 74 20 6d 61 79 20 73 whether it may s
7940: 74 69 6c 6c 20 73 65 72 76 65 20 61 20 70 75 72 till serve a pur
7950: 70 6f 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 63 6f pose..*/.void co
7960: 6e 74 61 69 6e 73 5f 73 65 6c 65 63 74 6f 72 5f ntains_selector_
7970: 63 6d 64 28 76 6f 69 64 29 7b 0a 20 20 69 6e 74 cmd(void){. int
7980: 20 66 6f 75 6e 64 3b 0a 20 20 63 68 61 72 20 2a found;. char *
7990: 7a 53 65 6c 65 63 74 6f 72 3b 0a 20 20 42 6c 6f zSelector;. Blo
79a0: 62 20 63 73 73 3b 0a 20 20 69 66 28 20 67 2e 61 b css;. if( g.a
79b0: 72 67 63 21 3d 34 20 29 20 75 73 61 67 65 28 22 rgc!=4 ) usage("
79c0: 46 49 4c 45 4e 41 4d 45 20 53 45 4c 45 43 54 4f FILENAME SELECTO
79d0: 52 22 29 3b 0a 20 20 62 6c 6f 62 5f 72 65 61 64 R");. blob_read
79e0: 5f 66 72 6f 6d 5f 66 69 6c 65 28 26 63 73 73 2c _from_file(&css,
79f0: 20 67 2e 61 72 67 76 5b 32 5d 2c 20 45 78 74 46 g.argv[2], ExtF
7a00: 49 4c 45 29 3b 0a 20 20 7a 53 65 6c 65 63 74 6f ILE);. zSelecto
7a10: 72 20 3d 20 67 2e 61 72 67 76 5b 33 5d 3b 0a 20 r = g.argv[3];.
7a20: 20 66 6f 75 6e 64 20 3d 20 63 6f 6e 74 61 69 6e found = contain
7a30: 73 53 65 6c 65 63 74 6f 72 28 62 6c 6f 62 5f 73 sSelector(blob_s
7a40: 74 72 28 26 63 73 73 29 2c 20 7a 53 65 6c 65 63 tr(&css), zSelec
7a50: 74 6f 72 29 3b 0a 20 20 66 6f 73 73 69 6c 5f 70 tor);. fossil_p
7a60: 72 69 6e 74 28 22 25 73 20 25 73 5c 6e 22 2c 20 rint("%s %s\n",
7a70: 7a 53 65 6c 65 63 74 6f 72 2c 20 66 6f 75 6e 64 zSelector, found
7a80: 20 3f 20 22 66 6f 75 6e 64 22 20 3a 20 22 6e 6f ? "found" : "no
7a90: 74 20 66 6f 75 6e 64 22 29 3b 0a 20 20 62 6c 6f t found");. blo
7aa0: 62 5f 72 65 73 65 74 28 26 63 73 73 29 3b 0a 7d b_reset(&css);.}
7ab0: 0a 0a 2f 2a 0a 2a 2a 20 57 45 42 50 41 47 45 3a ../*.** WEBPAGE:
7ac0: 20 73 63 72 69 70 74 2e 6a 73 0a 2a 2a 0a 2a 2a script.js.**.**
7ad0: 20 52 65 74 75 72 6e 20 74 68 65 20 22 4a 61 76 Return the "Jav
7ae0: 61 73 63 72 69 70 74 22 20 63 6f 6e 74 65 6e 74 ascript" content
7af0: 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 for the current
7b00: 20 73 6b 69 6e 20 28 69 66 20 74 68 65 72 65 20 skin (if there
7b10: 69 73 20 61 6e 79 29 0a 2a 2f 0a 76 6f 69 64 20 is any).*/.void
7b20: 70 61 67 65 5f 73 63 72 69 70 74 5f 6a 73 28 76 page_script_js(v
7b30: 6f 69 64 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 oid){. const ch
7b40: 61 72 20 2a 7a 53 63 72 69 70 74 20 3d 20 73 6b ar *zScript = sk
7b50: 69 6e 5f 67 65 74 28 22 6a 73 22 29 3b 0a 20 20 in_get("js");.
7b60: 69 66 28 20 50 28 22 74 65 73 74 22 29 20 29 7b if( P("test") ){
7b70: 0a 20 20 20 20 2f 2a 20 52 65 6e 64 65 72 20 74 . /* Render t
7b80: 68 65 20 73 63 72 69 70 74 20 61 73 20 70 6c 61 he script as pla
7b90: 69 6e 2d 74 65 78 74 20 66 6f 72 20 74 65 73 74 in-text for test
7ba0: 69 6e 67 20 70 75 72 70 6f 73 65 73 2c 20 69 66 ing purposes, if
7bb0: 20 74 68 65 20 22 74 65 73 74 22 0a 20 20 20 20 the "test".
7bc0: 2a 2a 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 ** query paramet
7bd0: 65 72 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f er is present */
7be0: 0a 20 20 20 20 63 67 69 5f 73 65 74 5f 63 6f 6e . cgi_set_con
7bf0: 74 65 6e 74 5f 74 79 70 65 28 22 74 65 78 74 2f tent_type("text/
7c00: 70 6c 61 69 6e 22 29 3b 0a 20 20 7d 65 6c 73 65 plain");. }else
7c10: 7b 0a 20 20 20 20 2f 2a 20 44 65 66 61 75 6c 74 {. /* Default
7c20: 20 62 65 68 61 76 69 6f 72 20 69 73 20 74 6f 20 behavior is to
7c30: 72 65 74 75 72 6e 20 6a 61 76 61 73 63 72 69 70 return javascrip
7c40: 74 20 2a 2f 0a 20 20 20 20 63 67 69 5f 73 65 74 t */. cgi_set
7c50: 5f 63 6f 6e 74 65 6e 74 5f 74 79 70 65 28 22 61 _content_type("a
7c60: 70 70 6c 69 63 61 74 69 6f 6e 2f 6a 61 76 61 73 pplication/javas
7c70: 63 72 69 70 74 22 29 3b 0a 20 20 7d 0a 20 20 73 cript");. }. s
7c80: 74 79 6c 65 5f 69 6e 69 74 5f 74 68 31 5f 76 61 tyle_init_th1_va
7c90: 72 73 28 30 29 3b 0a 20 20 54 68 5f 52 65 6e 64 rs(0);. Th_Rend
7ca0: 65 72 28 7a 53 63 72 69 70 74 3f 7a 53 63 72 69 er(zScript?zScri
7cb0: 70 74 3a 22 22 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a pt:"");.}../*.**
7cc0: 20 49 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 22 If one of the "
7cd0: 6e 61 6d 65 22 20 6f 72 20 22 70 61 67 65 22 20 name" or "page"
7ce0: 55 52 4c 20 70 61 72 61 6d 65 74 65 72 73 20 28 URL parameters (
7cf0: 69 6e 20 74 68 61 74 20 6f 72 64 65 72 29 0a 2a in that order).*
7d00: 2a 20 69 73 20 73 65 74 20 74 68 65 6e 20 74 68 * is set then th
7d10: 69 73 20 66 75 6e 63 74 69 6f 6e 20 6c 6f 6f 6b is function look
7d20: 73 20 66 6f 72 20 70 61 67 65 2f 70 61 67 65 20 s for page/page
7d30: 67 72 6f 75 70 2d 73 70 65 63 69 66 69 63 0a 2a group-specific.*
7d40: 2a 20 43 53 53 20 61 6e 64 20 28 69 66 20 66 6f * CSS and (if fo
7d50: 75 6e 64 29 20 61 70 70 65 6e 64 73 20 69 74 20 und) appends it
7d60: 74 6f 20 70 4f 75 74 2c 20 65 6c 73 65 20 69 74 to pOut, else it
7d70: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a is a no-op..*/.
7d80: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 static void page
7d90: 5f 73 74 79 6c 65 5f 63 73 73 5f 61 70 70 65 6e _style_css_appen
7da0: 64 5f 70 61 67 65 5f 73 74 79 6c 65 28 42 6c 6f d_page_style(Blo
7db0: 62 20 2a 70 4f 75 74 29 7b 0a 20 20 63 6f 6e 73 b *pOut){. cons
7dc0: 74 20 63 68 61 72 20 2a 7a 50 61 67 65 20 3d 20 t char *zPage =
7dd0: 50 44 28 22 6e 61 6d 65 22 2c 50 28 22 70 61 67 PD("name",P("pag
7de0: 65 22 29 29 3b 0a 20 20 63 68 61 72 20 2a 20 7a e"));. char * z
7df0: 46 69 6c 65 3b 0a 20 20 69 6e 74 20 6e 46 69 6c File;. int nFil
7e00: 65 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 63 e = 0;. const c
7e10: 68 61 72 20 2a 7a 42 75 69 6c 74 69 6e 3b 0a 0a har *zBuiltin;..
7e20: 20 20 69 66 28 7a 50 61 67 65 3d 3d 30 20 7c 7c if(zPage==0 ||
7e30: 20 7a 50 61 67 65 5b 30 5d 3d 3d 30 29 7b 0a 20 zPage[0]==0){.
7e40: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 return;. }.
7e50: 20 7a 46 69 6c 65 20 3d 20 6d 70 72 69 6e 74 66 zFile = mprintf
7e60: 28 22 73 74 79 6c 65 2e 25 73 2e 63 73 73 22 2c ("style.%s.css",
7e70: 20 7a 50 61 67 65 29 3b 0a 20 20 7a 42 75 69 6c zPage);. zBuil
7e80: 74 69 6e 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 tin = (const cha
7e90: 72 20 2a 29 62 75 69 6c 74 69 6e 5f 66 69 6c 65 r *)builtin_file
7ea0: 28 7a 46 69 6c 65 2c 20 26 6e 46 69 6c 65 29 3b (zFile, &nFile);
7eb0: 0a 20 20 69 66 28 6e 46 69 6c 65 3e 30 29 7b 0a . if(nFile>0){.
7ec0: 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 blob_appendf
7ed0: 28 70 4f 75 74 2c 0a 20 20 20 20 20 20 22 5c 6e (pOut,. "\n
7ee0: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a /***************
7ef0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
7f00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
7f10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 5c 6e 22 0a ************\n".
7f20: 20 20 20 20 20 20 22 2a 2a 20 53 74 61 72 74 20 "** Start
7f30: 6f 66 20 70 61 67 65 2d 73 70 65 63 69 66 69 63 of page-specific
7f40: 20 43 53 53 20 66 6f 72 20 70 61 67 65 20 25 73 CSS for page %s
7f50: 2e 2e 2e 5c 6e 22 0a 20 20 20 20 20 20 22 2a 2a ...\n". "**
7f60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
7f70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
7f80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
7f90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 5c 6e 22 2c 0a 20 *********/\n",.
7fa0: 20 20 20 20 20 7a 50 61 67 65 29 3b 0a 20 20 20 zPage);.
7fb0: 20 62 6c 6f 62 5f 61 70 70 65 6e 64 28 70 4f 75 blob_append(pOu
7fc0: 74 2c 20 7a 42 75 69 6c 74 69 6e 2c 20 6e 46 69 t, zBuiltin, nFi
7fd0: 6c 65 29 3b 0a 20 20 20 20 62 6c 6f 62 5f 61 70 le);. blob_ap
7fe0: 70 65 6e 64 66 28 70 4f 75 74 2c 0a 20 20 20 20 pendf(pOut,.
7ff0: 20 20 22 5c 6e 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a "\n/**********
8000: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
8010: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
8020: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
8030: 2a 5c 6e 22 0a 20 20 20 20 20 20 22 2a 2a 20 45 *\n". "** E
8040: 6e 64 20 6f 66 20 70 61 67 65 2d 73 70 65 63 69 nd of page-speci
8050: 66 69 63 20 43 53 53 20 66 6f 72 20 70 61 67 65 fic CSS for page
8060: 20 25 73 2e 5c 6e 22 0a 20 20 20 20 20 20 22 2a %s.\n". "*
8070: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
8080: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
8090: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
80a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 5c 6e 22 2c 0a **********/\n",.
80b0: 20 20 20 20 20 20 7a 50 61 67 65 29 3b 0a 20 20 zPage);.
80c0: 20 20 66 6f 73 73 69 6c 5f 66 72 65 65 28 7a 46 fossil_free(zF
80d0: 69 6c 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e ile);. return
80e0: 3b 0a 20 20 7d 0a 20 20 2f 2a 20 50 6f 74 65 6e ;. }. /* Poten
80f0: 74 69 61 6c 20 54 4f 44 4f 3a 20 63 68 65 63 6b tial TODO: check
8100: 20 66 6f 72 20 61 6c 69 61 73 65 73 2f 70 61 67 for aliases/pag
8110: 65 20 67 72 6f 75 70 73 2e 20 65 2e 67 2e 20 67 e groups. e.g. g
8120: 72 6f 75 70 20 61 6c 6c 0a 20 20 2a 2a 20 2f 66 roup all. ** /f
8130: 6f 72 75 6d 58 59 5a 20 43 53 53 20 69 6e 74 6f orumXYZ CSS into
8140: 20 6f 6e 65 20 66 69 6c 65 2c 20 61 6c 6c 20 2f one file, all /
8150: 73 65 74 75 70 58 59 5a 20 69 6e 74 6f 20 61 6e setupXYZ into an
8160: 6f 74 68 65 72 2c 20 65 74 63 2e 20 41 73 0a 20 other, etc. As.
8170: 20 2a 2a 20 6f 66 20 74 68 69 73 20 77 72 69 74 ** of this writ
8180: 69 6e 67 2c 20 64 6f 69 6e 67 20 73 6f 20 77 6f ing, doing so wo
8190: 75 6c 64 20 6f 6e 6c 79 20 73 68 61 76 65 20 61 uld only shave a
81a0: 20 66 65 77 20 6b 62 20 66 72 6f 6d 0a 20 20 2a few kb from. *
81b0: 2a 20 64 65 66 61 75 6c 74 2e 63 73 73 2e 20 2a * default.css. *
81c0: 2f 0a 20 20 66 6f 73 73 69 6c 5f 66 72 65 65 28 /. fossil_free(
81d0: 7a 46 69 6c 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a zFile);.}../*.**
81e0: 20 57 45 42 50 41 47 45 3a 20 73 74 79 6c 65 2e WEBPAGE: style.
81f0: 63 73 73 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e css.**.** Return
8200: 20 74 68 65 20 73 74 79 6c 65 20 73 68 65 65 74 the style sheet
8210: 2e 0a 2a 2f 0a 76 6f 69 64 20 70 61 67 65 5f 73 ..*/.void page_s
8220: 74 79 6c 65 5f 63 73 73 28 76 6f 69 64 29 7b 0a tyle_css(void){.
8230: 20 20 42 6c 6f 62 20 63 73 73 20 3d 20 65 6d 70 Blob css = emp
8240: 74 79 5f 62 6c 6f 62 3b 0a 20 20 69 6e 74 20 69 ty_blob;. int i
8250: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a ;. const char *
8260: 20 7a 44 65 66 61 75 6c 74 73 3b 0a 0a 20 20 63 zDefaults;.. c
8270: 67 69 5f 73 65 74 5f 63 6f 6e 74 65 6e 74 5f 74 gi_set_content_t
8280: 79 70 65 28 22 74 65 78 74 2f 63 73 73 22 29 3b ype("text/css");
8290: 0a 20 20 2f 2a 20 45 6d 69 74 20 61 6c 6c 20 64 . /* Emit all d
82a0: 65 66 61 75 6c 74 20 72 75 6c 65 73 2e 2e 2e 20 efault rules...
82b0: 2a 2f 0a 20 20 7a 44 65 66 61 75 6c 74 73 20 3d */. zDefaults =
82c0: 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 62 75 (const char*)bu
82d0: 69 6c 74 69 6e 5f 66 69 6c 65 28 22 64 65 66 61 iltin_file("defa
82e0: 75 6c 74 2e 63 73 73 22 2c 20 26 69 29 3b 0a 20 ult.css", &i);.
82f0: 20 62 6c 6f 62 5f 61 70 70 65 6e 64 28 26 63 73 blob_append(&cs
8300: 73 2c 20 7a 44 65 66 61 75 6c 74 73 2c 20 69 29 s, zDefaults, i)
8310: 3b 0a 20 20 2f 2a 20 50 61 67 65 2d 73 70 65 63 ;. /* Page-spec
8320: 69 66 69 63 20 43 53 53 2c 20 69 66 20 61 6e 79 ific CSS, if any
8330: 2e 2e 2e 20 2a 2f 0a 20 20 70 61 67 65 5f 73 74 ... */. page_st
8340: 79 6c 65 5f 63 73 73 5f 61 70 70 65 6e 64 5f 70 yle_css_append_p
8350: 61 67 65 5f 73 74 79 6c 65 28 26 63 73 73 29 3b age_style(&css);
8360: 0a 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 28 26 . blob_append(&
8370: 63 73 73 2c 0a 20 20 20 20 20 22 5c 6e 2f 2a 2a css,. "\n/**
8380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
8390: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
83a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
83b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 5c 6e 22 0a 20 20 20 *********\n".
83c0: 20 20 22 2a 2a 20 41 6c 6c 20 43 53 53 20 77 68 "** All CSS wh
83d0: 69 63 68 20 66 6f 6c 6c 6f 77 73 20 69 73 20 73 ich follows is s
83e0: 75 70 70 6c 69 65 64 20 62 79 20 74 68 65 20 72 upplied by the r
83f0: 65 70 6f 73 69 74 6f 72 79 20 5c 22 73 6b 69 6e epository \"skin
8400: 5c 22 2e 5c 6e 22 0a 20 20 20 20 20 22 2a 2a 2a \".\n". "***
8410: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
8420: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
8430: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
8440: 2a 2a 2a 2a 2a 2a 2a 2a 2f 5c 6e 22 2c 0a 20 20 ********/\n",.
8450: 20 20 20 2d 31 29 3b 0a 20 20 62 6c 6f 62 5f 61 -1);. blob_a
8460: 70 70 65 6e 64 28 26 63 73 73 2c 73 6b 69 6e 5f ppend(&css,skin_
8470: 67 65 74 28 22 63 73 73 22 29 2c 2d 31 29 3b 0a get("css"),-1);.
8480: 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 74 68 72 /* Process thr
8490: 6f 75 67 68 20 54 48 31 20 69 6e 20 6f 72 64 65 ough TH1 in orde
84a0: 72 20 74 6f 20 67 69 76 65 20 61 6e 20 6f 70 70 r to give an opp
84b0: 6f 72 74 75 6e 69 74 79 20 74 6f 20 73 75 62 73 ortunity to subs
84c0: 74 69 74 75 74 65 0a 20 20 2a 2a 20 76 61 72 69 titute. ** vari
84d0: 61 62 6c 65 73 20 73 75 63 68 20 61 73 20 24 62 ables such as $b
84e0: 61 73 65 75 72 6c 2e 0a 20 20 2a 2f 0a 20 20 54 aseurl.. */. T
84f0: 68 5f 53 74 6f 72 65 28 22 62 61 73 65 75 72 6c h_Store("baseurl
8500: 22 2c 20 67 2e 7a 42 61 73 65 55 52 4c 29 3b 0a ", g.zBaseURL);.
8510: 20 20 54 68 5f 53 74 6f 72 65 28 22 73 65 63 75 Th_Store("secu
8520: 72 65 75 72 6c 22 2c 20 66 6f 73 73 69 6c 5f 77 reurl", fossil_w
8530: 61 6e 74 73 5f 68 74 74 70 73 28 31 29 3f 20 67 ants_https(1)? g
8540: 2e 7a 48 74 74 70 73 55 52 4c 3a 20 67 2e 7a 42 .zHttpsURL: g.zB
8550: 61 73 65 55 52 4c 29 3b 0a 20 20 54 68 5f 53 74 aseURL);. Th_St
8560: 6f 72 65 28 22 68 6f 6d 65 22 2c 20 67 2e 7a 54 ore("home", g.zT
8570: 6f 70 29 3b 0a 20 20 69 6d 61 67 65 5f 75 72 6c op);. image_url
8580: 5f 76 61 72 28 22 6c 6f 67 6f 22 29 3b 0a 20 20 _var("logo");.
8590: 69 6d 61 67 65 5f 75 72 6c 5f 76 61 72 28 22 62 image_url_var("b
85a0: 61 63 6b 67 72 6f 75 6e 64 22 29 3b 0a 20 20 54 ackground");. T
85b0: 68 5f 52 65 6e 64 65 72 28 62 6c 6f 62 5f 73 74 h_Render(blob_st
85c0: 72 28 26 63 73 73 29 29 3b 0a 0a 20 20 2f 2a 20 r(&css));.. /*
85d0: 54 65 6c 6c 20 43 47 49 20 74 68 61 74 20 74 68 Tell CGI that th
85e0: 65 20 63 6f 6e 74 65 6e 74 20 72 65 74 75 72 6e e content return
85f0: 65 64 20 62 79 20 74 68 69 73 20 70 61 67 65 20 ed by this page
8600: 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 63 61 is considered ca
8610: 63 68 65 61 62 6c 65 20 2a 2f 0a 20 20 67 2e 69 cheable */. g.i
8620: 73 43 6f 6e 73 74 20 3d 20 31 3b 0a 7d 0a 0a 2f sConst = 1;.}../
8630: 2a 0a 2a 2a 20 57 45 42 50 41 47 45 3a 20 62 75 *.** WEBPAGE: bu
8640: 69 6c 74 69 6e 0a 2a 2a 20 55 52 4c 3a 20 20 62 iltin.** URL: b
8650: 75 69 6c 74 69 6e 2f 46 49 4c 45 4e 41 4d 45 0a uiltin/FILENAME.
8660: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 **.** Return the
8670: 20 62 75 69 6c 74 2d 69 6e 20 74 65 78 74 20 67 built-in text g
8680: 69 76 65 6e 20 62 79 20 46 49 4c 45 4e 41 4d 45 iven by FILENAME
8690: 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20 . This is used
86a0: 69 6e 74 65 72 6e 61 6c 6c 79 20 0a 2a 2a 20 62 internally .** b
86b0: 79 20 6d 61 6e 79 20 46 6f 73 73 69 6c 20 77 65 y many Fossil we
86c0: 62 20 70 61 67 65 73 20 74 6f 20 6c 6f 61 64 20 b pages to load
86d0: 62 75 69 6c 74 2d 69 6e 20 6a 61 76 61 73 63 72 built-in javascr
86e0: 69 70 74 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a ipt files..**.**
86f0: 20 49 66 20 74 68 65 20 69 64 3d 20 71 75 65 72 If the id= quer
8700: 79 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 70 y parameter is p
8710: 72 65 73 65 6e 74 2c 20 74 68 65 6e 20 46 6f 73 resent, then Fos
8720: 73 69 6c 20 61 73 73 75 6d 65 73 20 74 68 61 74 sil assumes that
8730: 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 20 69 the.** result i
8740: 73 20 69 6d 6d 75 74 61 62 6c 65 20 61 6e 64 20 s immutable and
8750: 73 65 74 73 20 61 20 76 65 72 79 20 6c 61 72 67 sets a very larg
8760: 65 20 63 61 63 68 65 20 72 65 74 65 6e 74 69 6f e cache retentio
8770: 6e 20 74 69 6d 65 20 28 31 20 79 65 61 72 29 2e n time (1 year).
8780: 0a 2a 2f 0a 76 6f 69 64 20 70 61 67 65 5f 62 75 .*/.void page_bu
8790: 69 6c 74 69 6e 5f 74 65 78 74 28 76 6f 69 64 29 iltin_text(void)
87a0: 7b 0a 20 20 42 6c 6f 62 20 6f 75 74 3b 0a 20 20 {. Blob out;.
87b0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d const char *zNam
87c0: 65 20 3d 20 50 28 22 6e 61 6d 65 22 29 3b 0a 20 e = P("name");.
87d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 78 const char *zTx
87e0: 74 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 63 t = 0;. const c
87f0: 68 61 72 20 2a 7a 49 64 20 3d 20 50 28 22 69 64 har *zId = P("id
8800: 22 29 3b 0a 20 20 69 6e 74 20 6e 49 64 3b 0a 20 ");. int nId;.
8810: 20 69 66 28 20 7a 4e 61 6d 65 20 29 20 7a 54 78 if( zName ) zTx
8820: 74 20 3d 20 62 75 69 6c 74 69 6e 5f 74 65 78 74 t = builtin_text
8830: 28 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a (zName);. if( z
8840: 54 78 74 3d 3d 30 20 29 7b 0a 20 20 20 20 63 67 Txt==0 ){. cg
8850: 69 5f 73 65 74 5f 73 74 61 74 75 73 28 34 30 34 i_set_status(404
8860: 2c 20 22 4e 6f 74 20 46 6f 75 6e 64 22 29 3b 0a , "Not Found");.
8870: 20 20 20 20 40 20 46 69 6c 65 20 22 25 68 28 7a @ File "%h(z
8880: 4e 61 6d 65 29 22 20 6e 6f 74 20 66 6f 75 6e 64 Name)" not found
8890: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d . return;. }
88a0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 . if( sqlite3_s
88b0: 74 72 67 6c 6f 62 28 22 2a 2e 6a 73 22 2c 20 7a trglob("*.js", z
88c0: 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 Name)==0 ){.
88d0: 63 67 69 5f 73 65 74 5f 63 6f 6e 74 65 6e 74 5f cgi_set_content_
88e0: 74 79 70 65 28 22 61 70 70 6c 69 63 61 74 69 6f type("applicatio
88f0: 6e 2f 6a 61 76 61 73 63 72 69 70 74 22 29 3b 0a n/javascript");.
8900: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 67 69 }else{. cgi
8910: 5f 73 65 74 5f 63 6f 6e 74 65 6e 74 5f 74 79 70 _set_content_typ
8920: 65 28 22 74 65 78 74 2f 70 6c 61 69 6e 22 29 3b e("text/plain");
8930: 0a 20 20 7d 0a 20 20 69 66 28 20 7a 49 64 20 26 . }. if( zId &
8940: 26 20 28 6e 49 64 20 3d 20 28 69 6e 74 29 73 74 & (nId = (int)st
8950: 72 6c 65 6e 28 7a 49 64 29 29 3e 3d 38 20 26 26 rlen(zId))>=8 &&
8960: 20 73 74 72 6e 63 6d 70 28 7a 49 64 2c 4d 41 4e strncmp(zId,MAN
8970: 49 46 45 53 54 5f 55 55 49 44 2c 6e 49 64 29 3d IFEST_UUID,nId)=
8980: 3d 30 20 29 7b 0a 20 20 20 20 67 2e 69 73 43 6f =0 ){. g.isCo
8990: 6e 73 74 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 nst = 1;. }else
89a0: 7b 0a 20 20 20 20 65 74 61 67 5f 63 68 65 63 6b {. etag_check
89b0: 28 30 2c 30 29 3b 0a 20 20 7d 0a 20 20 62 6c 6f (0,0);. }. blo
89c0: 62 5f 69 6e 69 74 28 26 6f 75 74 2c 20 7a 54 78 b_init(&out, zTx
89d0: 74 2c 20 2d 31 29 3b 0a 20 20 63 67 69 5f 73 65 t, -1);. cgi_se
89e0: 74 5f 63 6f 6e 74 65 6e 74 28 26 6f 75 74 29 3b t_content(&out);
89f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 20 70 6f .}../*.** All po
8a00: 73 73 69 62 6c 65 20 63 61 70 61 62 69 6c 69 74 ssible capabilit
8a10: 69 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f ies.*/.static co
8a20: 6e 73 74 20 63 68 61 72 20 61 6c 6c 43 61 70 5b nst char allCap[
8a30: 5d 20 3d 20 0a 20 20 22 61 62 63 64 65 66 67 68 ] = . "abcdefgh
8a40: 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 ijklmnopqrstuvwx
8a50: 79 7a 30 31 32 33 34 35 36 37 38 39 41 42 43 44 yz0123456789ABCD
8a60: 45 46 47 48 49 4a 4b 4c 22 3b 0a 0a 2f 2a 0a 2a EFGHIJKL";../*.*
8a70: 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 63 75 * Compute the cu
8a80: 72 72 65 6e 74 20 6c 6f 67 69 6e 20 63 61 70 61 rrent login capa
8a90: 62 69 6c 69 74 69 65 73 0a 2a 2f 0a 73 74 61 74 bilities.*/.stat
8aa0: 69 63 20 63 68 61 72 20 2a 66 69 6e 64 5f 63 61 ic char *find_ca
8ab0: 70 61 62 69 6c 69 74 69 65 73 28 63 68 61 72 20 pabilities(char
8ac0: 2a 7a 43 61 70 29 7b 0a 20 20 69 6e 74 20 69 2c *zCap){. int i,
8ad0: 20 6a 3b 0a 20 20 63 68 61 72 20 63 3b 0a 20 20 j;. char c;.
8ae0: 66 6f 72 28 69 3d 6a 3d 30 3b 20 28 63 20 3d 20 for(i=j=0; (c =
8af0: 61 6c 6c 43 61 70 5b 6a 5d 29 21 3d 30 3b 20 6a allCap[j])!=0; j
8b00: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 6c 6f 67 ++){. if( log
8b10: 69 6e 5f 68 61 73 5f 63 61 70 61 62 69 6c 69 74 in_has_capabilit
8b20: 79 28 26 63 2c 20 31 2c 20 30 29 20 29 20 7a 43 y(&c, 1, 0) ) zC
8b30: 61 70 5b 69 2b 2b 5d 20 3d 20 63 3b 0a 20 20 7d ap[i++] = c;. }
8b40: 0a 20 20 7a 43 61 70 5b 69 5d 20 3d 20 30 3b 0a . zCap[i] = 0;.
8b50: 20 20 72 65 74 75 72 6e 20 7a 43 61 70 3b 0a 7d return zCap;.}
8b60: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 ../*.** Compute
8b70: 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 67 69 the current logi
8b80: 6e 20 63 61 70 61 62 69 6c 69 74 69 65 73 20 74 n capabilities t
8b90: 68 61 74 20 77 65 72 65 0a 2a 2a 20 63 6f 6e 74 hat were.** cont
8ba0: 72 69 62 75 74 65 64 20 62 79 20 41 6e 6f 6e 79 ributed by Anony
8bb0: 6d 6f 75 73 0a 2a 2f 0a 73 74 61 74 69 63 20 63 mous.*/.static c
8bc0: 68 61 72 20 2a 66 69 6e 64 5f 61 6e 6f 6e 5f 63 har *find_anon_c
8bd0: 61 70 61 62 69 6c 69 74 69 65 73 28 63 68 61 72 apabilities(char
8be0: 20 2a 7a 43 61 70 29 7b 0a 20 20 69 6e 74 20 69 *zCap){. int i
8bf0: 2c 20 6a 3b 0a 20 20 63 68 61 72 20 63 3b 0a 20 , j;. char c;.
8c00: 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 28 63 20 3d for(i=j=0; (c =
8c10: 20 61 6c 6c 43 61 70 5b 6a 5d 29 21 3d 30 3b 20 allCap[j])!=0;
8c20: 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 6c 6f j++){. if( lo
8c30: 67 69 6e 5f 68 61 73 5f 63 61 70 61 62 69 6c 69 gin_has_capabili
8c40: 74 79 28 26 63 2c 20 31 2c 20 4c 4f 47 49 4e 5f ty(&c, 1, LOGIN_
8c50: 41 4e 4f 4e 29 0a 20 20 20 20 20 20 26 26 20 21 ANON). && !
8c60: 6c 6f 67 69 6e 5f 68 61 73 5f 63 61 70 61 62 69 login_has_capabi
8c70: 6c 69 74 79 28 26 63 2c 20 31 2c 20 30 29 20 29 lity(&c, 1, 0) )
8c80: 20 7a 43 61 70 5b 69 2b 2b 5d 20 3d 20 63 3b 0a zCap[i++] = c;.
8c90: 20 20 7d 0a 20 20 7a 43 61 70 5b 69 5d 20 3d 20 }. zCap[i] =
8ca0: 30 3b 0a 20 20 72 65 74 75 72 6e 20 7a 43 61 70 0;. return zCap
8cb0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 45 42 50 41 ;.}../*.** WEBPA
8cc0: 47 45 3a 20 74 65 73 74 5f 65 6e 76 0a 2a 2a 0a GE: test_env.**.
8cd0: 2a 2a 20 44 69 73 70 6c 61 79 20 43 47 49 2d 76 ** Display CGI-v
8ce0: 61 72 69 61 62 6c 65 73 20 61 6e 64 20 6f 74 68 ariables and oth
8cf0: 65 72 20 61 73 70 65 63 74 73 20 6f 66 20 74 68 er aspects of th
8d00: 65 20 72 75 6e 2d 74 69 6d 65 0a 2a 2a 20 65 6e e run-time.** en
8d10: 76 69 72 6f 6e 6d 65 6e 74 2c 20 66 6f 72 20 64 vironment, for d
8d20: 65 62 75 67 67 69 6e 67 20 61 6e 64 20 74 72 6f ebugging and tro
8d30: 75 62 6c 65 2d 73 68 6f 6f 74 69 6e 67 20 70 75 uble-shooting pu
8d40: 72 70 6f 73 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 rposes..*/.void
8d50: 70 61 67 65 5f 74 65 73 74 5f 65 6e 76 28 76 6f page_test_env(vo
8d60: 69 64 29 7b 0a 20 20 77 65 62 70 61 67 65 5f 65 id){. webpage_e
8d70: 72 72 6f 72 28 22 22 29 3b 0a 7d 0a 0a 2f 2a 0a rror("");.}../*.
8d80: 2a 2a 20 57 45 42 50 41 47 45 3a 20 68 6f 6e 65 ** WEBPAGE: hone
8d90: 79 70 6f 74 0a 2a 2a 20 54 68 69 73 20 70 61 67 ypot.** This pag
8da0: 65 20 69 73 20 61 20 68 6f 6e 65 79 70 6f 74 20 e is a honeypot
8db0: 66 6f 72 20 73 70 69 64 65 72 73 20 61 6e 64 20 for spiders and
8dc0: 62 6f 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20 68 6f bots..*/.void ho
8dd0: 6e 65 79 70 6f 74 5f 70 61 67 65 28 76 6f 69 64 neypot_page(void
8de0: 29 7b 0a 20 20 63 67 69 5f 73 65 74 5f 73 74 61 ){. cgi_set_sta
8df0: 74 75 73 28 34 30 33 2c 20 22 46 6f 72 62 69 64 tus(403, "Forbid
8e00: 64 65 6e 22 29 3b 0a 20 20 40 20 3c 70 3e 50 6c den");. @ <p>Pl
8e10: 65 61 73 65 20 65 6e 61 62 6c 65 20 6a 61 76 61 ease enable java
8e20: 73 63 72 69 70 74 20 6f 72 20 6c 6f 67 20 69 6e script or log in
8e30: 20 74 6f 20 73 65 65 20 74 68 69 73 20 63 6f 6e to see this con
8e40: 74 65 6e 74 3c 2f 70 3e 0a 7d 0a 0a 2f 2a 0a 2a tent</p>.}../*.*
8e50: 2a 20 57 65 62 70 61 67 65 73 20 74 68 61 74 20 * Webpages that
8e60: 65 6e 63 6f 75 6e 74 65 72 20 61 6e 20 65 72 72 encounter an err
8e70: 6f 72 20 64 75 65 20 74 6f 20 6d 69 73 73 69 6e or due to missin
8e80: 67 20 6f 72 20 69 6e 63 6f 72 72 65 63 74 0a 2a g or incorrect.*
8e90: 2a 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 * query paramete
8ea0: 72 73 20 63 61 6e 20 6a 75 6d 70 20 74 6f 20 74 rs can jump to t
8eb0: 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 20 72 his routine to r
8ec0: 65 6e 64 65 72 20 61 6e 20 65 72 72 6f 72 0a 2a ender an error.*
8ed0: 2a 20 6d 65 73 73 61 67 65 20 73 63 72 65 65 6e * message screen
8ee0: 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 64 6d 69 ..**.** For admi
8ef0: 6e 69 73 74 61 74 6f 72 73 2c 20 6f 72 20 69 66 nistators, or if
8f00: 20 74 68 65 20 74 65 73 74 5f 65 6e 76 5f 65 6e the test_env_en
8f10: 61 62 6c 65 20 73 65 74 74 69 6e 67 20 69 73 20 able setting is
8f20: 74 72 75 65 2c 20 74 68 65 6e 0a 2a 2a 20 64 65 true, then.** de
8f30: 74 61 69 6c 73 20 6f 66 20 74 68 65 20 72 65 71 tails of the req
8f40: 75 65 73 74 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 uest environment
8f50: 20 61 72 65 20 64 69 73 70 6c 61 79 65 64 2e 20 are displayed.
8f60: 20 4f 74 68 65 72 77 69 73 65 2c 20 6a 75 73 74 Otherwise, just
8f70: 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 20 6d 65 .** the error me
8f80: 73 73 61 67 65 20 69 73 20 73 68 6f 77 6e 2e 0a ssage is shown..
8f90: 2a 2a 0a 2a 2a 20 49 66 20 7a 46 6f 72 6d 61 74 **.** If zFormat
8fa0: 20 69 73 20 61 6e 20 65 6d 70 74 79 20 73 74 72 is an empty str
8fb0: 69 6e 67 2c 20 74 68 65 6e 20 74 68 69 73 20 69 ing, then this i
8fc0: 73 20 74 68 65 20 2f 74 65 73 74 5f 65 6e 76 20 s the /test_env
8fd0: 70 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20 77 65 page..*/.void we
8fe0: 62 70 61 67 65 5f 65 72 72 6f 72 28 63 6f 6e 73 bpage_error(cons
8ff0: 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c t char *zFormat,
9000: 20 2e 2e 2e 29 7b 0a 20 20 69 6e 74 20 73 68 6f ...){. int sho
9010: 77 41 6c 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 45 wAll;. char *zE
9020: 72 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 73 rr = 0;. int is
9030: 41 75 74 68 20 3d 20 30 3b 0a 20 20 63 68 61 72 Auth = 0;. char
9040: 20 7a 43 61 70 5b 31 30 30 5d 3b 0a 0a 20 20 6c zCap[100];.. l
9050: 6f 67 69 6e 5f 63 68 65 63 6b 5f 63 72 65 64 65 ogin_check_crede
9060: 6e 74 69 61 6c 73 28 29 3b 0a 20 20 69 66 28 20 ntials();. if(
9070: 67 2e 70 65 72 6d 2e 41 64 6d 69 6e 20 7c 7c 20 g.perm.Admin ||
9080: 67 2e 70 65 72 6d 2e 53 65 74 75 70 20 20 7c 7c g.perm.Setup ||
9090: 20 64 62 5f 67 65 74 5f 62 6f 6f 6c 65 61 6e 28 db_get_boolean(
90a0: 22 74 65 73 74 5f 65 6e 76 5f 65 6e 61 62 6c 65 "test_env_enable
90b0: 22 2c 30 29 20 29 7b 0a 20 20 20 20 69 73 41 75 ",0) ){. isAu
90c0: 74 68 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 63 67 th = 1;. }. cg
90d0: 69 5f 6c 6f 61 64 5f 65 6e 76 69 72 6f 6e 6d 65 i_load_environme
90e0: 6e 74 28 29 3b 0a 20 20 69 66 28 20 7a 46 6f 72 nt();. if( zFor
90f0: 6d 61 74 5b 30 5d 20 29 7b 0a 20 20 20 20 76 61 mat[0] ){. va
9100: 5f 6c 69 73 74 20 61 70 3b 0a 20 20 20 20 76 61 _list ap;. va
9110: 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d _start(ap, zForm
9120: 61 74 29 3b 0a 20 20 20 20 7a 45 72 72 20 3d 20 at);. zErr =
9130: 76 6d 70 72 69 6e 74 66 28 7a 46 6f 72 6d 61 74 vmprintf(zFormat
9140: 2c 20 61 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e , ap);. va_en
9150: 64 28 61 70 29 3b 0a 20 20 20 20 73 74 79 6c 65 d(ap);. style
9160: 5f 68 65 61 64 65 72 28 22 42 61 64 20 52 65 71 _header("Bad Req
9170: 75 65 73 74 22 29 3b 0a 20 20 20 20 40 20 3c 68 uest");. @ <h
9180: 31 3e 2f 25 68 28 67 2e 7a 50 61 74 68 29 3a 20 1>/%h(g.zPath):
9190: 25 68 28 7a 45 72 72 29 3c 2f 68 31 3e 0a 20 20 %h(zErr)</h1>.
91a0: 20 20 73 68 6f 77 41 6c 6c 20 3d 20 30 3b 0a 20 showAll = 0;.
91b0: 20 20 20 63 67 69 5f 73 65 74 5f 73 74 61 74 75 cgi_set_statu
91c0: 73 28 35 30 30 2c 20 22 42 61 64 20 52 65 71 75 s(500, "Bad Requ
91d0: 65 73 74 22 29 3b 0a 20 20 7d 65 6c 73 65 20 69 est");. }else i
91e0: 66 28 20 21 69 73 41 75 74 68 20 29 7b 0a 20 20 f( !isAuth ){.
91f0: 20 20 6c 6f 67 69 6e 5f 6e 65 65 64 65 64 28 30 login_needed(0
9200: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 );. return;.
9210: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 74 79 6c }else{. styl
9220: 65 5f 68 65 61 64 65 72 28 22 45 6e 76 69 72 6f e_header("Enviro
9230: 6e 6d 65 6e 74 20 54 65 73 74 22 29 3b 0a 20 20 nment Test");.
9240: 20 20 73 68 6f 77 41 6c 6c 20 3d 20 50 42 28 22 showAll = PB("
9250: 73 68 6f 77 61 6c 6c 22 29 3b 0a 20 20 20 20 73 showall");. s
9260: 74 79 6c 65 5f 73 75 62 6d 65 6e 75 5f 63 68 65 tyle_submenu_che
9270: 63 6b 62 6f 78 28 22 73 68 6f 77 61 6c 6c 22 2c ckbox("showall",
9280: 20 22 43 6f 6f 6b 69 65 73 22 2c 20 30 2c 20 30 "Cookies", 0, 0
9290: 29 3b 0a 20 20 20 20 73 74 79 6c 65 5f 73 75 62 );. style_sub
92a0: 6d 65 6e 75 5f 65 6c 65 6d 65 6e 74 28 22 53 74 menu_element("St
92b0: 61 74 73 22 2c 20 22 25 52 2f 73 74 61 74 22 29 ats", "%R/stat")
92c0: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69 73 41 ;. }.. if( isA
92d0: 75 74 68 20 29 7b 0a 20 20 23 69 66 20 21 64 65 uth ){. #if !de
92e0: 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 0a 20 20 fined(_WIN32).
92f0: 20 20 40 20 75 69 64 3d 25 64 28 67 65 74 75 69 @ uid=%d(getui
9300: 64 28 29 29 2c 20 67 69 64 3d 25 64 28 67 65 74 d()), gid=%d(get
9310: 67 69 64 28 29 29 3c 62 72 20 2f 3e 0a 20 20 23 gid())<br />. #
9320: 65 6e 64 69 66 0a 20 20 20 20 40 20 67 2e 7a 42 endif. @ g.zB
9330: 61 73 65 55 52 4c 20 3d 20 25 68 28 67 2e 7a 42 aseURL = %h(g.zB
9340: 61 73 65 55 52 4c 29 3c 62 72 20 2f 3e 0a 20 20 aseURL)<br />.
9350: 20 20 40 20 67 2e 7a 48 74 74 70 73 55 52 4c 20 @ g.zHttpsURL
9360: 3d 20 25 68 28 67 2e 7a 48 74 74 70 73 55 52 4c = %h(g.zHttpsURL
9370: 29 3c 62 72 20 2f 3e 0a 20 20 20 20 40 20 67 2e )<br />. @ g.
9380: 7a 54 6f 70 20 3d 20 25 68 28 67 2e 7a 54 6f 70 zTop = %h(g.zTop
9390: 29 3c 62 72 20 2f 3e 0a 20 20 20 20 40 20 67 2e )<br />. @ g.
93a0: 7a 50 61 74 68 20 3d 20 25 68 28 67 2e 7a 50 61 zPath = %h(g.zPa
93b0: 74 68 29 3c 62 72 20 2f 3e 0a 20 20 20 20 40 20 th)<br />. @
93c0: 67 2e 75 73 65 72 55 69 64 20 3d 20 25 64 28 67 g.userUid = %d(g
93d0: 2e 75 73 65 72 55 69 64 29 3c 62 72 20 2f 3e 0a .userUid)<br />.
93e0: 20 20 20 20 40 20 67 2e 7a 4c 6f 67 69 6e 20 3d @ g.zLogin =
93f0: 20 25 68 28 67 2e 7a 4c 6f 67 69 6e 29 3c 62 72 %h(g.zLogin)<br
9400: 20 2f 3e 0a 20 20 20 20 40 20 67 2e 69 73 48 75 />. @ g.isHu
9410: 6d 61 6e 20 3d 20 25 64 28 67 2e 69 73 48 75 6d man = %d(g.isHum
9420: 61 6e 29 3c 62 72 20 2f 3e 0a 20 20 20 20 69 66 an)<br />. if
9430: 28 20 67 2e 6e 52 65 71 75 65 73 74 20 29 7b 0a ( g.nRequest ){.
9440: 20 20 20 20 20 20 40 20 67 2e 6e 52 65 71 75 65 @ g.nReque
9450: 73 74 20 3d 20 25 64 28 67 2e 6e 52 65 71 75 65 st = %d(g.nReque
9460: 73 74 29 3c 62 72 20 2f 3e 0a 20 20 20 20 7d 0a st)<br />. }.
9470: 20 20 20 20 69 66 28 20 67 2e 6e 50 65 6e 64 69 if( g.nPendi
9480: 6e 67 52 65 71 75 65 73 74 3e 31 20 29 7b 0a 20 ngRequest>1 ){.
9490: 20 20 20 20 20 40 20 67 2e 6e 50 65 6e 64 69 6e @ g.nPendin
94a0: 67 52 65 71 75 65 73 74 20 3d 20 25 64 28 67 2e gRequest = %d(g.
94b0: 6e 50 65 6e 64 69 6e 67 52 65 71 75 65 73 74 29 nPendingRequest)
94c0: 3c 62 72 20 2f 3e 0a 20 20 20 20 7d 0a 20 20 20 <br />. }.
94d0: 20 40 20 63 61 70 61 62 69 6c 69 74 69 65 73 20 @ capabilities
94e0: 3d 20 25 73 28 66 69 6e 64 5f 63 61 70 61 62 69 = %s(find_capabi
94f0: 6c 69 74 69 65 73 28 7a 43 61 70 29 29 3c 62 72 lities(zCap))<br
9500: 20 2f 3e 0a 20 20 20 20 69 66 28 20 7a 43 61 70 />. if( zCap
9510: 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 40 20 61 [0] ){. @ a
9520: 6e 6f 6e 79 6d 6f 75 73 2d 61 64 64 73 20 3d 20 nonymous-adds =
9530: 25 73 28 66 69 6e 64 5f 61 6e 6f 6e 5f 63 61 70 %s(find_anon_cap
9540: 61 62 69 6c 69 74 69 65 73 28 7a 43 61 70 29 29 abilities(zCap))
9550: 3c 62 72 20 2f 3e 0a 20 20 20 20 7d 0a 20 20 20 <br />. }.
9560: 20 40 20 67 2e 7a 52 65 70 6f 73 69 74 6f 72 79 @ g.zRepository
9570: 4e 61 6d 65 20 3d 20 25 68 28 67 2e 7a 52 65 70 Name = %h(g.zRep
9580: 6f 73 69 74 6f 72 79 4e 61 6d 65 29 3c 62 72 20 ositoryName)<br
9590: 2f 3e 0a 20 20 20 20 40 20 6c 6f 61 64 5f 61 76 />. @ load_av
95a0: 65 72 61 67 65 28 29 20 3d 20 25 66 28 6c 6f 61 erage() = %f(loa
95b0: 64 5f 61 76 65 72 61 67 65 28 29 29 3c 62 72 20 d_average())<br
95c0: 2f 3e 0a 20 20 20 20 40 20 63 67 69 5f 63 73 72 />. @ cgi_csr
95d0: 66 5f 73 61 66 65 28 30 29 20 3d 20 25 64 28 63 f_safe(0) = %d(c
95e0: 67 69 5f 63 73 72 66 5f 73 61 66 65 28 30 29 29 gi_csrf_safe(0))
95f0: 3c 62 72 20 2f 3e 0a 20 20 20 20 40 20 66 6f 73 <br />. @ fos
9600: 73 69 6c 5f 65 78 65 5f 69 64 28 29 20 3d 20 25 sil_exe_id() = %
9610: 68 28 66 6f 73 73 69 6c 5f 65 78 65 5f 69 64 28 h(fossil_exe_id(
9620: 29 29 3c 62 72 20 2f 3e 0a 20 20 20 20 40 20 3c ))<br />. @ <
9630: 68 72 20 2f 3e 0a 20 20 20 20 50 28 22 48 54 54 hr />. P("HTT
9640: 50 5f 55 53 45 52 5f 41 47 45 4e 54 22 29 3b 0a P_USER_AGENT");.
9650: 20 20 20 20 63 67 69 5f 70 72 69 6e 74 5f 61 6c cgi_print_al
9660: 6c 28 73 68 6f 77 41 6c 6c 2c 20 30 29 3b 0a 20 l(showAll, 0);.
9670: 20 20 20 69 66 28 20 73 68 6f 77 41 6c 6c 20 26 if( showAll &
9680: 26 20 62 6c 6f 62 5f 73 69 7a 65 28 26 67 2e 68 & blob_size(&g.h
9690: 74 74 70 48 65 61 64 65 72 29 3e 30 20 29 7b 0a ttpHeader)>0 ){.
96a0: 20 20 20 20 20 20 40 20 3c 68 72 20 2f 3e 0a 20 @ <hr />.
96b0: 20 20 20 20 20 40 20 3c 70 72 65 3e 0a 20 20 20 @ <pre>.
96c0: 20 20 20 40 20 25 68 28 62 6c 6f 62 5f 73 74 72 @ %h(blob_str
96d0: 28 26 67 2e 68 74 74 70 48 65 61 64 65 72 29 29 (&g.httpHeader))
96e0: 0a 20 20 20 20 20 20 40 20 3c 2f 70 72 65 3e 0a . @ </pre>.
96f0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 74 79 6c }. }. styl
9700: 65 5f 66 6f 6f 74 65 72 28 29 3b 0a 20 20 69 66 e_footer();. if
9710: 28 20 7a 45 72 72 20 29 7b 0a 20 20 20 20 63 67 ( zErr ){. cg
9720: 69 5f 72 65 70 6c 79 28 29 3b 0a 20 20 20 20 66 i_reply();. f
9730: 6f 73 73 69 6c 5f 65 78 69 74 28 31 29 3b 0a 20 ossil_exit(1);.
9740: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 }.}../*.** Gene
9750: 72 61 74 65 20 61 20 4e 6f 74 20 59 65 74 20 49 rate a Not Yet I
9760: 6d 70 6c 65 6d 65 6e 74 65 64 20 65 72 72 6f 72 mplemented error
9770: 20 70 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20 77 page..*/.void w
9780: 65 62 70 61 67 65 5f 6e 6f 74 5f 79 65 74 5f 69 ebpage_not_yet_i
9790: 6d 70 6c 65 6d 65 6e 74 65 64 28 76 6f 69 64 29 mplemented(void)
97a0: 7b 0a 20 20 77 65 62 70 61 67 65 5f 65 72 72 6f {. webpage_erro
97b0: 72 28 22 4e 6f 74 20 79 65 74 20 69 6d 70 6c 65 r("Not yet imple
97c0: 6d 65 6e 74 65 64 22 29 3b 0a 7d 0a 0a 2f 2a 0a mented");.}../*.
97d0: 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20 77 65 ** Generate a we
97e0: 62 70 61 67 65 20 66 6f 72 20 61 20 77 65 62 70 bpage for a webp
97f0: 61 67 65 5f 61 73 73 65 72 74 28 29 2e 0a 2a 2f age_assert()..*/
9800: 0a 76 6f 69 64 20 77 65 62 70 61 67 65 5f 61 73 .void webpage_as
9810: 73 65 72 74 5f 70 61 67 65 28 63 6f 6e 73 74 20 sert_page(const
9820: 63 68 61 72 20 2a 7a 46 69 6c 65 2c 20 69 6e 74 char *zFile, int
9830: 20 69 4c 69 6e 65 2c 20 63 6f 6e 73 74 20 63 68 iLine, const ch
9840: 61 72 20 2a 7a 45 78 70 72 29 7b 0a 20 20 66 6f ar *zExpr){. fo
9850: 73 73 69 6c 5f 77 61 72 6e 69 6e 67 28 22 61 73 ssil_warning("as
9860: 73 65 72 74 69 6f 6e 20 66 61 75 6c 74 20 61 74 sertion fault at
9870: 20 25 73 3a 25 64 20 2d 20 25 73 22 2c 20 7a 46 %s:%d - %s", zF
9880: 69 6c 65 2c 20 69 4c 69 6e 65 2c 20 7a 45 78 70 ile, iLine, zExp
9890: 72 29 3b 0a 20 20 63 67 69 5f 72 65 73 65 74 5f r);. cgi_reset_
98a0: 63 6f 6e 74 65 6e 74 28 29 3b 0a 20 20 77 65 62 content();. web
98b0: 70 61 67 65 5f 65 72 72 6f 72 28 22 61 73 73 65 page_error("asse
98c0: 72 74 69 6f 6e 20 66 61 75 6c 74 20 61 74 20 25 rtion fault at %
98d0: 73 3a 25 64 20 2d 20 25 73 22 2c 20 7a 46 69 6c s:%d - %s", zFil
98e0: 65 2c 20 69 4c 69 6e 65 2c 20 7a 45 78 70 72 29 e, iLine, zExpr)
98f0: 3b 0a 7d 0a 0a 23 69 66 20 49 4e 54 45 52 46 41 ;.}..#if INTERFA
9900: 43 45 0a 23 20 64 65 66 69 6e 65 20 77 65 62 70 CE.# define webp
9910: 61 67 65 5f 61 73 73 65 72 74 28 54 29 20 69 66 age_assert(T) if
9920: 28 21 28 54 29 29 7b 77 65 62 70 61 67 65 5f 61 (!(T)){webpage_a
9930: 73 73 65 72 74 5f 70 61 67 65 28 5f 5f 46 49 4c ssert_page(__FIL
9940: 45 5f 5f 2c 5f 5f 4c 49 4e 45 5f 5f 2c 23 54 29 E__,__LINE__,#T)
9950: 3b 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a ;}.#endif../*.**
9960: 20 52 65 74 75 72 6e 73 20 61 20 70 73 65 75 64 Returns a pseud
9970: 6f 2d 72 61 6e 64 6f 6d 20 69 6e 70 75 74 20 66 o-random input f
9980: 69 65 6c 64 20 49 44 2c 20 66 6f 72 20 75 73 65 ield ID, for use
9990: 20 69 6e 20 61 73 73 6f 63 69 61 74 69 6e 67 20 in associating
99a0: 61 6e 0a 2a 2a 20 49 44 2d 6c 65 73 73 20 69 6e an.** ID-less in
99b0: 70 75 74 20 66 69 65 6c 64 20 77 69 74 68 20 61 put field with a
99c0: 20 6c 61 62 65 6c 2e 20 54 68 65 20 6d 65 6d 6f label. The memo
99d0: 72 79 20 69 73 20 6f 77 6e 65 64 20 62 79 20 74 ry is owned by t
99e0: 68 65 0a 2a 2a 20 63 61 6c 6c 65 72 2e 0a 2a 2f he.** caller..*/
99f0: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 20 73 .static char * s
9a00: 74 79 6c 65 5f 6e 65 78 74 5f 69 6e 70 75 74 5f tyle_next_input_
9a10: 69 64 28 29 7b 0a 20 20 73 74 61 74 69 63 20 69 id(){. static i
9a20: 6e 74 20 69 6e 70 75 74 49 44 20 3d 20 30 3b 0a nt inputID = 0;.
9a30: 20 20 2b 2b 69 6e 70 75 74 49 44 3b 0a 20 20 72 ++inputID;. r
9a40: 65 74 75 72 6e 20 6d 70 72 69 6e 74 66 28 22 69 eturn mprintf("i
9a50: 6e 70 75 74 2d 69 64 2d 25 64 22 2c 20 69 6e 70 nput-id-%d", inp
9a60: 75 74 49 44 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 utID);.}../*.**
9a70: 4f 75 74 70 75 74 73 20 61 20 6c 61 62 65 6c 65 Outputs a labele
9a80: 64 20 63 68 65 63 6b 62 6f 78 20 65 6c 65 6d 65 d checkbox eleme
9a90: 6e 74 2e 20 7a 57 72 61 70 70 65 72 49 64 20 69 nt. zWrapperId i
9aa0: 73 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 20 49 44 s an optional ID
9ab0: 0a 2a 2a 20 76 61 6c 75 65 20 66 6f 72 20 74 68 .** value for th
9ac0: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 65 6c 65 e containing ele
9ad0: 6d 65 6e 74 20 28 73 65 65 20 62 65 6c 6f 77 29 ment (see below)
9ae0: 2e 20 7a 46 69 65 6c 64 4e 61 6d 65 20 69 73 20 . zFieldName is
9af0: 74 68 65 0a 2a 2a 20 66 6f 72 6d 20 65 6c 65 6d the.** form elem
9b00: 65 6e 74 20 6e 61 6d 65 2e 20 7a 4c 61 62 65 6c ent name. zLabel
9b10: 20 69 73 20 74 68 65 20 6c 61 62 65 6c 20 66 6f is the label fo
9b20: 72 20 74 68 65 20 63 68 65 63 6b 62 6f 78 2e 20 r the checkbox.
9b30: 7a 56 61 6c 75 65 20 69 73 0a 2a 2a 20 74 68 65 zValue is.** the
9b40: 20 6f 70 74 69 6f 6e 61 6c 20 76 61 6c 75 65 20 optional value
9b50: 66 6f 72 20 74 68 65 20 63 68 65 63 6b 62 6f 78 for the checkbox
9b60: 2e 20 7a 54 69 70 20 69 73 20 61 6e 20 6f 70 74 . zTip is an opt
9b70: 69 6f 6e 61 6c 20 74 6f 6f 6c 74 69 70 2c 0a 2a ional tooltip,.*
9b80: 2a 20 77 68 69 63 68 20 67 65 74 73 20 73 65 74 * which gets set
9b90: 20 61 73 20 74 68 65 20 22 74 69 74 6c 65 22 20 as the "title"
9ba0: 61 74 74 72 69 62 75 74 65 20 6f 66 20 74 68 65 attribute of the
9bb0: 20 6f 75 74 65 72 6d 6f 73 74 0a 2a 2a 20 65 6c outermost.** el
9bc0: 65 6d 65 6e 74 2e 20 49 66 20 69 73 43 68 65 63 ement. If isChec
9bd0: 6b 65 64 20 69 73 20 74 72 75 65 2c 20 74 68 65 ked is true, the
9be0: 20 63 68 65 63 6b 62 6f 78 20 67 65 74 73 20 74 checkbox gets t
9bf0: 68 65 20 22 63 68 65 63 6b 65 64 22 0a 2a 2a 20 he "checked".**
9c00: 61 74 74 72 69 62 75 74 65 20 73 65 74 2c 20 65 attribute set, e
9c10: 6c 73 65 20 69 74 20 69 73 20 6e 6f 74 2e 0a 2a lse it is not..*
9c20: 2a 0a 2a 2a 20 52 65 73 75 6c 74 69 6e 67 20 73 *.** Resulting s
9c30: 74 72 75 63 74 75 72 65 3a 0a 2a 2a 0a 2a 2a 20 tructure:.**.**
9c40: 3c 73 70 61 6e 20 63 6c 61 73 73 3d 27 69 6e 70 <span class='inp
9c50: 75 74 2d 77 69 74 68 2d 6c 61 62 65 6c 27 20 74 ut-with-label' t
9c60: 69 74 6c 65 3d 7b 7b 7a 54 69 70 7d 7d 20 69 64 itle={{zTip}} id
9c70: 3d 7b 7b 7a 57 72 61 70 70 65 72 49 64 7d 7d 3e ={{zWrapperId}}>
9c80: 0a 2a 2a 20 20 20 3c 69 6e 70 75 74 20 74 79 70 .** <input typ
9c90: 65 3d 27 63 68 65 63 6b 62 6f 78 27 20 6e 61 6d e='checkbox' nam
9ca0: 65 3d 7b 7b 7a 46 69 65 6c 64 4e 61 6d 65 7d 7d e={{zFieldName}}
9cb0: 20 76 61 6c 75 65 3d 7b 7b 7a 56 61 6c 75 65 7d value={{zValue}
9cc0: 7d 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69 64 }.** id
9cd0: 3d 27 41 20 52 41 4e 44 4f 4d 20 56 41 4c 55 45 ='A RANDOM VALUE
9ce0: 27 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 7b 7b '.** {{
9cf0: 69 73 43 68 65 63 6b 65 64 20 3f 20 22 20 63 68 isChecked ? " ch
9d00: 65 63 6b 65 64 20 3a 20 22 22 7d 7d 2f 3e 0a 2a ecked : ""}}/>.*
9d10: 2a 20 20 20 3c 6c 61 62 65 6c 20 66 6f 72 3d 27 * <label for='
9d20: 49 44 20 4f 46 20 54 48 45 20 49 4e 50 55 54 20 ID OF THE INPUT
9d30: 46 49 45 4c 44 27 3e 7b 7b 7a 4c 61 62 65 6c 7d FIELD'>{{zLabel}
9d40: 7d 3c 2f 6c 61 62 65 6c 3e 0a 2a 2a 20 3c 2f 73 }</label>.** </s
9d50: 70 61 6e 3e 0a 2a 2a 0a 2a 2a 20 7a 4c 61 62 65 pan>.**.** zLabe
9d60: 6c 2c 20 61 6e 64 20 7a 56 61 6c 75 65 20 61 72 l, and zValue ar
9d70: 65 20 72 65 71 75 69 72 65 64 2e 20 7a 46 69 65 e required. zFie
9d80: 6c 64 4e 61 6d 65 2c 20 7a 57 72 61 70 70 65 72 ldName, zWrapper
9d90: 49 64 2c 20 61 6e 64 20 7a 54 69 70 0a 2a 2a 20 Id, and zTip.**
9da0: 61 72 65 20 6d 61 79 20 62 65 20 4e 55 4c 4c 20 are may be NULL
9db0: 6f 72 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 or empty..**.**
9dc0: 42 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65 Be sure that the
9dd0: 20 69 6e 70 75 74 2d 77 69 74 68 2d 6c 61 62 65 input-with-labe
9de0: 6c 20 43 53 53 20 63 6c 61 73 73 20 69 73 20 64 l CSS class is d
9df0: 65 66 69 6e 65 64 20 73 65 6e 73 69 62 6c 79 2c efined sensibly,
9e00: 20 69 6e 0a 2a 2a 20 70 61 72 74 69 63 75 6c 61 in.** particula
9e10: 72 2c 20 68 61 76 69 6e 67 20 69 74 73 20 64 69 r, having its di
9e20: 73 70 6c 61 79 3a 69 6e 6c 69 6e 65 2d 62 6c 6f splay:inline-blo
9e30: 63 6b 20 69 73 20 75 73 65 66 75 6c 20 66 6f 72 ck is useful for
9e40: 20 61 6c 69 67 6e 6d 65 6e 74 0a 2a 2a 20 70 75 alignment.** pu
9e50: 72 70 6f 73 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 rposes..*/.void
9e60: 73 74 79 6c 65 5f 6c 61 62 65 6c 65 64 5f 63 68 style_labeled_ch
9e70: 65 63 6b 62 6f 78 28 63 6f 6e 73 74 20 63 68 61 eckbox(const cha
9e80: 72 20 2a 20 7a 57 72 61 70 70 65 72 49 64 2c 0a r * zWrapperId,.
9e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
9ea0: 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 cons
9eb0: 74 20 63 68 61 72 20 2a 7a 46 69 65 6c 64 4e 61 t char *zFieldNa
9ec0: 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a me, const char *
9ed0: 20 7a 4c 61 62 65 6c 2c 0a 20 20 20 20 20 20 20 zLabel,.
9ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
9ef0: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 const char
9f00: 2a 20 7a 56 61 6c 75 65 2c 20 69 6e 74 20 69 73 * zValue, int is
9f10: 43 68 65 63 6b 65 64 2c 0a 20 20 20 20 20 20 20 Checked,.
9f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
9f30: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 const char
9f40: 2a 20 7a 54 69 70 29 7b 0a 20 20 63 68 61 72 20 * zTip){. char
9f50: 2a 20 7a 4c 61 62 65 6c 49 44 20 3d 20 73 74 79 * zLabelID = sty
9f60: 6c 65 5f 6e 65 78 74 5f 69 6e 70 75 74 5f 69 64 le_next_input_id
9f70: 28 29 3b 0a 20 20 43 58 28 22 3c 73 70 61 6e 20 ();. CX("<span
9f80: 63 6c 61 73 73 3d 27 69 6e 70 75 74 2d 77 69 74 class='input-wit
9f90: 68 2d 6c 61 62 65 6c 27 22 29 3b 0a 20 20 69 66 h-label'");. if
9fa0: 28 7a 54 69 70 20 26 26 20 2a 7a 54 69 70 29 7b (zTip && *zTip){
9fb0: 0a 20 20 20 20 43 58 28 22 20 74 69 74 6c 65 3d . CX(" title=
9fc0: 27 25 68 27 22 2c 20 7a 54 69 70 29 3b 0a 20 20 '%h'", zTip);.
9fd0: 7d 0a 20 20 69 66 28 7a 57 72 61 70 70 65 72 49 }. if(zWrapperI
9fe0: 64 20 26 26 20 2a 7a 57 72 61 70 70 65 72 49 64 d && *zWrapperId
9ff0: 29 7b 0a 20 20 20 20 43 58 28 22 20 69 64 3d 27 ){. CX(" id='
a000: 25 73 27 22 2c 7a 57 72 61 70 70 65 72 49 64 29 %s'",zWrapperId)
a010: 3b 0a 20 20 7d 0a 20 20 43 58 28 22 3e 3c 69 6e ;. }. CX("><in
a020: 70 75 74 20 74 79 70 65 3d 27 63 68 65 63 6b 62 put type='checkb
a030: 6f 78 27 20 69 64 3d 27 25 73 27 20 22 2c 20 7a ox' id='%s' ", z
a040: 4c 61 62 65 6c 49 44 29 3b 0a 20 20 69 66 28 7a LabelID);. if(z
a050: 46 69 65 6c 64 4e 61 6d 65 20 26 26 20 2a 7a 46 FieldName && *zF
a060: 69 65 6c 64 4e 61 6d 65 29 7b 0a 20 20 20 20 43 ieldName){. C
a070: 58 28 22 6e 61 6d 65 3d 27 25 73 27 20 22 2c 7a X("name='%s' ",z
a080: 46 69 65 6c 64 4e 61 6d 65 29 3b 0a 20 20 7d 0a FieldName);. }.
a090: 20 20 43 58 28 22 76 61 6c 75 65 3d 27 25 54 27 CX("value='%T'
a0a0: 25 73 2f 3e 22 2c 0a 20 20 20 20 20 7a 56 61 6c %s/>",. zVal
a0b0: 75 65 20 3f 20 7a 56 61 6c 75 65 20 3a 20 22 22 ue ? zValue : ""
a0c0: 2c 20 69 73 43 68 65 63 6b 65 64 20 3f 20 22 20 , isChecked ? "
a0d0: 63 68 65 63 6b 65 64 22 20 3a 20 22 22 29 3b 0a checked" : "");.
a0e0: 20 20 43 58 28 22 3c 6c 61 62 65 6c 20 66 6f 72 CX("<label for
a0f0: 3d 27 25 73 27 3e 25 68 3c 2f 6c 61 62 65 6c 3e ='%s'>%h</label>
a100: 3c 2f 73 70 61 6e 3e 22 2c 20 7a 4c 61 62 65 6c </span>", zLabel
a110: 49 44 2c 20 7a 4c 61 62 65 6c 29 3b 0a 20 20 66 ID, zLabel);. f
a120: 6f 73 73 69 6c 5f 66 72 65 65 28 7a 4c 61 62 65 ossil_free(zLabe
a130: 6c 49 44 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f lID);.}../*.** O
a140: 75 74 70 75 74 73 20 61 20 53 45 4c 45 43 54 20 utputs a SELECT
a150: 6c 69 73 74 20 66 72 6f 6d 20 61 20 63 6f 6d 70 list from a comp
a160: 69 6c 65 2d 74 69 6d 65 20 6c 69 73 74 20 6f 66 ile-time list of
a170: 20 69 6e 74 65 67 65 72 73 2e 0a 2a 2a 20 54 68 integers..** Th
a180: 65 20 76 61 72 67 73 20 6d 75 73 74 20 62 65 20 e vargs must be
a190: 61 20 6c 69 73 74 20 6f 66 20 28 63 6f 6e 73 74 a list of (const
a1a0: 20 63 68 61 72 20 2a 2c 20 69 6e 74 29 20 70 61 char *, int) pa
a1b0: 69 72 73 2c 20 74 65 72 6d 69 6e 61 74 65 64 0a irs, terminated.
a1c0: 2a 2a 20 77 69 74 68 20 61 20 73 69 6e 67 6c 65 ** with a single
a1d0: 20 4e 55 4c 4c 2e 20 45 61 63 68 20 70 61 69 72 NULL. Each pair
a1e0: 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 is interpreted
a1f0: 61 73 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 as....**.** If t
a200: 68 65 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a he (const char *
a210: 29 20 69 73 20 4e 55 4c 4c 2c 20 69 74 20 69 73 ) is NULL, it is
a220: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 the end of the
a230: 6c 69 73 74 2c 20 65 6c 73 65 0a 2a 2a 20 61 20 list, else.** a
a240: 6e 65 77 20 4f 50 54 49 4f 4e 20 65 6e 74 72 79 new OPTION entry
a250: 20 69 73 20 63 72 65 61 74 65 64 2e 20 49 66 20 is created. If
a260: 74 68 65 20 73 74 72 69 6e 67 20 69 73 20 65 6d the string is em
a270: 70 74 79 2c 20 74 68 65 0a 2a 2a 20 6c 61 62 65 pty, the.** labe
a280: 6c 20 61 6e 64 20 76 61 6c 75 65 20 6f 66 20 74 l and value of t
a290: 68 65 20 4f 50 54 49 4f 4e 20 69 73 20 74 68 65 he OPTION is the
a2a0: 20 69 6e 74 65 67 65 72 20 70 61 72 74 20 6f 66 integer part of
a2b0: 20 74 68 65 20 70 61 69 72 2e 0a 2a 2a 20 49 66 the pair..** If
a2c0: 20 74 68 65 20 73 74 72 69 6e 67 20 69 73 20 6e the string is n
a2d0: 6f 74 20 65 6d 70 74 79 2c 20 69 74 20 62 65 63 ot empty, it bec
a2e0: 6f 6d 65 73 20 74 68 65 20 6c 61 62 65 6c 20 61 omes the label a
a2f0: 6e 64 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a nd the integer.*
a300: 2a 20 74 68 65 20 76 61 6c 75 65 2e 20 49 66 20 * the value. If
a310: 74 68 61 74 20 76 61 6c 75 65 20 3d 3d 20 73 65 that value == se
a320: 6c 65 63 74 65 64 56 61 6c 75 65 20 74 68 65 6e lectedValue then
a330: 20 74 68 61 74 20 4f 50 54 49 4f 4e 0a 2a 2a 20 that OPTION.**
a340: 65 6c 65 6d 65 6e 74 20 67 65 74 73 20 74 68 65 element gets the
a350: 20 27 73 65 6c 65 63 74 65 64 27 20 61 74 74 72 'selected' attr
a360: 69 62 75 74 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 ibute..**.** Not
a370: 65 20 74 68 61 74 20 74 68 65 20 70 61 69 72 73 e that the pairs
a380: 20 61 72 65 20 6e 6f 74 20 69 6e 20 28 69 6e 74 are not in (int
a390: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 , const char *)
a3a0: 6f 72 64 65 72 20 62 65 63 61 75 73 65 0a 2a 2a order because.**
a3b0: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77 65 6c there is no wel
a3c0: 6c 2d 6b 6e 6f 77 6e 20 69 6e 74 65 67 65 72 20 l-known integer
a3d0: 76 61 6c 75 65 20 77 68 69 63 68 20 77 65 20 63 value which we c
a3e0: 61 6e 20 64 65 66 69 6e 69 74 69 76 65 6c 79 20 an definitively
a3f0: 75 73 65 0a 2a 2a 20 61 73 20 61 20 6c 69 73 74 use.** as a list
a400: 20 74 65 72 6d 69 6e 61 74 6f 72 2e 0a 2a 2a 0a terminator..**.
a410: 2a 2a 20 7a 57 72 61 70 70 65 72 49 64 20 69 73 ** zWrapperId is
a420: 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 20 49 44 20 an optional ID
a430: 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 63 6f value for the co
a440: 6e 74 61 69 6e 69 6e 67 20 65 6c 65 6d 65 6e 74 ntaining element
a450: 20 28 73 65 65 0a 2a 2a 20 62 65 6c 6f 77 29 2e (see.** below).
a460: 0a 2a 2a 0a 2a 2a 20 7a 46 69 65 6c 64 4e 61 6d .**.** zFieldNam
a470: 65 20 69 73 20 74 68 65 20 76 61 6c 75 65 20 6f e is the value o
a480: 66 20 74 68 65 20 66 6f 72 6d 20 65 6c 65 6d 65 f the form eleme
a490: 6e 74 27 73 20 6e 61 6d 65 20 61 74 74 72 69 62 nt's name attrib
a4a0: 75 74 65 2e 20 4e 6f 74 65 0a 2a 2a 20 74 68 61 ute. Note.** tha
a4b0: 74 20 66 6f 73 73 69 6c 20 70 72 65 66 65 72 73 t fossil prefers
a4c0: 20 75 6e 64 65 72 73 63 6f 72 65 73 20 6f 76 65 underscores ove
a4d0: 72 20 27 2d 27 20 66 6f 72 20 73 65 70 61 72 61 r '-' for separa
a4e0: 74 6f 72 73 20 69 6e 20 66 6f 72 6d 0a 2a 2a 20 tors in form.**
a4f0: 65 6c 65 6d 65 6e 74 20 6e 61 6d 65 73 2e 0a 2a element names..*
a500: 2a 0a 2a 2a 20 7a 4c 61 62 65 6c 20 69 73 20 61 *.** zLabel is a
a510: 6e 20 6f 70 74 69 6f 6e 61 6c 20 73 74 72 69 6e n optional strin
a520: 67 20 74 6f 20 75 73 65 20 61 73 20 61 20 22 6c g to use as a "l
a530: 61 62 65 6c 22 20 66 6f 72 20 74 68 65 20 65 6c abel" for the el
a540: 65 6d 65 6e 74 0a 2a 2a 20 28 73 65 65 20 62 65 ement.** (see be
a550: 6c 6f 77 29 2e 0a 2a 2a 0a 2a 2a 20 7a 54 6f 6f low)..**.** zToo
a560: 6c 74 69 70 20 69 73 20 61 6e 20 6f 70 74 69 6f ltip is an optio
a570: 6e 61 6c 20 76 61 6c 75 65 20 66 6f 72 20 74 68 nal value for th
a580: 65 20 53 45 4c 45 43 54 27 73 20 74 69 74 6c 65 e SELECT's title
a590: 20 61 74 74 72 69 62 75 74 65 2e 0a 2a 2a 0a 2a attribute..**.*
a5a0: 2a 20 54 68 65 20 73 74 72 75 63 74 75 72 65 20 * The structure
a5b0: 6f 66 20 74 68 65 20 65 6d 69 74 74 65 64 20 48 of the emitted H
a5c0: 54 4d 4c 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 3c 73 TML is:.**.** <s
a5d0: 70 61 6e 20 63 6c 61 73 73 3d 27 69 6e 70 75 74 pan class='input
a5e0: 2d 77 69 74 68 2d 6c 61 62 65 6c 27 20 74 69 74 -with-label' tit
a5f0: 6c 65 3d 7b 7b 7a 54 6f 6f 6c 54 69 70 7d 7d 20 le={{zToolTip}}
a600: 69 64 3d 7b 7b 7a 57 72 61 70 70 65 72 49 64 7d id={{zWrapperId}
a610: 7d 3e 0a 2a 2a 20 20 20 3c 6c 61 62 65 6c 20 66 }>.** <label f
a620: 6f 72 3d 27 53 45 4c 45 43 54 20 45 4c 45 4d 45 or='SELECT ELEME
a630: 4e 54 20 49 44 27 3e 7b 7b 7a 4c 61 62 65 6c 7d NT ID'>{{zLabel}
a640: 7d 3c 2f 6c 61 62 65 6c 3e 0a 2a 2a 20 20 20 3c }</label>.** <
a650: 73 65 6c 65 63 74 20 69 64 3d 27 52 41 4e 44 4f select id='RANDO
a660: 4d 20 49 44 27 20 6e 61 6d 65 3d 7b 7b 7a 46 69 M ID' name={{zFi
a670: 65 6c 64 4e 61 6d 65 7d 7d 3e 2e 2e 2e 3c 2f 73 eldName}}>...</s
a680: 65 6c 65 63 74 3e 0a 2a 2a 20 3c 2f 73 70 61 6e elect>.** </span
a690: 3e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 3a >.**.** Example:
a6a0: 0a 2a 2a 0a 2a 2a 20 73 74 79 6c 65 5f 73 65 6c .**.** style_sel
a6b0: 65 63 74 5f 6c 69 73 74 5f 69 6e 74 28 22 6d 79 ect_list_int("my
a6c0: 2d 67 72 61 70 65 73 22 2c 20 22 6d 79 5f 67 72 -grapes", "my_gr
a6d0: 61 70 65 73 22 2c 20 22 47 72 61 70 65 73 22 2c apes", "Grapes",
a6e0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 .**
a6f0: 20 20 20 20 20 20 20 20 20 22 53 65 6c 65 63 74 "Select
a700: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 67 the number of g
a710: 72 61 70 65 73 22 2c 0a 2a 2a 20 20 20 20 20 20 rapes",.**
a720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
a730: 20 61 74 6f 69 28 50 44 28 22 6d 79 5f 66 69 65 atoi(PD("my_fie
a740: 6c 64 22 2c 22 30 22 29 29 2c 0a 2a 2a 20 20 20 ld","0")),.**
a750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
a760: 20 20 20 20 22 22 2c 20 31 2c 20 22 32 22 2c 20 "", 1, "2",
a770: 32 2c 20 22 54 68 72 65 65 22 2c 20 33 2c 0a 2a 2, "Three", 3,.*
a780: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 *
a790: 20 20 20 20 20 20 20 20 4e 55 4c 4c 29 3b 0a 2a NULL);.*
a7a0: 2a 20 0a 2a 2f 0a 76 6f 69 64 20 73 74 79 6c 65 * .*/.void style
a7b0: 5f 73 65 6c 65 63 74 5f 6c 69 73 74 5f 69 6e 74 _select_list_int
a7c0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 20 7a 57 (const char * zW
a7d0: 72 61 70 70 65 72 49 64 2c 0a 20 20 20 20 20 20 rapperId,.
a7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
a7f0: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 const char
a800: 2a 7a 46 69 65 6c 64 4e 61 6d 65 2c 20 63 6f 6e *zFieldName, con
a810: 73 74 20 63 68 61 72 20 2a 20 7a 4c 61 62 65 6c st char * zLabel
a820: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,.
a830: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e con
a840: 73 74 20 63 68 61 72 20 2a 20 7a 54 6f 6f 6c 54 st char * zToolT
a850: 69 70 2c 20 69 6e 74 20 73 65 6c 65 63 74 65 64 ip, int selected
a860: 56 61 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 Val,.
a870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
a880: 2e 2e 2e 20 29 7b 0a 20 20 63 68 61 72 20 2a 20 ... ){. char *
a890: 7a 4c 61 62 65 6c 49 44 20 3d 20 73 74 79 6c 65 zLabelID = style
a8a0: 5f 6e 65 78 74 5f 69 6e 70 75 74 5f 69 64 28 29 _next_input_id()
a8b0: 3b 0a 20 20 76 61 5f 6c 69 73 74 20 76 61 72 67 ;. va_list varg
a8c0: 73 3b 0a 0a 20 20 76 61 5f 73 74 61 72 74 28 76 s;.. va_start(v
a8d0: 61 72 67 73 2c 73 65 6c 65 63 74 65 64 56 61 6c args,selectedVal
a8e0: 29 3b 0a 20 20 43 58 28 22 3c 73 70 61 6e 20 63 );. CX("<span c
a8f0: 6c 61 73 73 3d 27 69 6e 70 75 74 2d 77 69 74 68 lass='input-with
a900: 2d 6c 61 62 65 6c 27 22 29 3b 0a 20 20 69 66 28 -label'");. if(
a910: 7a 54 6f 6f 6c 54 69 70 20 26 26 20 2a 7a 54 6f zToolTip && *zTo
a920: 6f 6c 54 69 70 29 7b 0a 20 20 20 20 43 58 28 22 olTip){. CX("
a930: 20 74 69 74 6c 65 3d 27 25 68 27 22 2c 7a 54 6f title='%h'",zTo
a940: 6f 6c 54 69 70 29 3b 0a 20 20 7d 0a 20 20 69 66 olTip);. }. if
a950: 28 7a 57 72 61 70 70 65 72 49 64 20 26 26 20 2a (zWrapperId && *
a960: 7a 57 72 61 70 70 65 72 49 64 29 7b 0a 20 20 20 zWrapperId){.
a970: 20 43 58 28 22 20 69 64 3d 27 25 73 27 22 2c 7a CX(" id='%s'",z
a980: 57 72 61 70 70 65 72 49 64 29 3b 0a 20 20 7d 0a WrapperId);. }.
a990: 20 20 43 58 28 22 3e 22 29 3b 0a 20 20 69 66 28 CX(">");. if(
a9a0: 7a 4c 61 62 65 6c 20 26 26 20 2a 7a 4c 61 62 65 zLabel && *zLabe
a9b0: 6c 29 7b 0a 20 20 20 20 43 58 28 22 3c 6c 61 62 l){. CX("<lab
a9c0: 65 6c 20 6c 61 62 65 6c 3d 27 25 73 27 3e 25 68 el label='%s'>%h
a9d0: 3c 2f 6c 61 62 65 6c 3e 22 2c 20 7a 4c 61 62 65 </label>", zLabe
a9e0: 6c 49 44 2c 20 7a 4c 61 62 65 6c 29 3b 0a 20 20 lID, zLabel);.
a9f0: 7d 0a 20 20 43 58 28 22 3c 73 65 6c 65 63 74 20 }. CX("<select
aa00: 6e 61 6d 65 3d 27 25 73 27 20 69 64 3d 27 25 73 name='%s' id='%s
aa10: 27 3e 22 2c 7a 46 69 65 6c 64 4e 61 6d 65 2c 20 '>",zFieldName,
aa20: 7a 4c 61 62 65 6c 49 44 29 3b 0a 20 20 77 68 69 zLabelID);. whi
aa30: 6c 65 28 31 29 7b 0a 20 20 20 20 63 6f 6e 73 74 le(1){. const
aa40: 20 63 68 61 72 20 2a 20 7a 4f 70 74 69 6f 6e 20 char * zOption
aa50: 3d 20 76 61 5f 61 72 67 28 76 61 72 67 73 2c 63 = va_arg(vargs,c
aa60: 68 61 72 20 2a 29 3b 0a 20 20 20 20 69 6e 74 20 har *);. int
aa70: 76 3b 0a 20 20 20 20 69 66 28 4e 55 4c 4c 3d 3d v;. if(NULL==
aa80: 7a 4f 70 74 69 6f 6e 29 7b 0a 20 20 20 20 20 20 zOption){.
aa90: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 break;. }.
aaa0: 20 76 20 3d 20 76 61 5f 61 72 67 28 76 61 72 67 v = va_arg(varg
aab0: 73 2c 69 6e 74 29 3b 0a 20 20 20 20 43 58 28 22 s,int);. CX("
aac0: 3c 6f 70 74 69 6f 6e 20 76 61 6c 75 65 3d 27 25 <option value='%
aad0: 64 27 25 73 3e 22 2c 0a 20 20 20 20 20 20 20 20 d'%s>",.
aae0: 20 76 2c 20 76 3d 3d 73 65 6c 65 63 74 65 64 56 v, v==selectedV
aaf0: 61 6c 20 3f 20 22 20 73 65 6c 65 63 74 65 64 22 al ? " selected"
ab00: 20 3a 20 22 22 29 3b 0a 20 20 20 20 69 66 28 2a : "");. if(*
ab10: 7a 4f 70 74 69 6f 6e 29 7b 0a 20 20 20 20 20 20 zOption){.
ab20: 43 58 28 22 25 73 22 2c 20 7a 4f 70 74 69 6f 6e CX("%s", zOption
ab30: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 );. }else{.
ab40: 20 20 20 20 43 58 28 22 25 64 22 2c 76 29 3b 0a CX("%d",v);.
ab50: 20 20 20 20 7d 0a 20 20 20 20 43 58 28 22 3c 2f }. CX("</
ab60: 6f 70 74 69 6f 6e 3e 5c 6e 22 29 3b 0a 20 20 7d option>\n");. }
ab70: 0a 20 20 43 58 28 22 3c 2f 73 65 6c 65 63 74 3e . CX("</select>
ab80: 5c 6e 22 29 3b 0a 20 20 43 58 28 22 3c 2f 73 70 \n");. CX("</sp
ab90: 61 6e 3e 5c 6e 22 29 3b 0a 20 20 76 61 5f 65 6e an>\n");. va_en
aba0: 64 28 76 61 72 67 73 29 3b 0a 20 20 66 6f 73 73 d(vargs);. foss
abb0: 69 6c 5f 66 72 65 65 28 7a 4c 61 62 65 6c 49 44 il_free(zLabelID
abc0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 );.}../*.** The
abd0: 43 2d 73 74 72 69 6e 67 20 63 6f 75 6e 74 65 72 C-string counter
abe0: 70 61 72 74 20 6f 66 20 73 74 79 6c 65 5f 73 65 part of style_se
abf0: 6c 65 63 74 5f 6c 69 73 74 5f 69 6e 74 28 29 2c lect_list_int(),
ac00: 20 74 68 69 73 20 76 61 72 69 61 6e 74 0a 2a 2a this variant.**
ac10: 20 64 69 66 66 65 72 73 20 6f 6e 6c 79 20 69 6e differs only in
ac20: 20 74 68 61 74 20 69 74 73 20 76 61 72 69 61 64 that its variad
ac30: 69 63 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65 ic arguments are
ac40: 20 43 2d 73 74 72 69 6e 67 73 20 69 6e 20 70 61 C-strings in pa
ac50: 69 72 73 0a 2a 2a 20 6f 66 20 28 6f 70 74 69 6f irs.** of (optio
ac60: 6e 4c 61 62 65 6c 2c 20 6f 70 74 69 6f 6e 56 61 nLabel, optionVa
ac70: 6c 75 65 29 2e 20 49 66 20 61 20 67 69 76 65 6e lue). If a given
ac80: 20 6f 70 74 69 6f 6e 4c 61 62 65 6c 20 69 73 20 optionLabel is
ac90: 61 6e 20 65 6d 70 74 79 0a 2a 2a 20 73 74 72 69 an empty.** stri
aca0: 6e 67 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f ng, the correspo
acb0: 6e 64 69 6e 67 20 6f 70 74 69 6f 6e 56 61 6c 75 nding optionValu
acc0: 65 20 69 73 20 75 73 65 64 20 61 73 20 69 74 73 e is used as its
acd0: 20 6c 61 62 65 6c 2e 20 49 66 20 61 6e 79 0a 2a label. If any.*
ace0: 2a 20 67 69 76 65 6e 20 76 61 6c 75 65 20 6d 61 * given value ma
acf0: 74 63 68 65 73 20 7a 53 65 6c 65 63 74 65 64 56 tches zSelectedV
ad00: 61 6c 2c 20 74 68 61 74 20 6f 70 74 69 6f 6e 20 al, that option
ad10: 67 65 74 73 20 70 72 65 73 65 6c 65 63 74 65 64 gets preselected
ad20: 2e 20 49 66 0a 2a 2a 20 6e 6f 20 6f 70 74 69 6f . If.** no optio
ad30: 6e 73 20 6d 61 74 63 68 20 7a 53 65 6c 65 63 74 ns match zSelect
ad40: 65 64 56 61 6c 20 74 68 65 6e 20 74 68 65 20 66 edVal then the f
ad50: 69 72 73 74 20 65 6e 74 72 79 20 69 73 20 73 65 irst entry is se
ad60: 6c 65 63 74 65 64 20 62 79 0a 2a 2a 20 64 65 66 lected by.** def
ad70: 61 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 ault..**.** Any
ad80: 6f 66 20 28 7a 57 72 61 70 70 65 72 49 64 2c 20 of (zWrapperId,
ad90: 7a 54 6f 6f 6c 74 69 70 2c 20 7a 53 65 6c 65 63 zTooltip, zSelec
ada0: 74 65 64 56 61 6c 29 20 6d 61 79 20 62 65 20 4e tedVal) may be N
adb0: 55 4c 4c 20 6f 72 20 65 6d 70 74 79 2e 0a 2a 2a ULL or empty..**
adc0: 0a 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a 0a .** Example:.**.
add0: 2a 2a 20 73 74 79 6c 65 5f 73 65 6c 65 63 74 5f ** style_select_
ade0: 6c 69 73 74 5f 73 74 72 28 22 6d 79 2d 67 72 61 list_str("my-gra
adf0: 70 65 73 22 2c 20 22 6d 79 5f 67 72 61 70 65 73 pes", "my_grapes
ae00: 22 2c 20 22 47 72 61 70 65 73 22 2c 0a 2a 2a 20 ", "Grapes",.**
ae10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
ae20: 20 20 20 20 20 22 53 65 6c 65 63 74 20 74 68 65 "Select the
ae30: 20 6e 75 6d 62 65 72 20 6f 66 20 67 72 61 70 65 number of grape
ae40: 73 22 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 s",.**
ae50: 20 20 20 20 20 20 20 20 20 20 20 20 20 50 28 22 P("
ae60: 6d 79 5f 66 69 65 6c 64 22 29 2c 0a 2a 2a 20 20 my_field"),.**
ae70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
ae80: 20 20 20 20 20 22 31 22 2c 20 22 4f 6e 65 22 2c "1", "One",
ae90: 20 22 32 22 2c 20 22 54 77 6f 22 2c 20 22 22 2c "2", "Two", "",
aea0: 20 22 33 22 2c 0a 2a 2a 20 20 20 20 20 20 20 20 "3",.**
aeb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4e N
aec0: 55 4c 4c 29 3b 0a 2a 2f 0a 76 6f 69 64 20 73 74 ULL);.*/.void st
aed0: 79 6c 65 5f 73 65 6c 65 63 74 5f 6c 69 73 74 5f yle_select_list_
aee0: 73 74 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a str(const char *
aef0: 20 7a 57 72 61 70 70 65 72 49 64 2c 0a 20 20 20 zWrapperId,.
af00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
af10: 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 const ch
af20: 61 72 20 2a 7a 46 69 65 6c 64 4e 61 6d 65 2c 20 ar *zFieldName,
af30: 63 6f 6e 73 74 20 63 68 61 72 20 2a 20 7a 4c 61 const char * zLa
af40: 62 65 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 bel,.
af50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
af60: 63 6f 6e 73 74 20 63 68 61 72 20 2a 20 7a 54 6f const char * zTo
af70: 6f 6c 54 69 70 2c 20 63 68 61 72 20 63 6f 6e 73 olTip, char cons
af80: 74 20 2a 20 7a 53 65 6c 65 63 74 65 64 56 61 6c t * zSelectedVal
af90: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,.
afa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2e 2e 2e ...
afb0: 20 29 7b 0a 20 20 63 68 61 72 20 2a 20 7a 4c 61 ){. char * zLa
afc0: 62 65 6c 49 44 20 3d 20 73 74 79 6c 65 5f 6e 65 belID = style_ne
afd0: 78 74 5f 69 6e 70 75 74 5f 69 64 28 29 3b 0a 20 xt_input_id();.
afe0: 20 76 61 5f 6c 69 73 74 20 76 61 72 67 73 3b 0a va_list vargs;.
aff0: 0a 20 20 76 61 5f 73 74 61 72 74 28 76 61 72 67 . va_start(varg
b000: 73 2c 7a 53 65 6c 65 63 74 65 64 56 61 6c 29 3b s,zSelectedVal);
b010: 0a 20 20 69 66 28 21 7a 53 65 6c 65 63 74 65 64 . if(!zSelected
b020: 56 61 6c 29 7b 0a 20 20 20 20 7a 53 65 6c 65 63 Val){. zSelec
b030: 74 65 64 56 61 6c 20 3d 20 5f 5f 46 49 4c 45 5f tedVal = __FILE_
b040: 5f 2f 2a 73 6f 6d 65 20 73 74 72 69 6e 67 20 77 _/*some string w
b050: 65 27 6c 6c 20 6e 65 76 65 72 20 6d 61 74 63 68 e'll never match
b060: 2a 2f 3b 0a 20 20 7d 0a 20 20 43 58 28 22 3c 73 */;. }. CX("<s
b070: 70 61 6e 20 63 6c 61 73 73 3d 27 69 6e 70 75 74 pan class='input
b080: 2d 77 69 74 68 2d 6c 61 62 65 6c 27 22 29 3b 0a -with-label'");.
b090: 20 20 69 66 28 7a 54 6f 6f 6c 54 69 70 20 26 26 if(zToolTip &&
b0a0: 20 2a 7a 54 6f 6f 6c 54 69 70 29 7b 0a 20 20 20 *zToolTip){.
b0b0: 20 43 58 28 22 20 74 69 74 6c 65 3d 27 25 68 27 CX(" title='%h'
b0c0: 22 2c 7a 54 6f 6f 6c 54 69 70 29 3b 0a 20 20 7d ",zToolTip);. }
b0d0: 0a 20 20 69 66 28 7a 57 72 61 70 70 65 72 49 64 . if(zWrapperId
b0e0: 20 26 26 20 2a 7a 57 72 61 70 70 65 72 49 64 29 && *zWrapperId)
b0f0: 7b 0a 20 20 20 20 43 58 28 22 20 69 64 3d 27 25 {. CX(" id='%
b100: 73 27 22 2c 7a 57 72 61 70 70 65 72 49 64 29 3b s'",zWrapperId);
b110: 0a 20 20 7d 0a 20 20 43 58 28 22 3e 22 29 3b 0a . }. CX(">");.
b120: 20 20 69 66 28 7a 4c 61 62 65 6c 20 26 26 20 2a if(zLabel && *
b130: 7a 4c 61 62 65 6c 29 7b 0a 20 20 20 20 43 58 28 zLabel){. CX(
b140: 22 3c 6c 61 62 65 6c 20 66 6f 72 3d 27 25 73 27 "<label for='%s'
b150: 3e 25 68 3c 2f 6c 61 62 65 6c 3e 22 2c 20 7a 4c >%h</label>", zL
b160: 61 62 65 6c 49 44 2c 20 7a 4c 61 62 65 6c 29 3b abelID, zLabel);
b170: 0a 20 20 7d 0a 20 20 43 58 28 22 3c 73 65 6c 65 . }. CX("<sele
b180: 63 74 20 6e 61 6d 65 3d 27 25 73 27 20 69 64 3d ct name='%s' id=
b190: 27 25 73 27 3e 22 2c 7a 46 69 65 6c 64 4e 61 6d '%s'>",zFieldNam
b1a0: 65 2c 20 7a 4c 61 62 65 6c 49 44 29 3b 0a 20 20 e, zLabelID);.
b1b0: 77 68 69 6c 65 28 31 29 7b 0a 20 20 20 20 63 6f while(1){. co
b1c0: 6e 73 74 20 63 68 61 72 20 2a 20 7a 4c 61 62 65 nst char * zLabe
b1d0: 6c 20 3d 20 76 61 5f 61 72 67 28 76 61 72 67 73 l = va_arg(vargs
b1e0: 2c 63 68 61 72 20 2a 29 3b 0a 20 20 20 20 63 6f ,char *);. co
b1f0: 6e 73 74 20 63 68 61 72 20 2a 20 7a 56 61 6c 3b nst char * zVal;
b200: 0a 20 20 20 20 69 66 28 4e 55 4c 4c 3d 3d 7a 4c . if(NULL==zL
b210: 61 62 65 6c 29 7b 0a 20 20 20 20 20 20 62 72 65 abel){. bre
b220: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 56 ak;. }. zV
b230: 61 6c 20 3d 20 76 61 5f 61 72 67 28 76 61 72 67 al = va_arg(varg
b240: 73 2c 63 68 61 72 20 2a 29 3b 0a 20 20 20 20 43 s,char *);. C
b250: 58 28 22 3c 6f 70 74 69 6f 6e 20 76 61 6c 75 65 X("<option value
b260: 3d 27 25 54 27 25 73 3e 22 2c 0a 20 20 20 20 20 ='%T'%s>",.
b270: 20 20 7a 56 61 6c 2c 20 30 3d 3d 66 6f 73 73 69 zVal, 0==fossi
b280: 6c 5f 73 74 72 63 6d 70 28 7a 56 61 6c 2c 20 7a l_strcmp(zVal, z
b290: 53 65 6c 65 63 74 65 64 56 61 6c 29 20 3f 20 22 SelectedVal) ? "
b2a0: 20 73 65 6c 65 63 74 65 64 22 20 3a 20 22 22 29 selected" : "")
b2b0: 3b 0a 20 20 20 20 69 66 28 2a 7a 4c 61 62 65 6c ;. if(*zLabel
b2c0: 29 7b 0a 20 20 20 20 20 20 43 58 28 22 25 73 22 ){. CX("%s"
b2d0: 2c 20 7a 4c 61 62 65 6c 29 3b 0a 20 20 20 20 7d , zLabel);. }
b2e0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 43 58 28 22 else{. CX("
b2f0: 25 68 22 2c 7a 56 61 6c 29 3b 0a 20 20 20 20 7d %h",zVal);. }
b300: 0a 20 20 20 20 43 58 28 22 3c 2f 6f 70 74 69 6f . CX("</optio
b310: 6e 3e 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 43 58 n>\n");. }. CX
b320: 28 22 3c 2f 73 65 6c 65 63 74 3e 5c 6e 22 29 3b ("</select>\n");
b330: 0a 20 20 43 58 28 22 3c 2f 73 70 61 6e 3e 5c 6e . CX("</span>\n
b340: 22 29 3b 0a 20 20 76 61 5f 65 6e 64 28 76 61 72 ");. va_end(var
b350: 67 73 29 3b 0a 20 20 66 6f 73 73 69 6c 5f 66 72 gs);. fossil_fr
b360: 65 65 28 7a 4c 61 62 65 6c 49 44 29 3b 0a 7d 0a ee(zLabelID);.}.
b370: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 ../*.** The firs
b380: 74 20 74 69 6d 65 20 74 68 69 73 20 69 73 20 63 t time this is c
b390: 61 6c 6c 65 64 2c 20 69 74 20 65 6d 69 74 73 20 alled, it emits
b3a0: 63 6f 64 65 20 74 6f 20 69 6e 73 74 61 6c 6c 20 code to install
b3b0: 61 6e 64 0a 2a 2a 20 62 6f 6f 74 73 74 72 61 70 and.** bootstrap
b3c0: 20 74 68 65 20 77 69 6e 64 6f 77 2e 66 6f 73 73 the window.foss
b3d0: 69 6c 20 6f 62 6a 65 63 74 2c 20 75 73 69 6e 67 il object, using
b3e0: 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 66 69 the built-in fi
b3f0: 6c 65 0a 2a 2a 20 66 6f 73 73 69 6c 2e 62 6f 6f le.** fossil.boo
b400: 74 73 74 72 61 70 2e 6a 73 20 28 6e 6f 74 20 74 tstrap.js (not t
b410: 6f 20 62 65 20 63 6f 6e 66 75 73 65 64 20 77 69 o be confused wi
b420: 74 68 20 62 6f 6f 74 73 74 72 61 70 2e 6a 73 29 th bootstrap.js)
b430: 2e 0a 2a 2a 0a 2a 2a 20 53 75 62 73 65 71 75 65 ..**.** Subseque
b440: 6e 74 20 63 61 6c 6c 73 20 61 72 65 20 6e 6f 2d nt calls are no-
b450: 6f 70 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 ops..**.** If pa
b460: 73 73 65 64 20 61 20 74 72 75 65 20 76 61 6c 75 ssed a true valu
b470: 65 2c 20 69 74 20 65 6d 69 74 73 20 74 68 65 20 e, it emits the
b480: 63 6f 6e 74 65 6e 74 73 20 64 69 72 65 63 74 6c contents directl
b490: 79 20 74 6f 20 74 68 65 20 70 61 67 65 0a 2a 2a y to the page.**
b4a0: 20 6f 75 74 70 75 74 2c 20 65 6c 73 65 20 69 74 output, else it
b4b0: 20 65 6d 69 74 73 20 61 20 73 63 72 69 70 74 20 emits a script
b4c0: 74 61 67 20 77 69 74 68 20 61 20 73 72 63 3d 62 tag with a src=b
b4d0: 75 69 6c 74 69 6e 2f 2e 2e 2e 20 74 6f 20 6c 6f uiltin/... to lo
b4e0: 61 64 0a 2a 2a 20 74 68 65 20 73 63 72 69 70 74 ad.** the script
b4f0: 2e 20 49 74 20 61 6c 77 61 79 73 20 6f 75 74 70 . It always outp
b500: 75 74 73 20 61 20 73 6d 61 6c 6c 20 70 72 65 2d uts a small pre-
b510: 62 6f 6f 74 73 74 72 61 70 20 65 6c 65 6d 65 6e bootstrap elemen
b520: 74 20 69 6e 20 69 74 73 0a 2a 2a 20 6f 77 6e 20 t in its.** own
b530: 73 63 72 69 70 74 20 74 61 67 20 74 6f 20 69 6e script tag to in
b540: 69 74 69 61 6c 69 7a 65 20 70 61 72 74 73 20 77 itialize parts w
b550: 68 69 63 68 20 6e 65 65 64 20 43 2d 72 75 6e 74 hich need C-runt
b560: 69 6d 65 2d 6c 65 76 65 6c 0a 2a 2a 20 69 6e 66 ime-level.** inf
b570: 6f 72 6d 61 74 69 6f 6e 2c 20 62 65 66 6f 72 65 ormation, before
b580: 20 6c 6f 61 64 69 6e 67 20 74 68 65 20 6d 61 69 loading the mai
b590: 6e 20 66 6f 73 73 69 6c 2e 62 6f 6f 74 73 74 72 n fossil.bootstr
b5a0: 61 70 2e 6a 73 20 65 69 74 68 65 72 0a 2a 2a 20 ap.js either.**
b5b0: 69 6e 6c 69 6e 65 20 6f 72 20 76 69 61 20 61 20 inline or via a
b5c0: 3c 73 63 72 69 70 74 20 73 72 63 3d 2e 2e 2e 3e <script src=...>
b5d0: 2c 20 61 73 20 73 70 65 63 69 66 69 65 64 20 62 , as specified b
b5e0: 79 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 61 y the first.** a
b5f0: 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 rgument..*/.void
b600: 20 73 74 79 6c 65 5f 65 6d 69 74 5f 73 63 72 69 style_emit_scri
b610: 70 74 5f 66 6f 73 73 69 6c 5f 62 6f 6f 74 73 74 pt_fossil_bootst
b620: 72 61 70 28 69 6e 74 20 61 73 49 6e 6c 69 6e 65 rap(int asInline
b630: 29 7b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 ){. static int
b640: 6f 6e 63 65 20 3d 20 30 3b 0a 20 20 69 66 28 30 once = 0;. if(0
b650: 3d 3d 6f 6e 63 65 2b 2b 29 7b 0a 20 20 20 20 2f ==once++){. /
b660: 2a 20 53 65 74 20 75 70 20 74 68 65 20 67 65 6e * Set up the gen
b670: 65 72 69 63 2f 61 70 70 2d 61 67 6e 6f 73 74 69 eric/app-agnosti
b680: 63 20 70 61 72 74 73 20 6f 66 20 77 69 6e 64 6f c parts of windo
b690: 77 2e 66 6f 73 73 69 6c 0a 20 20 20 20 2a 2a 20 w.fossil. **
b6a0: 77 68 69 63 68 20 72 65 71 75 69 72 65 20 43 2d which require C-
b6b0: 6c 65 76 65 6c 20 73 74 61 74 65 2e 2e 2e 20 2a level state... *
b6c0: 2f 0a 20 20 20 20 73 74 79 6c 65 5f 65 6d 69 74 /. style_emit
b6d0: 5f 73 63 72 69 70 74 5f 74 61 67 28 30 2c 30 29 _script_tag(0,0)
b6e0: 3b 0a 20 20 20 20 43 58 28 22 28 66 75 6e 63 74 ;. CX("(funct
b6f0: 69 6f 6e 28 29 7b 5c 6e 22 0a 20 20 20 20 20 20 ion(){\n".
b700: 20 22 69 66 28 21 77 69 6e 64 6f 77 2e 66 6f 73 "if(!window.fos
b710: 73 69 6c 29 20 77 69 6e 64 6f 77 2e 66 6f 73 73 sil) window.foss
b720: 69 6c 3d 7b 7d 3b 5c 6e 22 0a 20 20 20 20 20 20 il={};\n".
b730: 20 22 77 69 6e 64 6f 77 2e 66 6f 73 73 69 6c 2e "window.fossil.
b740: 76 65 72 73 69 6f 6e 20 3d 20 25 21 6a 3b 5c 6e version = %!j;\n
b750: 22 0a 20 20 20 20 2f 2a 20 66 6f 73 73 69 6c 2e ". /* fossil.
b760: 72 6f 6f 74 50 61 74 68 20 69 73 20 74 68 65 20 rootPath is the
b770: 74 6f 70 2d 6d 6f 73 74 20 43 47 49 2f 73 65 72 top-most CGI/ser
b780: 76 65 72 20 70 61 74 68 2c 0a 20 20 20 20 2a 2a ver path,. **
b790: 20 69 6e 63 6c 75 64 69 6e 67 20 61 20 74 72 61 including a tra
b7a0: 69 6c 69 6e 67 20 73 6c 61 73 68 2e 20 2a 2f 0a iling slash. */.
b7b0: 20 20 20 20 20 20 20 22 77 69 6e 64 6f 77 2e 66 "window.f
b7c0: 6f 73 73 69 6c 2e 72 6f 6f 74 50 61 74 68 20 3d ossil.rootPath =
b7d0: 20 25 21 6a 2b 27 2f 27 3b 5c 6e 22 2c 0a 20 20 %!j+'/';\n",.
b7e0: 20 20 20 20 20 67 65 74 5f 76 65 72 73 69 6f 6e get_version
b7f0: 28 29 2c 20 67 2e 7a 54 6f 70 29 3b 0a 20 20 20 (), g.zTop);.
b800: 20 2f 2a 20 66 6f 73 73 69 6c 2e 63 6f 6e 66 69 /* fossil.confi
b810: 67 20 3d 20 7b 2e 2e 2e 76 61 72 69 6f 75 73 20 g = {...various
b820: 63 6f 6e 66 69 67 2d 6c 65 76 65 6c 20 6f 70 74 config-level opt
b830: 69 6f 6e 73 2e 2e 2e 7d 20 2a 2f 0a 20 20 20 20 ions...} */.
b840: 43 58 28 22 77 69 6e 64 6f 77 2e 66 6f 73 73 69 CX("window.fossi
b850: 6c 2e 63 6f 6e 66 69 67 20 3d 20 7b 22 0a 20 20 l.config = {".
b860: 20 20 20 20 20 22 68 61 73 68 44 69 67 69 74 73 "hashDigits
b870: 3a 20 25 64 2c 20 68 61 73 68 44 69 67 69 74 73 : %d, hashDigits
b880: 55 72 6c 3a 20 25 64 22 0a 20 20 20 20 20 20 20 Url: %d".
b890: 22 7d 3b 5c 6e 22 2c 20 68 61 73 68 5f 64 69 67 "};\n", hash_dig
b8a0: 69 74 73 28 30 29 2c 20 68 61 73 68 5f 64 69 67 its(0), hash_dig
b8b0: 69 74 73 28 31 29 29 3b 0a 23 69 66 20 30 0a 20 its(1));.#if 0.
b8c0: 20 20 20 2f 2a 20 49 73 20 69 74 20 73 61 66 65 /* Is it safe
b8d0: 20 74 6f 20 65 6d 69 74 20 74 68 65 20 43 53 52 to emit the CSR
b8e0: 46 20 74 6f 6b 65 6e 20 68 65 72 65 3f 20 53 6f F token here? So
b8f0: 6d 65 20 70 61 67 65 73 20 61 64 64 20 69 74 0a me pages add it.
b900: 20 20 20 20 2a 2a 20 61 73 20 61 20 68 69 64 64 ** as a hidd
b910: 65 6e 20 66 6f 72 6d 20 66 69 65 6c 64 2e 20 2a en form field. *
b920: 2f 0a 20 20 20 20 69 66 28 67 2e 7a 43 73 72 66 /. if(g.zCsrf
b930: 54 6f 6b 65 6e 5b 30 5d 21 3d 30 29 7b 0a 20 20 Token[0]!=0){.
b940: 20 20 20 20 43 58 28 22 77 69 6e 64 6f 77 2e 66 CX("window.f
b950: 6f 73 73 69 6c 2e 63 73 72 66 54 6f 6b 65 6e 20 ossil.csrfToken
b960: 3d 20 25 21 6a 3b 5c 6e 22 2c 0a 20 20 20 20 20 = %!j;\n",.
b970: 20 20 20 20 67 2e 7a 43 73 72 66 54 6f 6b 65 6e g.zCsrfToken
b980: 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a );. }.#endif.
b990: 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 66 6f /*. ** fo
b9a0: 73 73 69 6c 2e 70 61 67 65 20 68 6f 6c 64 73 20 ssil.page holds
b9b0: 69 6e 66 6f 20 61 62 6f 75 74 20 74 68 65 20 63 info about the c
b9c0: 75 72 72 65 6e 74 20 70 61 67 65 2e 20 54 68 69 urrent page. Thi
b9d0: 73 20 69 73 20 61 6c 73 6f 0a 20 20 20 20 2a 2a s is also. **
b9e0: 20 77 68 65 72 65 20 74 68 65 20 63 75 72 72 65 where the curre
b9f0: 6e 74 20 70 61 67 65 20 22 73 68 6f 75 6c 64 22 nt page "should"
ba00: 20 73 74 6f 72 65 20 61 6e 79 20 6f 66 20 69 74 store any of it
ba10: 73 20 6f 77 6e 0a 20 20 20 20 2a 2a 20 70 61 67 s own. ** pag
ba20: 65 2d 73 70 65 63 69 66 69 63 20 73 74 61 74 65 e-specific state
ba30: 2c 20 61 6e 64 20 69 74 20 69 73 20 72 65 73 65 , and it is rese
ba40: 72 76 65 64 20 66 6f 72 20 74 68 61 74 20 70 75 rved for that pu
ba50: 72 70 6f 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 rpose.. */.
ba60: 20 20 43 58 28 22 77 69 6e 64 6f 77 2e 66 6f 73 CX("window.fos
ba70: 73 69 6c 2e 70 61 67 65 20 3d 20 7b 22 0a 20 20 sil.page = {".
ba80: 20 20 20 20 20 22 6e 61 6d 65 3a 5c 22 25 54 5c "name:\"%T\
ba90: 22 22 0a 20 20 20 20 20 20 20 22 7d 3b 5c 6e 22 "". "};\n"
baa0: 2c 20 67 2e 7a 50 61 74 68 29 3b 0a 20 20 20 20 , g.zPath);.
bab0: 43 58 28 22 7d 29 28 29 3b 5c 6e 22 29 3b 0a 20 CX("})();\n");.
bac0: 20 20 20 2f 2a 20 54 68 65 20 72 65 6d 61 69 6e /* The remain
bad0: 69 6e 67 20 66 6f 73 73 69 6c 20 6f 62 6a 65 63 ing fossil objec
bae0: 74 20 62 6f 6f 74 73 74 72 61 70 20 63 6f 64 65 t bootstrap code
baf0: 20 69 73 20 6e 6f 74 20 64 65 70 65 6e 64 65 6e is not dependen
bb00: 74 20 6f 6e 0a 20 20 20 20 2a 2a 20 43 2d 72 75 t on. ** C-ru
bb10: 6e 74 69 6d 65 20 73 74 61 74 65 2e 2e 2e 20 2a ntime state... *
bb20: 2f 0a 20 20 20 20 69 66 28 61 73 49 6e 6c 69 6e /. if(asInlin
bb30: 65 29 7b 0a 20 20 20 20 20 20 43 58 28 22 25 73 e){. CX("%s
bb40: 5c 6e 22 2c 20 62 75 69 6c 74 69 6e 5f 74 65 78 \n", builtin_tex
bb50: 74 28 22 66 6f 73 73 69 6c 2e 62 6f 6f 74 73 74 t("fossil.bootst
bb60: 72 61 70 2e 6a 73 22 29 29 3b 0a 20 20 20 20 7d rap.js"));. }
bb70: 0a 20 20 20 20 73 74 79 6c 65 5f 65 6d 69 74 5f . style_emit_
bb80: 73 63 72 69 70 74 5f 74 61 67 28 31 2c 30 29 3b script_tag(1,0);
bb90: 0a 20 20 20 20 69 66 28 61 73 49 6e 6c 69 6e 65 . if(asInline
bba0: 3d 3d 30 29 7b 0a 20 20 20 20 20 20 73 74 79 6c ==0){. styl
bbb0: 65 5f 65 6d 69 74 5f 73 63 72 69 70 74 5f 62 75 e_emit_script_bu
bbc0: 69 6c 74 69 6e 28 30 2c 20 22 66 6f 73 73 69 6c iltin(0, "fossil
bbd0: 2e 62 6f 6f 74 73 74 72 61 70 2e 6a 73 22 29 3b .bootstrap.js");
bbe0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a . }. }.}../*
bbf0: 0a 2a 2a 20 49 66 20 70 61 73 73 65 64 20 30 20 .** If passed 0
bc00: 61 73 20 69 74 73 20 66 69 72 73 74 20 61 72 67 as its first arg
bc10: 75 6d 65 6e 74 2c 20 69 74 20 65 6d 69 74 73 20 ument, it emits
bc20: 61 20 73 63 72 69 70 74 20 6f 70 65 6e 65 72 20 a script opener
bc30: 74 61 67 0a 2a 2a 20 77 69 74 68 20 74 68 69 73 tag.** with this
bc40: 20 72 65 71 75 65 73 74 27 73 20 6e 6f 6e 63 65 request's nonce
bc50: 2e 20 49 66 20 70 61 73 73 65 64 20 6e 6f 6e 2d . If passed non-
bc60: 30 20 69 74 20 65 6d 69 74 73 20 61 20 73 63 72 0 it emits a scr
bc70: 69 70 74 0a 2a 2a 20 63 6c 6f 73 69 6e 67 20 74 ipt.** closing t
bc80: 61 67 2e 20 4d 6e 65 6d 6f 6e 69 63 20 66 6f 72 ag. Mnemonic for
bc90: 20 72 65 6d 65 6d 62 65 72 69 6e 67 20 74 68 65 remembering the
bca0: 20 6f 72 64 65 72 20 69 6e 20 77 68 69 63 68 20 order in which
bcb0: 74 6f 20 70 61 73 73 20 30 0a 2a 2a 20 6f 72 20 to pass 0.** or
bcc0: 31 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 1 as the first a
bcd0: 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 rgument to this
bce0: 66 75 6e 63 74 69 6f 6e 3a 20 30 20 63 6f 6d 65 function: 0 come
bcf0: 73 20 62 65 66 6f 72 65 20 31 2e 0a 2a 2a 0a 2a s before 1..**.*
bd00: 2a 20 49 66 20 70 61 73 73 65 64 20 30 20 61 73 * If passed 0 as
bd10: 20 69 74 73 20 66 69 72 73 74 20 61 72 67 75 6d its first argum
bd20: 65 6e 74 20 61 6e 64 20 61 20 6e 6f 6e 2d 4e 55 ent and a non-NU
bd30: 4c 4c 2f 6e 6f 6e 2d 65 6d 70 74 79 20 7a 53 72 LL/non-empty zSr
bd40: 63 2c 0a 2a 2a 20 74 68 65 6e 20 69 74 20 69 6e c,.** then it in
bd50: 73 74 65 61 64 20 65 6d 69 74 73 3a 0a 2a 2a 0a stead emits:.**.
bd60: 2a 2a 20 3c 73 63 72 69 70 74 20 73 72 63 3d 27 ** <script src='
bd70: 25 52 2f 7b 7b 7a 53 72 63 7d 7d 27 3e 3c 2f 73 %R/{{zSrc}}'></s
bd80: 63 72 69 70 74 3e 0a 2a 2a 0a 2a 2a 20 7a 53 72 cript>.**.** zSr
bd90: 63 20 69 73 20 61 6c 77 61 79 73 20 61 73 73 75 c is always assu
bda0: 6d 65 64 20 74 6f 20 62 65 20 61 20 72 65 70 6f med to be a repo
bdb0: 73 69 74 6f 72 79 2d 72 65 6c 61 74 69 76 65 20 sitory-relative
bdc0: 70 61 74 68 20 77 69 74 68 6f 75 74 0a 2a 2a 20 path without.**
bdd0: 61 20 6c 65 61 64 69 6e 67 20 73 6c 61 73 68 2c a leading slash,
bde0: 20 61 6e 64 20 68 61 73 20 25 52 2f 20 70 72 65 and has %R/ pre
bdf0: 70 65 6e 64 65 64 20 74 6f 20 69 74 2e 0a 2a 2a pended to it..**
be00: 0a 2a 2a 20 4d 65 61 6e 69 6e 67 20 74 68 61 74 .** Meaning that
be10: 20 6e 6f 20 66 6f 6c 6c 6f 77 2d 75 70 20 63 61 no follow-up ca
be20: 6c 6c 20 74 6f 20 70 61 73 73 20 61 20 6e 6f 6e ll to pass a non
be30: 2d 30 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e -0 first argumen
be40: 74 0a 2a 2a 20 74 6f 20 63 6c 6f 73 65 20 74 68 t.** to close th
be50: 65 20 74 61 67 2e 20 7a 53 72 63 20 69 73 20 69 e tag. zSrc is i
be60: 67 6e 6f 72 65 64 20 69 66 20 74 68 65 20 66 69 gnored if the fi
be70: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 rst argument is
be80: 6e 6f 74 0a 2a 2a 20 30 2e 0a 2a 2f 0a 76 6f 69 not.** 0..*/.voi
be90: 64 20 73 74 79 6c 65 5f 65 6d 69 74 5f 73 63 72 d style_emit_scr
bea0: 69 70 74 5f 74 61 67 28 69 6e 74 20 69 73 43 6c ipt_tag(int isCl
beb0: 6f 73 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 oser, const char
bec0: 20 2a 20 7a 53 72 63 29 7b 0a 20 20 69 66 28 30 * zSrc){. if(0
bed0: 3d 3d 69 73 43 6c 6f 73 65 72 29 7b 0a 20 20 20 ==isCloser){.
bee0: 20 69 66 28 7a 53 72 63 21 3d 30 20 26 26 20 7a if(zSrc!=0 && z
bef0: 53 72 63 5b 30 5d 21 3d 30 29 7b 0a 20 20 20 20 Src[0]!=0){.
bf00: 20 20 43 58 28 22 3c 73 63 72 69 70 74 20 73 72 CX("<script sr
bf10: 63 3d 27 25 52 2f 25 54 27 3e 3c 2f 73 63 72 69 c='%R/%T'></scri
bf20: 70 74 3e 5c 6e 22 2c 20 7a 53 72 63 29 3b 0a 20 pt>\n", zSrc);.
bf30: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 }else{.
bf40: 43 58 28 22 3c 73 63 72 69 70 74 20 6e 6f 6e 63 CX("<script nonc
bf50: 65 3d 27 25 73 27 3e 22 2c 20 73 74 79 6c 65 5f e='%s'>", style_
bf60: 6e 6f 6e 63 65 28 29 29 3b 0a 20 20 20 20 7d 0a nonce());. }.
bf70: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 43 58 28 }else{. CX(
bf80: 22 3c 2f 73 63 72 69 70 74 3e 5c 6e 22 29 3b 0a "</script>\n");.
bf90: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6d 69 }.}../*.** Emi
bfa0: 74 73 20 61 20 73 63 72 69 70 74 20 74 61 67 20 ts a script tag
bfb0: 77 68 69 63 68 20 75 73 65 73 20 63 6f 6e 74 65 which uses conte
bfc0: 6e 74 20 66 72 6f 6d 20 61 20 62 75 69 6c 74 69 nt from a builti
bfd0: 6e 20 73 63 72 69 70 74 20 66 69 6c 65 2e 0a 2a n script file..*
bfe0: 2a 0a 2a 2a 20 49 66 20 61 73 49 6e 6c 69 6e 65 *.** If asInline
bff0: 20 69 73 20 74 72 75 65 2c 20 69 74 20 69 73 20 is true, it is
c000: 65 6d 69 74 74 65 64 20 64 69 72 65 63 74 6c 79 emitted directly
c010: 20 61 73 20 61 6e 20 6f 70 65 6e 69 6e 67 20 74 as an opening t
c020: 61 67 2c 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 ag, the.** conte
c030: 6e 74 20 6f 66 20 74 68 65 20 7a 4e 61 6d 65 20 nt of the zName
c040: 62 75 69 6c 74 69 6e 20 66 69 6c 65 2c 20 61 6e builtin file, an
c050: 64 20 61 20 63 6c 6f 73 69 6e 67 20 74 61 67 2e d a closing tag.
c060: 0a 2a 2a 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 .**.** If it is
c070: 66 61 6c 73 65 2c 20 61 20 73 63 72 69 70 74 20 false, a script
c080: 74 61 67 20 6c 6f 61 64 69 6e 67 20 69 74 20 76 tag loading it v
c090: 69 61 0a 2a 2a 20 73 72 63 3d 62 75 69 6c 74 69 ia.** src=builti
c0a0: 6e 2f 7b 7b 7a 4e 61 6d 65 7d 7d 3f 63 61 63 68 n/{{zName}}?cach
c0b0: 65 3d 58 59 5a 20 69 73 20 65 6d 69 74 74 65 64 e=XYZ is emitted
c0c0: 2c 20 77 68 65 72 65 20 58 59 5a 20 69 73 20 61 , where XYZ is a
c0d0: 0a 2a 2a 20 62 75 69 6c 64 2d 74 69 6d 65 2d 64 .** build-time-d
c0e0: 65 70 65 6e 64 65 6e 74 20 63 61 63 68 65 2d 62 ependent cache-b
c0f0: 75 73 74 65 72 20 76 61 6c 75 65 2e 0a 2a 2f 0a uster value..*/.
c100: 76 6f 69 64 20 73 74 79 6c 65 5f 65 6d 69 74 5f void style_emit_
c110: 73 63 72 69 70 74 5f 62 75 69 6c 74 69 6e 28 69 script_builtin(i
c120: 6e 74 20 61 73 49 6e 6c 69 6e 65 2c 20 63 68 61 nt asInline, cha
c130: 72 20 63 6f 6e 73 74 20 2a 20 7a 4e 61 6d 65 29 r const * zName)
c140: 7b 0a 20 20 69 66 28 61 73 49 6e 6c 69 6e 65 29 {. if(asInline)
c150: 7b 0a 20 20 20 20 73 74 79 6c 65 5f 65 6d 69 74 {. style_emit
c160: 5f 73 63 72 69 70 74 5f 74 61 67 28 30 2c 30 29 _script_tag(0,0)
c170: 3b 0a 20 20 20 20 43 58 28 22 25 73 22 2c 20 62 ;. CX("%s", b
c180: 75 69 6c 74 69 6e 5f 74 65 78 74 28 7a 4e 61 6d uiltin_text(zNam
c190: 65 29 29 3b 0a 20 20 20 20 73 74 79 6c 65 5f 65 e));. style_e
c1a0: 6d 69 74 5f 73 63 72 69 70 74 5f 74 61 67 28 31 mit_script_tag(1
c1b0: 2c 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 ,0);. }else{.
c1c0: 20 20 63 68 61 72 20 2a 20 7a 46 75 6c 6c 4e 61 char * zFullNa
c1d0: 6d 65 20 3d 20 6d 70 72 69 6e 74 66 28 22 62 75 me = mprintf("bu
c1e0: 69 6c 74 69 6e 2f 25 73 22 2c 7a 4e 61 6d 65 29 iltin/%s",zName)
c1f0: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 ;. const char
c200: 20 2a 20 7a 48 61 73 68 20 3d 20 66 6f 73 73 69 * zHash = fossi
c210: 6c 5f 65 78 65 5f 69 64 28 29 3b 0a 20 20 20 20 l_exe_id();.
c220: 43 58 28 22 3c 73 63 72 69 70 74 20 73 72 63 3d CX("<script src=
c230: 27 25 52 2f 25 54 3f 63 61 63 68 65 3d 25 2e 38 '%R/%T?cache=%.8
c240: 73 27 3e 3c 2f 73 63 72 69 70 74 3e 5c 6e 22 2c s'></script>\n",
c250: 0a 20 20 20 20 20 20 20 7a 46 75 6c 6c 4e 61 6d . zFullNam
c260: 65 2c 20 7a 48 61 73 68 29 3b 0a 20 20 20 20 66 e, zHash);. f
c270: 6f 73 73 69 6c 5f 66 72 65 65 28 7a 46 75 6c 6c ossil_free(zFull
c280: 4e 61 6d 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a Name);. }.}../*
c290: 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74 69 .** The first ti
c2a0: 6d 65 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 me this is calle
c2b0: 64 20 69 74 20 65 6d 69 74 73 20 74 68 65 20 4a d it emits the J
c2c0: 53 20 63 6f 64 65 20 66 72 6f 6d 20 74 68 65 0a S code from the.
c2d0: 2a 2a 20 62 75 69 6c 74 2d 69 6e 20 66 69 6c 65 ** built-in file
c2e0: 20 66 6f 73 73 69 6c 2e 66 6f 73 73 69 6c 2e 6a fossil.fossil.j
c2f0: 73 2e 20 53 75 62 73 65 71 75 65 6e 74 20 63 61 s. Subsequent ca
c300: 6c 6c 73 20 61 72 65 20 6e 6f 2d 6f 70 73 2e 0a lls are no-ops..
c310: 2a 2a 0a 2a 2a 20 49 66 20 70 61 73 73 65 64 20 **.** If passed
c320: 61 20 74 72 75 65 20 76 61 6c 75 65 2c 20 69 74 a true value, it
c330: 20 65 6d 69 74 73 20 74 68 65 20 63 6f 6e 74 65 emits the conte
c340: 6e 74 73 20 64 69 72 65 63 74 6c 79 0a 2a 2a 20 nts directly.**
c350: 74 6f 20 74 68 65 20 70 61 67 65 20 6f 75 74 70 to the page outp
c360: 75 74 2c 20 65 6c 73 65 20 69 74 20 65 6d 69 74 ut, else it emit
c370: 73 20 61 20 73 63 72 69 70 74 20 74 61 67 20 77 s a script tag w
c380: 69 74 68 20 61 0a 2a 2a 20 73 72 63 3d 62 75 69 ith a.** src=bui
c390: 6c 74 69 6e 2f 2e 2e 2e 20 74 6f 20 6c 6f 61 64 ltin/... to load
c3a0: 20 74 68 65 20 73 63 72 69 70 74 2e 0a 2a 2a 0a the script..**.
c3b0: 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 69 ** Note that thi
c3c0: 73 20 63 6f 64 65 20 72 65 6c 69 65 73 20 6f 6e s code relies on
c3d0: 20 74 68 61 74 20 6c 6f 61 64 65 64 20 76 69 61 that loaded via
c3e0: 0a 2a 2a 20 73 74 79 6c 65 5f 65 6d 69 74 5f 73 .** style_emit_s
c3f0: 63 72 69 70 74 5f 66 6f 73 73 69 6c 5f 62 6f 6f cript_fossil_boo
c400: 74 73 74 72 61 70 28 29 20 62 75 74 20 69 74 20 tstrap() but it
c410: 64 6f 65 73 20 6e 6f 74 20 63 61 6c 6c 20 74 68 does not call th
c420: 61 74 0a 2a 2a 20 72 6f 75 74 69 6e 65 2e 0a 2a at.** routine..*
c430: 2f 0a 76 6f 69 64 20 73 74 79 6c 65 5f 65 6d 69 /.void style_emi
c440: 74 5f 73 63 72 69 70 74 5f 66 65 74 63 68 28 69 t_script_fetch(i
c450: 6e 74 20 61 73 49 6e 6c 69 6e 65 29 7b 0a 20 20 nt asInline){.
c460: 73 74 61 74 69 63 20 69 6e 74 20 6f 6e 63 65 20 static int once
c470: 3d 20 30 3b 0a 20 20 69 66 28 30 3d 3d 6f 6e 63 = 0;. if(0==onc
c480: 65 2b 2b 29 7b 0a 20 20 20 20 73 74 79 6c 65 5f e++){. style_
c490: 65 6d 69 74 5f 73 63 72 69 70 74 5f 62 75 69 6c emit_script_buil
c4a0: 74 69 6e 28 61 73 49 6e 6c 69 6e 65 2c 20 22 66 tin(asInline, "f
c4b0: 6f 73 73 69 6c 2e 66 65 74 63 68 2e 6a 73 22 29 ossil.fetch.js")
c4c0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 ;. }.}../*.** T
c4d0: 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 74 68 he first time th
c4e0: 69 73 20 69 73 20 63 61 6c 6c 65 64 20 69 74 20 is is called it
c4f0: 65 6d 69 74 73 20 74 68 65 20 4a 53 20 63 6f 64 emits the JS cod
c500: 65 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 62 75 e from the.** bu
c510: 69 6c 74 2d 69 6e 20 66 69 6c 65 20 66 6f 73 73 ilt-in file foss
c520: 69 6c 2e 64 6f 6d 2e 6a 73 2e 20 53 75 62 73 65 il.dom.js. Subse
c530: 71 75 65 6e 74 20 63 61 6c 6c 73 20 61 72 65 20 quent calls are
c540: 6e 6f 2d 6f 70 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 no-ops..**.** If
c550: 20 70 61 73 73 65 64 20 61 20 74 72 75 65 20 76 passed a true v
c560: 61 6c 75 65 2c 20 69 74 20 65 6d 69 74 73 20 74 alue, it emits t
c570: 68 65 20 63 6f 6e 74 65 6e 74 73 20 64 69 72 65 he contents dire
c580: 63 74 6c 79 0a 2a 2a 20 74 6f 20 74 68 65 20 70 ctly.** to the p
c590: 61 67 65 20 6f 75 74 70 75 74 2c 20 65 6c 73 65 age output, else
c5a0: 20 69 74 20 65 6d 69 74 73 20 61 20 73 63 72 69 it emits a scri
c5b0: 70 74 20 74 61 67 20 77 69 74 68 20 61 0a 2a 2a pt tag with a.**
c5c0: 20 73 72 63 3d 62 75 69 6c 74 69 6e 2f 2e 2e 2e src=builtin/...
c5d0: 20 74 6f 20 6c 6f 61 64 20 74 68 65 20 73 63 72 to load the scr
c5e0: 69 70 74 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 ipt..**.** Note
c5f0: 74 68 61 74 20 74 68 69 73 20 63 6f 64 65 20 72 that this code r
c600: 65 6c 69 65 73 20 6f 6e 20 74 68 61 74 20 6c 6f elies on that lo
c610: 61 64 65 64 20 76 69 61 0a 2a 2a 20 73 74 79 6c aded via.** styl
c620: 65 5f 65 6d 69 74 5f 73 63 72 69 70 74 5f 66 6f e_emit_script_fo
c630: 73 73 69 6c 5f 62 6f 6f 74 73 74 72 61 70 28 29 ssil_bootstrap()
c640: 2c 20 62 75 74 20 69 74 20 64 6f 65 73 20 6e 6f , but it does no
c650: 74 20 63 61 6c 6c 20 74 68 61 74 0a 2a 2a 20 72 t call that.** r
c660: 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 76 6f 69 64 20 outine..*/.void
c670: 73 74 79 6c 65 5f 65 6d 69 74 5f 73 63 72 69 70 style_emit_scrip
c680: 74 5f 64 6f 6d 28 69 6e 74 20 61 73 49 6e 6c 69 t_dom(int asInli
c690: 6e 65 29 7b 0a 20 20 73 74 61 74 69 63 20 69 6e ne){. static in
c6a0: 74 20 6f 6e 63 65 20 3d 20 30 3b 0a 20 20 69 66 t once = 0;. if
c6b0: 28 30 3d 3d 6f 6e 63 65 2b 2b 29 7b 0a 20 20 20 (0==once++){.
c6c0: 20 73 74 79 6c 65 5f 65 6d 69 74 5f 73 63 72 69 style_emit_scri
c6d0: 70 74 5f 62 75 69 6c 74 69 6e 28 61 73 49 6e 6c pt_builtin(asInl
c6e0: 69 6e 65 2c 20 22 66 6f 73 73 69 6c 2e 64 6f 6d ine, "fossil.dom
c6f0: 2e 6a 73 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a .js");. }.}../*
c700: 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74 69 .** The first ti
c710: 6d 65 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 me this is calle
c720: 64 2c 20 69 74 20 63 61 6c 6c 73 20 73 74 79 6c d, it calls styl
c730: 65 5f 65 6d 69 74 5f 73 63 72 69 70 74 5f 64 6f e_emit_script_do
c740: 6d 28 29 2c 0a 2a 2a 20 70 61 73 73 69 6e 67 20 m(),.** passing
c750: 69 74 20 74 68 65 20 67 69 76 65 6e 20 61 73 49 it the given asI
c760: 6e 6c 69 6e 65 20 76 61 6c 75 65 2c 20 61 6e 64 nline value, and
c770: 20 65 6d 69 74 73 20 74 68 65 20 4a 53 20 63 6f emits the JS co
c780: 64 65 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 62 de from the.** b
c790: 75 69 6c 74 2d 69 6e 20 66 69 6c 65 20 66 6f 73 uilt-in file fos
c7a0: 73 69 6c 2e 74 61 62 73 2e 6a 73 2e 20 53 75 62 sil.tabs.js. Sub
c7b0: 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 61 72 sequent calls ar
c7c0: 65 20 6e 6f 2d 6f 70 73 2e 0a 2a 2a 0a 2a 2a 20 e no-ops..**.**
c7d0: 49 66 20 70 61 73 73 65 64 20 61 20 74 72 75 65 If passed a true
c7e0: 20 76 61 6c 75 65 2c 20 69 74 20 65 6d 69 74 73 value, it emits
c7f0: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 64 69 the contents di
c800: 72 65 63 74 6c 79 0a 2a 2a 20 74 6f 20 74 68 65 rectly.** to the
c810: 20 70 61 67 65 20 6f 75 74 70 75 74 2c 20 65 6c page output, el
c820: 73 65 20 69 74 20 65 6d 69 74 73 20 61 20 73 63 se it emits a sc
c830: 72 69 70 74 20 74 61 67 20 77 69 74 68 20 61 0a ript tag with a.
c840: 2a 2a 20 73 72 63 3d 62 75 69 6c 74 69 6e 2f 2e ** src=builtin/.
c850: 2e 2e 20 74 6f 20 6c 6f 61 64 20 74 68 65 20 73 .. to load the s
c860: 63 72 69 70 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 cript..*/.void s
c870: 74 79 6c 65 5f 65 6d 69 74 5f 73 63 72 69 70 74 tyle_emit_script
c880: 5f 74 61 62 73 28 69 6e 74 20 61 73 49 6e 6c 69 _tabs(int asInli
c890: 6e 65 29 7b 0a 20 20 73 74 61 74 69 63 20 69 6e ne){. static in
c8a0: 74 20 6f 6e 63 65 20 3d 20 30 3b 0a 20 20 69 66 t once = 0;. if
c8b0: 28 30 3d 3d 6f 6e 63 65 2b 2b 29 7b 0a 20 20 20 (0==once++){.
c8c0: 20 73 74 79 6c 65 5f 65 6d 69 74 5f 73 63 72 69 style_emit_scri
c8d0: 70 74 5f 64 6f 6d 28 61 73 49 6e 6c 69 6e 65 29 pt_dom(asInline)
c8e0: 3b 0a 20 20 20 20 73 74 79 6c 65 5f 65 6d 69 74 ;. style_emit
c8f0: 5f 73 63 72 69 70 74 5f 62 75 69 6c 74 69 6e 28 _script_builtin(
c900: 61 73 49 6e 6c 69 6e 65 2c 20 22 66 6f 73 73 69 asInline, "fossi
c910: 6c 2e 74 61 62 73 2e 6a 73 22 29 3b 0a 20 20 7d l.tabs.js");. }
c920: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 .}../*.** The fi
c930: 72 73 74 20 74 69 6d 65 20 74 68 69 73 20 69 73 rst time this is
c940: 20 63 61 6c 6c 65 64 20 69 74 20 65 6d 69 74 73 called it emits
c950: 20 74 68 65 20 4a 53 20 63 6f 64 65 20 66 72 6f the JS code fro
c960: 6d 20 74 68 65 0a 2a 2a 20 62 75 69 6c 74 2d 69 m the.** built-i
c970: 6e 20 66 69 6c 65 20 66 6f 73 73 69 6c 2e 63 6f n file fossil.co
c980: 6e 66 69 72 6d 65 72 2e 6a 73 2e 20 53 75 62 73 nfirmer.js. Subs
c990: 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 61 72 65 equent calls are
c9a0: 20 6e 6f 2d 6f 70 73 2e 0a 2a 2a 0a 2a 2a 20 49 no-ops..**.** I
c9b0: 66 20 70 61 73 73 65 64 20 61 20 74 72 75 65 20 f passed a true
c9c0: 76 61 6c 75 65 2c 20 69 74 20 65 6d 69 74 73 20 value, it emits
c9d0: 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 64 69 72 the contents dir
c9e0: 65 63 74 6c 79 0a 2a 2a 20 74 6f 20 74 68 65 20 ectly.** to the
c9f0: 70 61 67 65 20 6f 75 74 70 75 74 2c 20 65 6c 73 page output, els
ca00: 65 20 69 74 20 65 6d 69 74 73 20 61 20 73 63 72 e it emits a scr
ca10: 69 70 74 20 74 61 67 20 77 69 74 68 20 61 0a 2a ipt tag with a.*
ca20: 2a 20 73 72 63 3d 62 75 69 6c 74 69 6e 2f 2e 2e * src=builtin/..
ca30: 2e 20 74 6f 20 6c 6f 61 64 20 74 68 65 20 73 63 . to load the sc
ca40: 72 69 70 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 74 ript..*/.void st
ca50: 79 6c 65 5f 65 6d 69 74 5f 73 63 72 69 70 74 5f yle_emit_script_
ca60: 63 6f 6e 66 69 72 6d 65 72 28 69 6e 74 20 61 73 confirmer(int as
ca70: 49 6e 6c 69 6e 65 29 7b 0a 20 20 73 74 61 74 69 Inline){. stati
ca80: 63 20 69 6e 74 20 6f 6e 63 65 20 3d 20 30 3b 0a c int once = 0;.
ca90: 20 20 69 66 28 30 3d 3d 6f 6e 63 65 2b 2b 29 7b if(0==once++){
caa0: 0a 20 20 20 20 73 74 79 6c 65 5f 65 6d 69 74 5f . style_emit_
cab0: 73 63 72 69 70 74 5f 62 75 69 6c 74 69 6e 28 61 script_builtin(a
cac0: 73 49 6e 6c 69 6e 65 2c 20 22 66 6f 73 73 69 6c sInline, "fossil
cad0: 2e 63 6f 6e 66 69 72 6d 65 72 2e 6a 73 22 29 3b .confirmer.js");
cae0: 0a 20 20 7d 0a 7d 0a . }.}.