Artifact c5be6540f23502543e0e08ccc425376c7c510e42447edeace71b6edf0e5cbaed:
- File
src/skins.c
— part of check-in
[7d8631f1]
at
2024-02-10 09:54:37
on branch inskinerator-modern-backport
— Initial fork of the trunk default skin into "Étienne" (a.k.a. "etienne"
without the accent for easier use in ?skin=" and such) for use by those
who want to return to the old default once this branch is merged to
trunk.
At the moment, it is a straight copy with the intent of forming a baseline for the minimal changes I'm about to make in order to allow the Fossil doc changes on this branch to render reasonably. (user: wyoung size: 39655) [more...]
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 39 20 44 2e 20 52 69 63 68 (c) 2009 D. Rich 0020: 61 72 64 20 48 69 70 70 0a 2a 2a 0a 2a 2a 20 54 ard Hipp.**.** T 0030: 68 69 73 20 70 72 6f 67 72 61 6d 20 69 73 20 66 his program is f 0040: 72 65 65 20 73 6f 66 74 77 61 72 65 3b 20 79 6f ree software; yo 0050: 75 20 63 61 6e 20 72 65 64 69 73 74 72 69 62 75 u can redistribu 0060: 74 65 20 69 74 20 61 6e 64 2f 6f 72 0a 2a 2a 20 te it and/or.** 0070: 6d 6f 64 69 66 79 20 69 74 20 75 6e 64 65 72 20 modify it under 0080: 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65 the terms of the 0090: 20 53 69 6d 70 6c 69 66 69 65 64 20 42 53 44 20 Simplified BSD 00a0: 4c 69 63 65 6e 73 65 20 28 61 6c 73 6f 0a 2a 2a License (also.** 00b0: 20 6b 6e 6f 77 6e 20 61 73 20 74 68 65 20 22 32 known as the "2 00c0: 2d 43 6c 61 75 73 65 20 4c 69 63 65 6e 73 65 22 -Clause License" 00d0: 20 6f 72 20 22 46 72 65 65 42 53 44 20 4c 69 63 or "FreeBSD Lic 00e0: 65 6e 73 65 22 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 ense".).**.** Th 00f0: 69 73 20 70 72 6f 67 72 61 6d 20 69 73 20 64 69 is program is di 0100: 73 74 72 69 62 75 74 65 64 20 69 6e 20 74 68 65 stributed in the 0110: 20 68 6f 70 65 20 74 68 61 74 20 69 74 20 77 69 hope that it wi 0120: 6c 6c 20 62 65 20 75 73 65 66 75 6c 2c 0a 2a 2a ll be useful,.** 0130: 20 62 75 74 20 77 69 74 68 6f 75 74 20 61 6e 79 but without any 0140: 20 77 61 72 72 61 6e 74 79 3b 20 77 69 74 68 6f warranty; witho 0150: 75 74 20 65 76 65 6e 20 74 68 65 20 69 6d 70 6c ut even the impl 0160: 69 65 64 20 77 61 72 72 61 6e 74 79 20 6f 66 0a ied warranty of. 0170: 2a 2a 20 6d 65 72 63 68 61 6e 74 61 62 69 6c 69 ** merchantabili 0180: 74 79 20 6f 72 20 66 69 74 6e 65 73 73 20 66 6f ty or fitness fo 0190: 72 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 70 r a particular p 01a0: 75 72 70 6f 73 65 2e 0a 2a 2a 0a 2a 2a 20 41 75 urpose..**.** Au 01b0: 74 68 6f 72 20 63 6f 6e 74 61 63 74 20 69 6e 66 thor contact inf 01c0: 6f 72 6d 61 74 69 6f 6e 3a 0a 2a 2a 20 20 20 64 ormation:.** d 01d0: 72 68 40 68 77 61 63 69 2e 63 6f 6d 0a 2a 2a 20 rh@hwaci.com.** 01e0: 20 20 68 74 74 70 3a 2f 2f 77 77 77 2e 68 77 61 http://www.hwa 01f0: 63 69 2e 63 6f 6d 2f 64 72 68 2f 0a 2a 2a 0a 2a ci.com/drh/.**.* 0200: 2a 2a 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 0a 2a **************.* 0250: 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 *.** Implementat 0260: 69 6f 6e 20 6f 66 20 74 68 65 20 53 65 74 75 70 ion of the Setup 0270: 20 70 61 67 65 20 66 6f 72 20 22 73 6b 69 6e 73 page for "skins 0280: 22 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 "..*/.#include " 0290: 63 6f 6e 66 69 67 2e 68 22 0a 23 69 6e 63 6c 75 config.h".#inclu 02a0: 64 65 20 3c 61 73 73 65 72 74 2e 68 3e 0a 23 69 de <assert.h>.#i 02b0: 6e 63 6c 75 64 65 20 22 73 6b 69 6e 73 2e 68 22 nclude "skins.h" 02c0: 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 61 72 72 61 79 ../*.** An array 02d0: 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62 75 of available bu 02e0: 69 6c 74 2d 69 6e 20 73 6b 69 6e 73 2e 0a 2a 2a ilt-in skins..** 02f0: 0a 2a 2a 20 54 6f 20 61 64 64 20 6e 65 77 20 62 .** To add new b 0300: 75 69 6c 74 2d 69 6e 20 73 6b 69 6e 73 3a 0a 2a uilt-in skins:.* 0310: 2a 0a 2a 2a 20 20 20 20 31 2e 20 20 50 69 63 6b *.** 1. Pick 0320: 20 61 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 a name for the 0330: 6e 65 77 20 73 6b 69 6e 2e 20 20 28 48 65 72 65 new skin. (Here 0340: 20 77 65 20 75 73 65 20 22 78 79 7a 7a 79 22 29 we use "xyzzy") 0350: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 32 2e 20 20 49 ..**.** 2. I 0360: 6e 73 74 61 6c 6c 20 66 69 6c 65 73 20 73 6b 69 nstall files ski 0370: 6e 73 2f 78 79 7a 7a 79 2f 63 73 73 2e 74 78 74 ns/xyzzy/css.txt 0380: 2c 20 73 6b 69 6e 73 2f 78 79 7a 7a 79 2f 68 65 , skins/xyzzy/he 0390: 61 64 65 72 2e 74 78 74 2c 0a 2a 2a 20 20 20 20 ader.txt,.** 03a0: 20 20 20 20 61 6e 64 20 73 6b 69 6e 73 2f 78 79 and skins/xy 03b0: 7a 7a 79 2f 66 6f 6f 74 65 72 2e 74 78 74 20 69 zzy/footer.txt i 03c0: 6e 74 6f 20 74 68 65 20 73 6f 75 72 63 65 20 74 nto the source t 03d0: 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 33 2e ree..**.** 3. 03e0: 20 20 52 65 72 75 6e 20 22 74 63 6c 73 68 20 6d Rerun "tclsh m 03f0: 61 6b 65 6d 61 6b 65 2e 74 63 6c 22 20 69 6e 20 akemake.tcl" in 0400: 74 68 65 20 73 72 63 2f 20 66 6f 6c 64 65 72 20 the src/ folder 0410: 69 6e 20 6f 72 64 65 72 20 74 6f 0a 2a 2a 20 20 in order to.** 0420: 20 20 20 20 20 20 72 65 62 75 69 6c 64 20 74 68 rebuild th 0430: 65 20 6d 61 6b 65 66 69 6c 65 73 20 74 6f 20 72 e makefiles to r 0440: 65 66 65 72 65 6e 63 65 20 74 68 65 20 6e 65 77 eference the new 0450: 20 43 53 53 2c 20 68 65 61 64 65 72 73 2c 20 61 CSS, headers, a 0460: 6e 64 20 66 6f 6f 74 65 72 73 2e 0a 2a 2a 0a 2a nd footers..**.* 0470: 2a 20 20 20 20 34 2e 20 20 4d 61 6b 65 20 61 6e * 4. Make an 0480: 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 66 6f entry in the fo 0490: 6c 6c 6f 77 69 6e 67 20 61 72 72 61 79 20 66 6f llowing array fo 04a0: 72 20 74 68 65 20 6e 65 77 20 73 6b 69 6e 2e 0a r the new skin.. 04b0: 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 */.static struct 04c0: 20 42 75 69 6c 74 69 6e 53 6b 69 6e 20 7b 0a 20 BuiltinSkin {. 04d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 65 const char *zDe 04e0: 73 63 3b 20 20 20 20 2f 2a 20 44 65 73 63 72 69 sc; /* Descri 04f0: 70 74 69 6f 6e 20 6f 66 20 74 68 69 73 20 73 6b ption of this sk 0500: 69 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 in */. const ch 0510: 61 72 20 2a 7a 4c 61 62 65 6c 3b 20 20 20 2f 2a ar *zLabel; /* 0520: 20 54 68 65 20 64 69 72 65 63 74 6f 72 79 20 75 The directory u 0530: 6e 64 65 72 20 73 6b 69 6e 73 2f 20 68 6f 6c 64 nder skins/ hold 0540: 69 6e 67 20 74 68 69 73 20 73 6b 69 6e 20 2a 2f ing this skin */ 0550: 0a 20 20 63 68 61 72 20 2a 7a 53 51 4c 3b 20 20 . char *zSQL; 0560: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c /* Fill 0570: 65 64 20 69 6e 20 61 74 20 72 75 6e 2d 74 69 6d ed in at run-tim 0580: 65 20 77 69 74 68 20 53 51 4c 20 74 6f 20 69 6e e with SQL to in 0590: 73 65 72 74 20 74 68 69 73 20 73 6b 69 6e 20 2a sert this skin * 05a0: 2f 0a 7d 20 61 42 75 69 6c 74 69 6e 53 6b 69 6e /.} aBuiltinSkin 05b0: 5b 5d 20 3d 20 7b 0a 20 20 7b 20 22 44 65 66 61 [] = {. { "Defa 05c0: 75 6c 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 ult", 05d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 05e0: 22 64 65 66 61 75 6c 74 22 2c 20 20 20 20 20 20 "default", 05f0: 20 20 20 20 20 30 20 7d 2c 0a 20 20 7b 20 22 41 0 },. { "A 0600: 72 64 6f 69 73 65 22 2c 20 20 20 20 20 20 20 20 rdoise", 0610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0620: 20 20 20 22 61 72 64 6f 69 73 65 22 2c 20 20 20 "ardoise", 0630: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 20 20 7b 0 },. { 0640: 20 22 42 6c 61 63 6b 20 26 20 57 68 69 74 65 22 "Black & White" 0650: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 , 0660: 20 20 20 20 20 20 22 62 6c 61 63 6b 5f 61 6e 64 "black_and 0670: 5f 77 68 69 74 65 22 2c 20 20 20 30 20 7d 2c 0a _white", 0 },. 0680: 20 20 7b 20 22 42 6c 69 74 7a 22 2c 20 20 20 20 { "Blitz", 0690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 06a0: 20 20 20 20 20 20 20 20 20 22 62 6c 69 74 7a 22 "blitz" 06b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 , 0 06c0: 7d 2c 0a 20 20 7b 20 22 44 61 72 6b 20 4d 6f 64 },. { "Dark Mod 06d0: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 e", 06e0: 20 20 20 20 20 20 20 20 20 20 20 20 22 64 61 72 "dar 06f0: 6b 6d 6f 64 65 22 2c 20 20 20 20 20 20 20 20 20 kmode", 0700: 20 30 20 7d 2c 0a 20 20 7b 20 22 45 61 67 6c 65 0 },. { "Eagle 0710: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ", 0720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 " 0730: 65 61 67 6c 65 22 2c 20 20 20 20 20 20 20 20 20 eagle", 0740: 20 20 20 20 30 20 7d 2c 0a 20 20 7b 20 22 c3 89 0 },. { "É 0750: 74 69 65 6e 6e 65 22 2c 20 20 20 20 20 20 20 20 tienne", 0760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0770: 20 20 20 22 65 74 69 65 6e 6e 65 22 2c 20 20 20 "etienne", 0780: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 20 20 7b 0 },. { 0790: 20 22 4b 68 61 6b 69 22 2c 20 20 20 20 20 20 20 "Khaki", 07a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 07b0: 20 20 20 20 20 20 22 6b 68 61 6b 69 22 2c 20 20 "khaki", 07c0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0 },. 07d0: 20 20 7b 20 22 4f 72 69 67 69 6e 61 6c 22 2c 20 { "Original", 07e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 07f0: 20 20 20 20 20 20 20 20 20 22 6f 72 69 67 69 6e "origin 0800: 61 6c 22 2c 20 20 20 20 20 20 20 20 20 20 30 20 al", 0 0810: 7d 2c 0a 20 20 7b 20 22 50 6c 61 69 6e 20 47 72 },. { "Plain Gr 0820: 61 79 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 ay", 0830: 20 20 20 20 20 20 20 20 20 20 20 20 22 70 6c 61 "pla 0840: 69 6e 5f 67 72 61 79 22 2c 20 20 20 20 20 20 20 in_gray", 0850: 20 30 20 7d 2c 0a 20 20 7b 20 22 58 65 6b 72 69 0 },. { "Xekri 0860: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ", 0870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 " 0880: 78 65 6b 72 69 22 2c 20 20 20 20 20 20 20 20 20 xekri", 0890: 20 20 20 20 30 20 7d 2c 0a 7d 3b 0a 0a 2f 2a 0a 0 },.};../*. 08a0: 2a 2a 20 41 20 73 6b 69 6e 20 63 6f 6e 73 69 73 ** A skin consis 08b0: 74 73 20 6f 66 20 66 69 76 65 20 22 66 69 6c 65 ts of five "file 08c0: 73 22 20 6e 61 6d 65 64 20 68 65 72 65 3a 0a 2a s" named here:.* 08d0: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 /.static const c 08e0: 68 61 72 20 2a 63 6f 6e 73 74 20 61 7a 53 6b 69 har *const azSki 08f0: 6e 46 69 6c 65 5b 5d 20 3d 20 7b 0a 20 20 22 63 nFile[] = {. "c 0900: 73 73 22 2c 20 22 68 65 61 64 65 72 22 2c 20 22 ss", "header", " 0910: 66 6f 6f 74 65 72 22 2c 20 22 64 65 74 61 69 6c footer", "detail 0920: 73 22 2c 20 22 6a 73 22 0a 7d 3b 0a 0a 2f 2a 0a s", "js".};../*. 0930: 2a 2a 20 41 6c 74 65 72 6e 61 74 69 76 65 20 73 ** Alternative s 0940: 6b 69 6e 73 20 63 61 6e 20 62 65 20 73 70 65 63 kins can be spec 0950: 69 66 69 65 64 20 69 6e 20 74 68 65 20 43 47 49 ified in the CGI 0960: 20 73 63 72 69 70 74 20 6f 72 20 62 79 20 6f 70 script or by op 0970: 74 69 6f 6e 73 0a 2a 2a 20 6f 6e 20 74 68 65 20 tions.** on the 0980: 22 68 74 74 70 22 2c 20 22 75 69 22 2c 20 61 6e "http", "ui", an 0990: 64 20 22 73 65 72 76 65 72 22 20 63 6f 6d 6d 61 d "server" comma 09a0: 6e 64 73 2e 20 20 54 68 65 20 61 6c 74 65 72 6e nds. The altern 09b0: 61 74 69 76 65 20 73 6b 69 6e 0a 2a 2a 20 6e 61 ative skin.** na 09c0: 6d 65 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f me must be one o 09d0: 66 20 74 68 65 20 61 42 75 69 6c 74 69 6e 53 6b f the aBuiltinSk 09e0: 69 6e 5b 5d 2e 7a 4c 61 62 65 6c 20 6e 61 6d 65 in[].zLabel name 09f0: 73 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 0a s. If there is. 0a00: 2a 2a 20 61 20 6d 61 74 63 68 2c 20 74 68 61 74 ** a match, that 0a10: 20 61 6c 74 65 72 6e 61 74 69 76 65 20 69 73 20 alternative is 0a20: 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 used..**.** The 0a30: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 61 74 69 63 following static 0a40: 20 76 61 72 69 61 62 6c 65 20 68 6f 6c 64 73 20 variable holds 0a50: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 the name of the 0a60: 61 6c 74 65 72 6e 61 74 69 76 65 20 73 6b 69 6e alternative skin 0a70: 2c 0a 2a 2a 20 6f 72 20 4e 55 4c 4c 20 69 66 20 ,.** or NULL if 0a80: 74 68 65 20 73 6b 69 6e 20 73 68 6f 75 6c 64 20 the skin should 0a90: 62 65 20 61 73 20 63 6f 6e 66 69 67 75 72 65 64 be as configured 0aa0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 ..*/.static stru 0ab0: 63 74 20 42 75 69 6c 74 69 6e 53 6b 69 6e 20 2a ct BuiltinSkin * 0ac0: 70 41 6c 74 53 6b 69 6e 20 3d 20 30 3b 0a 73 74 pAltSkin = 0;.st 0ad0: 61 74 69 63 20 63 68 61 72 20 2a 7a 41 6c 74 53 atic char *zAltS 0ae0: 6b 69 6e 44 69 72 20 3d 20 30 3b 0a 73 74 61 74 kinDir = 0;.stat 0af0: 69 63 20 69 6e 74 20 69 44 72 61 66 74 53 6b 69 ic int iDraftSki 0b00: 6e 20 3d 20 30 3b 0a 2f 2a 0a 2a 2a 20 55 73 65 n = 0;./*.** Use 0b10: 64 20 62 79 20 73 6b 69 6e 5f 75 73 65 5f 61 6c d by skin_use_al 0b20: 74 65 72 6e 61 74 69 76 65 28 29 20 74 6f 20 73 ternative() to s 0b30: 74 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 tore the current 0b40: 20 73 6b 69 6e 20 72 61 6e 6b 20 73 6b 69 6e 0a skin rank skin. 0b50: 2a 2a 20 73 6f 20 74 68 61 74 20 74 68 65 20 2f ** so that the / 0b60: 73 6b 69 6e 73 20 70 61 67 65 20 63 61 6e 2c 20 skins page can, 0b70: 69 66 20 77 61 72 72 61 6e 74 65 64 2c 20 77 61 if warranted, wa 0b80: 72 6e 20 74 68 65 20 75 73 65 72 20 74 68 61 74 rn the user that 0b90: 20 73 6b 69 6e 0a 2a 2a 20 63 68 61 6e 67 65 73 skin.** changes 0ba0: 20 77 6f 6e 27 74 20 68 61 76 65 20 61 6e 79 20 won't have any 0bb0: 65 66 66 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 effect..*/.stati 0bc0: 63 20 69 6e 74 20 6e 53 6b 69 6e 52 61 6e 6b 20 c int nSkinRank 0bd0: 3d 20 35 3b 0a 0a 2f 2a 0a 2a 2a 20 53 6b 69 6e = 5;../*.** Skin 0be0: 20 64 65 74 61 69 6c 73 20 61 72 65 20 61 20 73 details are a s 0bf0: 65 74 20 6f 66 20 6b 65 79 2f 76 61 6c 75 65 20 et of key/value 0c00: 70 61 69 72 73 20 74 68 61 74 20 64 65 66 69 6e pairs that defin 0c10: 65 20 64 69 73 70 6c 61 79 0a 2a 2a 20 61 74 74 e display.** att 0c20: 72 69 62 75 74 65 73 20 6f 66 20 74 68 65 20 73 ributes of the s 0c30: 6b 69 6e 20 74 68 61 74 20 63 61 6e 6e 6f 74 20 kin that cannot 0c40: 62 65 20 65 61 73 69 6c 79 20 73 70 65 63 69 66 be easily specif 0c50: 69 65 64 20 75 73 69 6e 67 20 43 53 53 0a 2a 2a ied using CSS.** 0c60: 20 6f 72 20 74 68 61 74 20 6e 65 65 64 20 74 6f or that need to 0c70: 20 62 65 20 6b 6e 6f 77 6e 20 6f 6e 20 74 68 65 be known on the 0c80: 20 73 65 72 76 65 72 2d 73 69 64 65 2e 0a 2a 2a server-side..** 0c90: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e .** The followin 0ca0: 67 20 61 72 72 61 79 20 68 6f 6c 64 73 20 74 68 g array holds th 0cb0: 65 20 76 61 6c 75 65 20 66 6f 72 20 61 6c 6c 20 e value for all 0cc0: 6b 6e 6f 77 6e 20 73 6b 69 6e 20 64 65 74 61 69 known skin detai 0cd0: 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 ls..*/.static st 0ce0: 72 75 63 74 20 53 6b 69 6e 44 65 74 61 69 6c 20 ruct SkinDetail 0cf0: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a {. const char * 0d00: 7a 4e 61 6d 65 3b 20 20 20 20 20 20 2f 2a 20 4e zName; /* N 0d10: 61 6d 65 20 6f 66 20 74 68 65 20 64 65 74 61 69 ame of the detai 0d20: 6c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 l */. const cha 0d30: 72 20 2a 7a 56 61 6c 75 65 3b 20 20 20 20 20 2f r *zValue; / 0d40: 2a 20 56 61 6c 75 65 20 6f 66 20 74 68 65 20 64 * Value of the d 0d50: 65 74 61 69 6c 20 2a 2f 0a 7d 20 61 53 6b 69 6e etail */.} aSkin 0d60: 44 65 74 61 69 6c 5b 5d 20 3d 20 7b 0a 20 20 7b Detail[] = {. { 0d70: 20 22 70 69 6b 63 68 72 2d 62 61 63 6b 67 72 6f "pikchr-backgro 0d80: 75 6e 64 22 2c 20 20 20 20 20 20 20 20 20 20 22 und", " 0d90: 22 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 70 " },. { "p 0da0: 69 6b 63 68 72 2d 66 6f 6e 74 73 63 61 6c 65 22 ikchr-fontscale" 0db0: 2c 20 20 20 20 20 20 20 20 20 20 20 22 22 20 20 , "" 0dc0: 20 20 20 20 7d 2c 0a 20 20 7b 20 22 70 69 6b 63 },. { "pikc 0dd0: 68 72 2d 66 6f 72 65 67 72 6f 75 6e 64 22 2c 20 hr-foreground", 0de0: 20 20 20 20 20 20 20 20 20 22 22 20 20 20 20 20 "" 0df0: 20 7d 2c 0a 20 20 7b 20 22 70 69 6b 63 68 72 2d },. { "pikchr- 0e00: 73 63 61 6c 65 22 2c 20 20 20 20 20 20 20 20 20 scale", 0e10: 20 20 20 20 20 20 22 22 20 20 20 20 20 20 7d 2c "" }, 0e20: 0a 20 20 7b 20 22 74 69 6d 65 6c 69 6e 65 2d 61 . { "timeline-a 0e30: 72 72 6f 77 68 65 61 64 73 22 2c 20 20 20 20 20 rrowheads", 0e40: 20 20 20 22 31 22 20 20 20 20 20 7d 2c 0a 20 20 "1" },. 0e50: 7b 20 22 74 69 6d 65 6c 69 6e 65 2d 63 69 72 63 { "timeline-circ 0e60: 6c 65 2d 6e 6f 64 65 73 22 2c 20 20 20 20 20 20 le-nodes", 0e70: 22 30 22 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 "0" },. { " 0e80: 74 69 6d 65 6c 69 6e 65 2d 63 6f 6c 6f 72 2d 67 timeline-color-g 0e90: 72 61 70 68 2d 6c 69 6e 65 73 22 2c 20 22 30 22 raph-lines", "0" 0ea0: 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 77 68 69 },. { "whi 0eb0: 74 65 2d 66 6f 72 65 67 72 6f 75 6e 64 22 2c 20 te-foreground", 0ec0: 20 20 20 20 20 20 20 20 20 20 22 30 22 20 20 20 "0" 0ed0: 20 20 7d 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 49 },.};../*.** I 0ee0: 6e 76 6f 6b 65 20 74 68 69 73 20 72 6f 75 74 69 nvoke this routi 0ef0: 6e 65 20 74 6f 20 73 65 74 20 74 68 65 20 61 6c ne to set the al 0f00: 74 65 72 6e 61 74 69 76 65 20 73 6b 69 6e 2e 20 ternative skin. 0f10: 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 Return NULL if 0f20: 74 68 65 0a 2a 2a 20 61 6c 74 65 72 6e 61 74 69 the.** alternati 0f30: 76 65 20 77 61 73 20 73 75 63 63 65 73 73 66 75 ve was successfu 0f40: 6c 6c 79 20 69 6e 73 74 61 6c 6c 65 64 2e 20 20 lly installed. 0f50: 52 65 74 75 72 6e 20 61 20 73 74 72 69 6e 67 20 Return a string 0f60: 6c 69 73 74 69 6e 67 20 61 6c 6c 0a 2a 2a 20 61 listing all.** a 0f70: 76 61 69 6c 61 62 6c 65 20 73 6b 69 6e 73 20 69 vailable skins i 0f80: 66 20 7a 4e 61 6d 65 20 64 6f 65 73 20 6e 6f 74 f zName does not 0f90: 20 6d 61 74 63 68 20 61 6e 20 61 76 61 69 6c 61 match an availa 0fa0: 62 6c 65 20 73 6b 69 6e 2e 20 20 4d 65 6d 6f 72 ble skin. Memor 0fb0: 79 0a 2a 2a 20 66 6f 72 20 74 68 65 20 72 65 74 y.** for the ret 0fc0: 75 72 6e 65 64 20 73 74 72 69 6e 67 20 63 6f 6d urned string com 0fd0: 65 73 20 66 72 6f 6d 20 66 6f 73 73 69 6c 5f 6d es from fossil_m 0fe0: 61 6c 6c 6f 63 28 29 20 61 6e 64 20 73 68 6f 75 alloc() and shou 0ff0: 6c 64 20 62 65 20 66 72 65 65 64 0a 2a 2a 20 62 ld be freed.** b 1000: 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a y the caller..** 1010: 0a 2a 2a 20 49 66 20 74 68 65 20 61 6c 74 65 72 .** If the alter 1020: 6e 61 74 69 76 65 20 73 6b 69 6e 20 6e 61 6d 65 native skin name 1030: 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 contains one or 1040: 20 6d 6f 72 65 20 27 2f 27 20 63 68 61 72 61 63 more '/' charac 1050: 74 65 72 73 2c 20 74 68 65 6e 0a 2a 2a 20 69 74 ters, then.** it 1060: 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 62 is assumed to b 1070: 65 20 61 20 64 69 72 65 63 74 6f 72 79 20 6f 6e e a directory on 1080: 20 64 69 73 6b 20 74 68 61 74 20 68 6f 6c 64 73 disk that holds 1090: 20 6f 76 65 72 72 69 64 65 20 63 73 73 2e 74 78 override css.tx 10a0: 74 2c 0a 2a 2a 20 66 6f 6f 74 65 72 2e 74 78 74 t,.** footer.txt 10b0: 2c 20 61 6e 64 20 68 65 61 64 65 72 2e 74 78 74 , and header.txt 10c0: 2e 20 20 54 68 69 73 20 6d 6f 64 65 20 63 61 6e . This mode can 10d0: 20 62 65 20 75 73 65 64 20 66 6f 72 20 69 6e 74 be used for int 10e0: 65 72 61 63 74 69 76 65 0a 2a 2a 20 64 65 76 65 eractive.** deve 10f0: 6c 6f 70 6d 65 6e 74 20 6f 66 20 6e 65 77 20 73 lopment of new s 1100: 6b 69 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 kins..**.** The 1110: 32 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 2nd parameter is 1120: 20 61 20 72 61 6e 6b 69 6e 67 20 6f 66 20 68 6f a ranking of ho 1130: 77 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 69 73 w important this 1140: 20 61 6c 74 65 72 6e 61 74 69 76 65 0a 2a 2a 20 alternative.** 1150: 73 6b 69 6e 20 64 65 63 6c 61 72 61 74 69 6f 6e skin declaration 1160: 20 69 73 2c 20 61 6e 64 20 6c 6f 77 65 72 20 76 is, and lower v 1170: 61 6c 75 65 73 20 74 72 75 6d 70 20 68 69 67 68 alues trump high 1180: 65 72 20 6f 6e 65 73 2e 20 49 66 20 61 20 63 61 er ones. If a ca 1190: 6c 6c 0a 2a 2a 20 74 6f 20 74 68 69 73 20 66 75 ll.** to this fu 11a0: 6e 63 74 69 6f 6e 20 70 61 73 73 65 73 20 61 20 nction passes a 11b0: 68 69 67 68 65 72 2d 76 61 6c 75 65 64 20 72 61 higher-valued ra 11c0: 6e 6b 20 74 68 61 6e 20 61 20 70 72 65 76 69 6f nk than a previo 11d0: 75 73 20 63 61 6c 6c 2c 0a 2a 2a 20 74 68 65 20 us call,.** the 11e0: 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 20 subsequent call 11f0: 62 65 63 6f 6d 65 73 20 61 20 6e 6f 2d 6f 70 2e becomes a no-op. 1200: 20 4f 6e 6c 79 20 63 61 6c 6c 73 20 77 69 74 68 Only calls with 1210: 20 74 68 65 20 73 61 6d 65 20 6f 72 0a 2a 2a 20 the same or.** 1220: 6c 6f 77 65 72 20 72 61 6e 6b 20 28 69 2e 65 2e lower rank (i.e. 1230: 20 68 69 67 68 65 72 20 70 72 69 6f 72 69 74 79 higher priority 1240: 29 20 77 69 6c 6c 20 6f 76 65 72 77 72 69 74 65 ) will overwrite 1250: 20 61 20 70 72 65 76 69 6f 75 73 0a 2a 2a 20 73 a previous.** s 1260: 65 74 74 69 6e 67 2e 20 54 68 69 73 20 61 70 70 etting. This app 1270: 72 6f 61 63 68 20 69 73 20 75 73 65 64 20 62 65 roach is used be 1280: 63 61 75 73 65 20 74 68 65 20 43 47 49 2f 73 65 cause the CGI/se 1290: 72 76 65 72 2d 74 69 6d 65 0a 2a 2a 20 69 6e 69 rver-time.** ini 12a0: 74 69 61 6c 69 7a 61 74 69 6f 6e 20 68 61 70 70 tialization happ 12b0: 65 6e 73 20 69 6e 20 61 6e 20 6f 72 64 65 72 20 ens in an order 12c0: 77 68 69 63 68 20 69 73 20 69 6e 63 6f 6d 70 61 which is incompa 12d0: 74 69 62 6c 65 20 77 69 74 68 20 6f 75 72 0a 2a tible with our.* 12e0: 2a 20 70 72 65 66 65 72 72 65 64 20 72 61 6e 6b * preferred rank 12f0: 69 6e 67 2c 20 6d 61 6b 69 6e 67 20 69 74 20 6f ing, making it o 1300: 74 68 65 72 77 69 73 65 20 6d 6f 72 65 20 69 6e therwise more in 1310: 76 61 73 69 76 65 20 74 6f 20 74 65 6c 6c 20 74 vasive to tell t 1320: 68 65 0a 2a 2a 20 69 6e 74 65 72 6e 61 6c 73 20 he.** internals 1330: 22 74 68 65 20 2d 2d 73 6b 69 6e 20 66 6c 61 67 "the --skin flag 1340: 20 72 61 6e 6b 73 20 68 69 67 68 65 72 20 74 68 ranks higher th 1350: 61 6e 20 61 20 55 52 4c 20 70 61 72 61 6d 65 74 an a URL paramet 1360: 65 72 22 20 28 74 68 65 0a 2a 2a 20 66 6f 72 6d er" (the.** form 1370: 65 72 20 67 65 74 73 20 69 6e 69 74 69 61 6c 69 er gets initiali 1380: 7a 65 64 20 62 65 66 6f 72 65 20 62 6f 74 68 20 zed before both 1390: 55 52 4c 20 70 61 72 61 6d 65 74 65 72 73 20 61 URL parameters a 13a0: 6e 64 20 74 68 65 20 2f 64 72 61 66 74 0a 2a 2a nd the /draft.** 13b0: 20 70 61 74 68 20 64 65 74 65 72 6d 69 6e 61 74 path determinat 13c0: 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 ion)..**.** The 13d0: 72 61 6e 6b 69 6e 67 73 20 77 65 72 65 20 69 6e rankings were in 13e0: 69 74 69 61 6c 6c 79 20 64 65 66 69 6e 65 64 20 itially defined 13f0: 69 6e 0a 2a 2a 20 68 74 74 70 73 3a 2f 2f 66 6f in.** https://fo 1400: 73 73 69 6c 2d 73 63 6d 2e 6f 72 67 2f 66 6f 72 ssil-scm.org/for 1410: 75 6d 2f 66 6f 72 75 6d 70 6f 73 74 2f 63 61 66 um/forumpost/caf 1420: 38 63 39 61 38 62 62 0a 2a 2a 20 61 6e 64 20 61 8c9a8bb.** and a 1430: 72 65 3a 0a 2a 2a 0a 2a 2a 20 30 29 20 41 20 73 re:.**.** 0) A s 1440: 6b 69 6e 20 6e 61 6d 65 20 6d 61 74 63 68 69 6e kin name matchin 1450: 67 20 74 68 65 20 67 6c 6f 62 20 64 72 61 66 74 g the glob draft 1460: 5b 31 2d 39 5d 20 74 72 75 6d 70 73 20 65 76 65 [1-9] trumps eve 1470: 72 79 74 68 69 6e 67 20 65 6c 73 65 2e 0a 2a 2a rything else..** 1480: 0a 2a 2a 20 31 29 20 54 68 65 20 2d 2d 73 6b 69 .** 1) The --ski 1490: 6e 20 66 6c 61 67 20 6f 72 20 73 6b 69 6e 3a 20 n flag or skin: 14a0: 43 47 49 20 63 6f 6e 66 69 67 20 73 65 74 74 69 CGI config setti 14b0: 6e 67 2e 0a 2a 2a 0a 2a 2a 20 32 29 20 54 68 65 ng..**.** 2) The 14c0: 20 22 73 6b 69 6e 22 20 64 69 73 70 6c 61 79 20 "skin" display 14d0: 73 65 74 74 69 6e 67 20 63 6f 6f 6b 69 65 20 6f setting cookie o 14e0: 72 20 55 52 4c 20 61 72 67 75 6d 65 6e 74 2c 20 r URL argument, 14f0: 69 6e 20 74 68 61 74 0a 2a 2a 20 6f 72 64 65 72 in that.** order 1500: 2e 20 49 66 20 74 68 65 20 22 73 6b 69 6e 22 20 . If the "skin" 1510: 55 52 4c 20 61 72 67 75 6d 65 6e 74 20 69 73 20 URL argument is 1520: 70 72 6f 76 69 64 65 64 20 61 6e 64 20 72 65 66 provided and ref 1530: 65 72 73 20 74 6f 20 61 20 6c 65 67 61 6c 0a 2a ers to a legal.* 1540: 2a 20 73 6b 69 6e 20 74 68 65 6e 20 74 68 61 74 * skin then that 1550: 20 77 69 6c 6c 20 75 70 64 61 74 65 20 74 68 65 will update the 1560: 20 64 69 73 70 6c 61 79 20 63 6f 6f 6b 69 65 2e display cookie. 1570: 20 49 66 20 74 68 65 20 73 6b 69 6e 20 6e 61 6d If the skin nam 1580: 65 20 69 73 0a 2a 2a 20 69 6c 6c 65 67 61 6c 20 e is.** illegal 1590: 69 74 20 69 73 20 73 69 6c 65 6e 74 6c 79 20 69 it is silently i 15a0: 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 33 29 gnored..**.** 3) 15b0: 20 53 6b 69 6e 20 70 72 6f 70 65 72 74 69 65 73 Skin properties 15c0: 20 66 72 6f 6d 20 74 68 65 20 43 4f 4e 46 49 47 from the CONFIG 15d0: 20 64 62 20 74 61 62 6c 65 0a 2a 2a 0a 2a 2a 20 db table.**.** 15e0: 34 29 20 44 65 66 61 75 6c 74 20 73 6b 69 6e 2e 4) Default skin. 15f0: 0a 2a 2a 0a 2a 2a 20 41 73 20 61 20 73 70 65 63 .**.** As a spec 1600: 69 61 6c 20 63 61 73 65 2c 20 61 20 4e 55 4c 4c ial case, a NULL 1610: 20 6f 72 20 65 6d 70 74 79 20 6e 61 6d 65 20 72 or empty name r 1620: 65 73 65 74 73 20 7a 41 6c 74 53 6b 69 6e 44 69 esets zAltSkinDi 1630: 72 20 61 6e 64 0a 2a 2a 20 70 41 6c 74 53 6b 69 r and.** pAltSki 1640: 6e 20 74 6f 20 30 20 74 6f 20 69 6e 64 69 63 61 n to 0 to indica 1650: 74 65 20 74 68 61 74 20 74 68 65 20 63 75 72 72 te that the curr 1660: 65 6e 74 20 63 6f 6e 66 69 67 2d 73 69 64 65 20 ent config-side 1670: 73 6b 69 6e 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 skin should.** b 1680: 65 20 75 73 65 64 20 28 72 61 6e 6b 20 33 2c 20 e used (rank 3, 1690: 61 62 6f 76 65 29 2c 20 74 68 65 6e 20 72 65 74 above), then ret 16a0: 75 72 6e 73 20 30 2e 0a 2a 2f 0a 63 68 61 72 20 urns 0..*/.char 16b0: 2a 73 6b 69 6e 5f 75 73 65 5f 61 6c 74 65 72 6e *skin_use_altern 16c0: 61 74 69 76 65 28 63 6f 6e 73 74 20 63 68 61 72 ative(const char 16d0: 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20 72 61 6e *zName, int ran 16e0: 6b 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 42 k){. int i;. B 16f0: 6c 6f 62 20 65 72 72 20 3d 20 42 4c 4f 42 5f 49 lob err = BLOB_I 1700: 4e 49 54 49 41 4c 49 5a 45 52 3b 0a 20 20 69 66 NITIALIZER;. if 1710: 28 72 61 6e 6b 20 3e 20 6e 53 6b 69 6e 52 61 6e (rank > nSkinRan 1720: 6b 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e k) return 0;. n 1730: 53 6b 69 6e 52 61 6e 6b 20 3d 20 72 61 6e 6b 3b SkinRank = rank; 1740: 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20 26 26 20 . if( zName && 1750: 31 3d 3d 72 61 6e 6b 20 26 26 20 73 74 72 63 68 1==rank && strch 1760: 72 28 7a 4e 61 6d 65 2c 20 27 2f 27 29 21 3d 30 r(zName, '/')!=0 1770: 20 29 7b 0a 20 20 20 20 7a 41 6c 74 53 6b 69 6e ){. zAltSkin 1780: 44 69 72 20 3d 20 66 6f 73 73 69 6c 5f 73 74 72 Dir = fossil_str 1790: 64 75 70 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 dup(zName);. 17a0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 return 0;. }. 17b0: 69 66 28 20 7a 4e 61 6d 65 20 26 26 20 73 71 6c if( zName && sql 17c0: 69 74 65 33 5f 73 74 72 67 6c 6f 62 28 22 64 72 ite3_strglob("dr 17d0: 61 66 74 5b 31 2d 39 5d 22 2c 20 7a 4e 61 6d 65 aft[1-9]", zName 17e0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 6b 69 6e )==0 ){. skin 17f0: 5f 75 73 65 5f 64 72 61 66 74 28 7a 4e 61 6d 65 _use_draft(zName 1800: 5b 35 5d 20 2d 20 27 30 27 29 3b 0a 20 20 20 20 [5] - '0');. 1810: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 return 0;. }. 1820: 69 66 28 21 7a 4e 61 6d 65 20 7c 7c 20 21 2a 7a if(!zName || !*z 1830: 4e 61 6d 65 29 7b 0a 20 20 20 20 70 41 6c 74 53 Name){. pAltS 1840: 6b 69 6e 20 3d 20 30 3b 0a 20 20 20 20 7a 41 6c kin = 0;. zAl 1850: 74 53 6b 69 6e 44 69 72 20 3d 20 30 3b 0a 20 20 tSkinDir = 0;. 1860: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a return 0;. }. 1870: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 63 6f 75 for(i=0; i<cou 1880: 6e 74 28 61 42 75 69 6c 74 69 6e 53 6b 69 6e 29 nt(aBuiltinSkin) 1890: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 ; i++){. if( 18a0: 66 6f 73 73 69 6c 5f 73 74 72 63 6d 70 28 61 42 fossil_strcmp(aB 18b0: 75 69 6c 74 69 6e 53 6b 69 6e 5b 69 5d 2e 7a 4c uiltinSkin[i].zL 18c0: 61 62 65 6c 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 abel, zName)==0 18d0: 29 7b 0a 20 20 20 20 20 20 70 41 6c 74 53 6b 69 ){. pAltSki 18e0: 6e 20 3d 20 26 61 42 75 69 6c 74 69 6e 53 6b 69 n = &aBuiltinSki 18f0: 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 72 65 74 75 n[i];. retu 1900: 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a rn 0;. }. }. 1910: 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 blob_appendf(& 1920: 65 72 72 2c 20 22 61 76 61 69 6c 61 62 6c 65 20 err, "available 1930: 73 6b 69 6e 73 3a 20 25 73 22 2c 20 61 42 75 69 skins: %s", aBui 1940: 6c 74 69 6e 53 6b 69 6e 5b 30 5d 2e 7a 4c 61 62 ltinSkin[0].zLab 1950: 65 6c 29 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 el);. for(i=1; 1960: 69 3c 63 6f 75 6e 74 28 61 42 75 69 6c 74 69 6e i<count(aBuiltin 1970: 53 6b 69 6e 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 Skin); i++){. 1980: 20 62 6c 6f 62 5f 61 70 70 65 6e 64 28 26 65 72 blob_append(&er 1990: 72 2c 20 22 20 22 2c 20 31 29 3b 0a 20 20 20 20 r, " ", 1);. 19a0: 62 6c 6f 62 5f 61 70 70 65 6e 64 28 26 65 72 72 blob_append(&err 19b0: 2c 20 61 42 75 69 6c 74 69 6e 53 6b 69 6e 5b 69 , aBuiltinSkin[i 19c0: 5d 2e 7a 4c 61 62 65 6c 2c 20 2d 31 29 3b 0a 20 ].zLabel, -1);. 19d0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 62 6c 6f 62 }. return blob 19e0: 5f 73 74 72 28 26 65 72 72 29 3b 0a 7d 0a 0a 2f _str(&err);.}../ 19f0: 2a 0a 2a 2a 20 4c 6f 6f 6b 20 66 6f 72 20 74 68 *.** Look for th 1a00: 65 20 2d 2d 73 6b 69 6e 20 63 6f 6d 6d 61 6e 64 e --skin command 1a10: 2d 6c 69 6e 65 20 6f 70 74 69 6f 6e 20 61 6e 64 -line option and 1a20: 20 70 72 6f 63 65 73 73 20 69 74 2e 20 20 4f 72 process it. Or 1a30: 0a 2a 2a 20 63 61 6c 6c 20 66 6f 73 73 69 6c 5f .** call fossil_ 1a40: 66 61 74 61 6c 28 29 20 69 66 20 61 6e 20 75 6e fatal() if an un 1a50: 6b 6e 6f 77 6e 20 73 6b 69 6e 20 69 73 20 73 70 known skin is sp 1a60: 65 63 69 66 69 65 64 2e 0a 2a 2f 0a 76 6f 69 64 ecified..*/.void 1a70: 20 73 6b 69 6e 5f 6f 76 65 72 72 69 64 65 28 76 skin_override(v 1a80: 6f 69 64 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 oid){. const ch 1a90: 61 72 20 2a 7a 53 6b 69 6e 20 3d 20 66 69 6e 64 ar *zSkin = find 1aa0: 5f 6f 70 74 69 6f 6e 28 22 73 6b 69 6e 22 2c 30 _option("skin",0 1ab0: 2c 31 29 3b 0a 20 20 69 66 28 20 7a 53 6b 69 6e ,1);. if( zSkin 1ac0: 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 ){. char *zE 1ad0: 72 72 20 3d 20 73 6b 69 6e 5f 75 73 65 5f 61 6c rr = skin_use_al 1ae0: 74 65 72 6e 61 74 69 76 65 28 7a 53 6b 69 6e 2c ternative(zSkin, 1af0: 20 31 29 3b 0a 20 20 20 20 69 66 28 20 7a 45 72 1);. if( zEr 1b00: 72 20 29 20 66 6f 73 73 69 6c 5f 66 61 74 61 6c r ) fossil_fatal 1b10: 28 22 25 73 22 2c 20 7a 45 72 72 29 3b 0a 20 20 ("%s", zErr);. 1b20: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 65 20 6f }.}../*.** Use o 1b30: 6e 65 20 6f 66 20 74 68 65 20 64 72 61 66 74 20 ne of the draft 1b40: 73 6b 69 6e 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 skins..*/.void s 1b50: 6b 69 6e 5f 75 73 65 5f 64 72 61 66 74 28 69 6e kin_use_draft(in 1b60: 74 20 69 29 7b 0a 20 20 69 44 72 61 66 74 53 6b t i){. iDraftSk 1b70: 69 6e 20 3d 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a in = i;.}../*.** 1b80: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 The following r 1b90: 6f 75 74 69 6e 65 73 20 72 65 74 75 72 6e 20 74 outines return t 1ba0: 68 65 20 76 61 72 69 6f 75 73 20 63 6f 6d 70 6f he various compo 1bb0: 6e 65 6e 74 73 20 6f 66 20 74 68 65 20 73 6b 69 nents of the ski 1bc0: 6e 0a 2a 2a 20 74 68 61 74 20 73 68 6f 75 6c 64 n.** that should 1bd0: 20 62 65 20 75 73 65 64 20 66 6f 72 20 74 68 65 be used for the 1be0: 20 63 75 72 72 65 6e 74 20 72 75 6e 2e 0a 2a 2a current run..** 1bf0: 0a 2a 2a 20 7a 57 68 61 74 20 69 73 20 6f 6e 65 .** zWhat is one 1c00: 20 6f 66 3a 20 20 22 63 73 73 22 2c 20 22 68 65 of: "css", "he 1c10: 61 64 65 72 22 2c 20 22 66 6f 6f 74 65 72 22 2c ader", "footer", 1c20: 20 22 64 65 74 61 69 6c 73 22 2c 20 22 6a 73 22 "details", "js" 1c30: 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a .*/.const char * 1c40: 73 6b 69 6e 5f 67 65 74 28 63 6f 6e 73 74 20 63 skin_get(const c 1c50: 68 61 72 20 2a 7a 57 68 61 74 29 7b 0a 20 20 63 har *zWhat){. c 1c60: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 75 74 3b onst char *zOut; 1c70: 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66 . char *z;. if 1c80: 28 20 69 44 72 61 66 74 53 6b 69 6e 20 29 7b 0a ( iDraftSkin ){. 1c90: 20 20 20 20 7a 20 3d 20 6d 70 72 69 6e 74 66 28 z = mprintf( 1ca0: 22 64 72 61 66 74 25 64 2d 25 73 22 2c 20 69 44 "draft%d-%s", iD 1cb0: 72 61 66 74 53 6b 69 6e 2c 20 7a 57 68 61 74 29 raftSkin, zWhat) 1cc0: 3b 0a 20 20 20 20 7a 4f 75 74 20 3d 20 64 62 5f ;. zOut = db_ 1cd0: 67 65 74 28 7a 2c 20 30 29 3b 0a 20 20 20 20 66 get(z, 0);. f 1ce0: 6f 73 73 69 6c 5f 66 72 65 65 28 7a 29 3b 0a 20 ossil_free(z);. 1cf0: 20 20 20 69 66 28 20 7a 4f 75 74 20 29 20 72 65 if( zOut ) re 1d00: 74 75 72 6e 20 7a 4f 75 74 3b 0a 20 20 7d 0a 20 turn zOut;. }. 1d10: 20 69 66 28 20 7a 41 6c 74 53 6b 69 6e 44 69 72 if( zAltSkinDir 1d20: 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 20 ){. char *z 1d30: 3d 20 6d 70 72 69 6e 74 66 28 22 25 73 2f 25 73 = mprintf("%s/%s 1d40: 2e 74 78 74 22 2c 20 7a 41 6c 74 53 6b 69 6e 44 .txt", zAltSkinD 1d50: 69 72 2c 20 7a 57 68 61 74 29 3b 0a 20 20 20 20 ir, zWhat);. 1d60: 69 66 28 20 66 69 6c 65 5f 69 73 66 69 6c 65 28 if( file_isfile( 1d70: 7a 2c 20 45 78 74 46 49 4c 45 29 20 29 7b 0a 20 z, ExtFILE) ){. 1d80: 20 20 20 20 20 42 6c 6f 62 20 78 3b 0a 20 20 20 Blob x;. 1d90: 20 20 20 62 6c 6f 62 5f 72 65 61 64 5f 66 72 6f blob_read_fro 1da0: 6d 5f 66 69 6c 65 28 26 78 2c 20 7a 2c 20 45 78 m_file(&x, z, Ex 1db0: 74 46 49 4c 45 29 3b 0a 20 20 20 20 20 20 66 6f tFILE);. fo 1dc0: 73 73 69 6c 5f 66 72 65 65 28 7a 29 3b 0a 20 20 ssil_free(z);. 1dd0: 20 20 20 20 72 65 74 75 72 6e 20 62 6c 6f 62 5f return blob_ 1de0: 73 74 72 28 26 78 29 3b 0a 20 20 20 20 7d 0a 20 str(&x);. }. 1df0: 20 20 20 66 6f 73 73 69 6c 5f 66 72 65 65 28 7a fossil_free(z 1e00: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 41 6c );. }. if( pAl 1e10: 74 53 6b 69 6e 20 29 7b 0a 20 20 20 20 7a 20 3d tSkin ){. z = 1e20: 20 6d 70 72 69 6e 74 66 28 22 73 6b 69 6e 73 2f mprintf("skins/ 1e30: 25 73 2f 25 73 2e 74 78 74 22 2c 20 70 41 6c 74 %s/%s.txt", pAlt 1e40: 53 6b 69 6e 2d 3e 7a 4c 61 62 65 6c 2c 20 7a 57 Skin->zLabel, zW 1e50: 68 61 74 29 3b 0a 20 20 20 20 7a 4f 75 74 20 3d hat);. zOut = 1e60: 20 62 75 69 6c 74 69 6e 5f 74 65 78 74 28 7a 29 builtin_text(z) 1e70: 3b 0a 20 20 20 20 66 6f 73 73 69 6c 5f 66 72 65 ;. fossil_fre 1e80: 65 28 7a 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 e(z);. }else{. 1e90: 20 20 20 7a 4f 75 74 20 3d 20 64 62 5f 67 65 74 zOut = db_get 1ea0: 28 7a 57 68 61 74 2c 20 30 29 3b 0a 20 20 20 20 (zWhat, 0);. 1eb0: 69 66 28 20 7a 4f 75 74 3d 3d 30 20 29 7b 0a 20 if( zOut==0 ){. 1ec0: 20 20 20 20 20 7a 20 3d 20 6d 70 72 69 6e 74 66 z = mprintf 1ed0: 28 22 73 6b 69 6e 73 2f 64 65 66 61 75 6c 74 2f ("skins/default/ 1ee0: 25 73 2e 74 78 74 22 2c 20 7a 57 68 61 74 29 3b %s.txt", zWhat); 1ef0: 0a 20 20 20 20 20 20 7a 4f 75 74 20 3d 20 62 75 . zOut = bu 1f00: 69 6c 74 69 6e 5f 74 65 78 74 28 7a 29 3b 0a 20 iltin_text(z);. 1f10: 20 20 20 20 20 66 6f 73 73 69 6c 5f 66 72 65 65 fossil_free 1f20: 28 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 (z);. }. }. 1f30: 20 72 65 74 75 72 6e 20 7a 4f 75 74 3b 0a 7d 0a return zOut;.}. 1f40: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 ./*.** Return th 1f50: 65 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 6f e command-line o 1f60: 70 74 69 6f 6e 20 75 73 65 64 20 74 6f 20 73 65 ption used to se 1f70: 74 20 74 68 65 20 73 6b 69 6e 2c 20 6f 72 20 72 t the skin, or r 1f80: 65 74 75 72 6e 20 4e 55 4c 4c 0a 2a 2a 20 69 66 eturn NULL.** if 1f90: 20 74 68 65 20 64 65 66 61 75 6c 74 20 73 6b 69 the default ski 1fa0: 6e 20 69 73 20 62 65 69 6e 67 20 75 73 65 64 2e n is being used. 1fb0: 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a .*/.const char * 1fc0: 73 6b 69 6e 5f 69 6e 5f 75 73 65 28 76 6f 69 64 skin_in_use(void 1fd0: 29 7b 0a 20 20 69 66 28 20 7a 41 6c 74 53 6b 69 ){. if( zAltSki 1fe0: 6e 44 69 72 20 29 20 72 65 74 75 72 6e 20 7a 41 nDir ) return zA 1ff0: 6c 74 53 6b 69 6e 44 69 72 3b 0a 20 20 69 66 28 ltSkinDir;. if( 2000: 20 70 41 6c 74 53 6b 69 6e 20 29 20 72 65 74 75 pAltSkin ) retu 2010: 72 6e 20 70 41 6c 74 53 6b 69 6e 2d 3e 7a 4c 61 rn pAltSkin->zLa 2020: 62 65 6c 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b bel;. return 0; 2030: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e .}../*.** Return 2040: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 a pointer to a 2050: 53 6b 69 6e 44 65 74 61 69 6c 20 65 6c 65 6d 65 SkinDetail eleme 2060: 6e 74 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 nt. Return 0 if 2070: 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 not found..*/.s 2080: 74 61 74 69 63 20 73 74 72 75 63 74 20 53 6b 69 tatic struct Ski 2090: 6e 44 65 74 61 69 6c 20 2a 73 6b 69 6e 5f 64 65 nDetail *skin_de 20a0: 74 61 69 6c 5f 66 69 6e 64 28 63 6f 6e 73 74 20 tail_find(const 20b0: 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 char *zName){. 20c0: 69 6e 74 20 6c 77 72 20 3d 20 30 3b 0a 20 20 69 int lwr = 0;. i 20d0: 6e 74 20 75 70 72 20 3d 20 63 6f 75 6e 74 28 61 nt upr = count(a 20e0: 53 6b 69 6e 44 65 74 61 69 6c 29 3b 0a 20 20 77 SkinDetail);. w 20f0: 68 69 6c 65 28 20 75 70 72 3e 3d 6c 77 72 20 29 hile( upr>=lwr ) 2100: 7b 0a 20 20 20 20 69 6e 74 20 6d 69 64 20 3d 20 {. int mid = 2110: 28 75 70 72 2b 6c 77 72 29 2f 32 3b 0a 20 20 20 (upr+lwr)/2;. 2120: 20 69 6e 74 20 63 20 3d 20 66 6f 73 73 69 6c 5f int c = fossil_ 2130: 73 74 72 63 6d 70 28 61 53 6b 69 6e 44 65 74 61 strcmp(aSkinDeta 2140: 69 6c 5b 6d 69 64 5d 2e 7a 4e 61 6d 65 2c 20 7a il[mid].zName, z 2150: 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 63 Name);. if( c 2160: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 26 61 53 ==0 ) return &aS 2170: 6b 69 6e 44 65 74 61 69 6c 5b 6d 69 64 5d 3b 0a kinDetail[mid];. 2180: 20 20 20 20 69 66 28 20 63 3c 30 20 29 7b 0a 20 if( c<0 ){. 2190: 20 20 20 20 20 6c 77 72 20 3d 20 6d 69 64 2b 31 lwr = mid+1 21a0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 ;. }else{. 21b0: 20 20 20 75 70 72 20 3d 20 6d 69 64 2d 31 3b 0a upr = mid-1;. 21c0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 }. }. retu 21d0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 49 6e 69 74 rn 0;.}../* Init 21e0: 69 61 6c 69 7a 65 20 74 68 65 20 61 53 6b 69 6e ialize the aSkin 21f0: 44 65 74 61 69 6c 20 61 72 72 61 79 20 75 73 69 Detail array usi 2200: 6e 67 20 74 68 65 20 74 65 78 74 20 69 6e 20 74 ng the text in t 2210: 68 65 20 64 65 74 61 69 6c 73 2e 74 78 74 0a 2a he details.txt.* 2220: 2a 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 * file..*/.stati 2230: 63 20 76 6f 69 64 20 73 6b 69 6e 5f 64 65 74 61 c void skin_deta 2240: 69 6c 5f 69 6e 69 74 69 61 6c 69 7a 65 28 76 6f il_initialize(vo 2250: 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20 69 6e id){. static in 2260: 74 20 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 t isInit = 0;. 2270: 63 68 61 72 20 2a 7a 44 65 74 61 69 6c 3b 0a 20 char *zDetail;. 2280: 20 42 6c 6f 62 20 64 65 74 61 69 6c 2c 20 6c 69 Blob detail, li 2290: 6e 65 2c 20 6b 65 79 2c 20 76 61 6c 75 65 3b 0a ne, key, value;. 22a0: 20 20 69 66 28 20 69 73 49 6e 69 74 20 29 20 72 if( isInit ) r 22b0: 65 74 75 72 6e 3b 0a 20 20 69 73 49 6e 69 74 20 eturn;. isInit 22c0: 3d 20 31 3b 0a 20 20 7a 44 65 74 61 69 6c 20 3d = 1;. zDetail = 22d0: 20 28 63 68 61 72 2a 29 73 6b 69 6e 5f 67 65 74 (char*)skin_get 22e0: 28 22 64 65 74 61 69 6c 73 22 29 3b 0a 20 20 69 ("details");. i 22f0: 66 28 20 7a 44 65 74 61 69 6c 3d 3d 30 20 29 20 f( zDetail==0 ) 2300: 72 65 74 75 72 6e 3b 0a 20 20 7a 44 65 74 61 69 return;. zDetai 2310: 6c 20 3d 20 66 6f 73 73 69 6c 5f 73 74 72 64 75 l = fossil_strdu 2320: 70 28 7a 44 65 74 61 69 6c 29 3b 0a 20 20 62 6c p(zDetail);. bl 2330: 6f 62 5f 69 6e 69 74 28 26 64 65 74 61 69 6c 2c ob_init(&detail, 2340: 20 7a 44 65 74 61 69 6c 2c 20 2d 31 29 3b 0a 20 zDetail, -1);. 2350: 20 77 68 69 6c 65 28 20 62 6c 6f 62 5f 6c 69 6e while( blob_lin 2360: 65 28 26 64 65 74 61 69 6c 2c 20 26 6c 69 6e 65 e(&detail, &line 2370: 29 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a ) ){. char *z 2380: 4b 65 79 3b 0a 20 20 20 20 69 6e 74 20 6e 4b 65 Key;. int nKe 2390: 79 3b 0a 20 20 20 20 73 74 72 75 63 74 20 53 6b y;. struct Sk 23a0: 69 6e 44 65 74 61 69 6c 20 2a 70 44 65 74 61 69 inDetail *pDetai 23b0: 6c 3b 0a 20 20 20 20 69 66 28 20 21 62 6c 6f 62 l;. if( !blob 23c0: 5f 74 6f 6b 65 6e 28 26 6c 69 6e 65 2c 20 26 6b _token(&line, &k 23d0: 65 79 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a ey) ) continue;. 23e0: 20 20 20 20 7a 4b 65 79 20 3d 20 62 6c 6f 62 5f zKey = blob_ 23f0: 62 75 66 66 65 72 28 26 6b 65 79 29 3b 0a 20 20 buffer(&key);. 2400: 20 20 69 66 28 20 7a 4b 65 79 5b 30 5d 3d 3d 27 if( zKey[0]==' 2410: 23 27 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 #' ) continue;. 2420: 20 20 20 6e 4b 65 79 20 3d 20 62 6c 6f 62 5f 73 nKey = blob_s 2430: 69 7a 65 28 26 6b 65 79 29 3b 0a 20 20 20 20 69 ize(&key);. i 2440: 66 28 20 6e 4b 65 79 3c 32 20 29 20 63 6f 6e 74 f( nKey<2 ) cont 2450: 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 7a 4b inue;. if( zK 2460: 65 79 5b 6e 4b 65 79 2d 31 5d 21 3d 27 3a 27 20 ey[nKey-1]!=':' 2470: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 ) continue;. 2480: 7a 4b 65 79 5b 6e 4b 65 79 2d 31 5d 20 3d 20 30 zKey[nKey-1] = 0 2490: 3b 0a 20 20 20 20 70 44 65 74 61 69 6c 20 3d 20 ;. pDetail = 24a0: 73 6b 69 6e 5f 64 65 74 61 69 6c 5f 66 69 6e 64 skin_detail_find 24b0: 28 7a 4b 65 79 29 3b 0a 20 20 20 20 69 66 28 20 (zKey);. if( 24c0: 70 44 65 74 61 69 6c 3d 3d 30 20 29 20 63 6f 6e pDetail==0 ) con 24d0: 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 21 tinue;. if( ! 24e0: 62 6c 6f 62 5f 74 6f 6b 65 6e 28 26 6c 69 6e 65 blob_token(&line 24f0: 2c 20 26 76 61 6c 75 65 29 20 29 20 63 6f 6e 74 , &value) ) cont 2500: 69 6e 75 65 3b 0a 20 20 20 20 70 44 65 74 61 69 inue;. pDetai 2510: 6c 2d 3e 7a 56 61 6c 75 65 20 3d 20 66 6f 73 73 l->zValue = foss 2520: 69 6c 5f 73 74 72 64 75 70 28 62 6c 6f 62 5f 73 il_strdup(blob_s 2530: 74 72 28 26 76 61 6c 75 65 29 29 3b 0a 20 20 7d tr(&value));. } 2540: 0a 20 20 62 6c 6f 62 5f 72 65 73 65 74 28 26 64 . blob_reset(&d 2550: 65 74 61 69 6c 29 3b 0a 20 20 66 6f 73 73 69 6c etail);. fossil 2560: 5f 66 72 65 65 28 7a 44 65 74 61 69 6c 29 3b 0a _free(zDetail);. 2570: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 }../*.** Return 2580: 61 20 73 6b 69 6e 20 64 65 74 61 69 6c 20 73 65 a skin detail se 2590: 74 74 69 6e 67 0a 2a 2f 0a 63 6f 6e 73 74 20 63 tting.*/.const c 25a0: 68 61 72 20 2a 73 6b 69 6e 5f 64 65 74 61 69 6c har *skin_detail 25b0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 (const char *zNa 25c0: 6d 65 29 7b 0a 20 20 73 74 72 75 63 74 20 53 6b me){. struct Sk 25d0: 69 6e 44 65 74 61 69 6c 20 2a 70 44 65 74 61 69 inDetail *pDetai 25e0: 6c 3b 0a 20 20 73 6b 69 6e 5f 64 65 74 61 69 6c l;. skin_detail 25f0: 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20 _initialize();. 2600: 20 70 44 65 74 61 69 6c 20 3d 20 73 6b 69 6e 5f pDetail = skin_ 2610: 64 65 74 61 69 6c 5f 66 69 6e 64 28 7a 4e 61 6d detail_find(zNam 2620: 65 29 3b 0a 20 20 69 66 28 20 70 44 65 74 61 69 e);. if( pDetai 2630: 6c 3d 3d 30 20 29 20 66 6f 73 73 69 6c 5f 66 61 l==0 ) fossil_fa 2640: 74 61 6c 28 22 6e 6f 20 73 75 63 68 20 73 6b 69 tal("no such ski 2650: 6e 20 64 65 74 61 69 6c 3a 20 25 73 22 2c 20 7a n detail: %s", z 2660: 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 Name);. return 2670: 70 44 65 74 61 69 6c 2d 3e 7a 56 61 6c 75 65 3b pDetail->zValue; 2680: 0a 7d 0a 69 6e 74 20 73 6b 69 6e 5f 64 65 74 61 .}.int skin_deta 2690: 69 6c 5f 62 6f 6f 6c 65 61 6e 28 63 6f 6e 73 74 il_boolean(const 26a0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 char *zName){. 26b0: 20 72 65 74 75 72 6e 20 21 69 73 5f 66 61 6c 73 return !is_fals 26c0: 65 28 73 6b 69 6e 5f 64 65 74 61 69 6c 28 7a 4e e(skin_detail(zN 26d0: 61 6d 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 ame));.}../*.** 26e0: 48 61 73 68 20 66 75 6e 63 74 69 6f 6e 20 66 6f Hash function fo 26f0: 72 20 63 6f 6d 70 75 74 69 6e 67 20 61 20 73 6b r computing a sk 2700: 69 6e 20 69 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 in id..*/.static 2710: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 73 6b unsigned int sk 2720: 69 6e 5f 68 61 73 68 28 75 6e 73 69 67 6e 65 64 in_hash(unsigned 2730: 20 69 6e 74 20 68 2c 20 63 6f 6e 73 74 20 63 68 int h, const ch 2740: 61 72 20 2a 7a 29 7b 0a 20 20 69 66 28 20 7a 3d ar *z){. if( z= 2750: 3d 30 20 29 20 72 65 74 75 72 6e 20 68 3b 0a 20 =0 ) return h;. 2760: 20 77 68 69 6c 65 28 20 7a 5b 30 5d 20 29 7b 0a while( z[0] ){. 2770: 20 20 20 20 68 20 3d 20 28 68 3c 3c 31 31 29 20 h = (h<<11) 2780: 5e 20 28 68 3c 3c 31 29 20 5e 20 28 68 3e 3e 33 ^ (h<<1) ^ (h>>3 2790: 29 20 5e 20 7a 5b 30 5d 3b 0a 20 20 20 20 7a 2b ) ^ z[0];. z+ 27a0: 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 +;. }. return 27b0: 68 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 h;.}../*.** Retu 27c0: 72 6e 20 61 6e 20 69 64 65 6e 74 69 66 69 65 72 rn an identifier 27d0: 20 74 68 61 74 20 69 73 20 28 70 72 6f 62 61 62 that is (probab 27e0: 6c 79 29 20 64 69 66 66 65 72 65 6e 74 20 66 6f ly) different fo 27f0: 72 20 65 76 65 72 79 20 73 6b 69 6e 0a 2a 2a 20 r every skin.** 2800: 62 75 74 20 74 68 61 74 20 69 73 20 28 70 72 6f but that is (pro 2810: 62 61 62 6c 79 29 20 74 68 65 20 73 61 6d 65 20 bably) the same 2820: 69 66 20 74 68 65 20 73 6b 69 6e 20 69 73 20 75 if the skin is u 2830: 6e 63 68 61 6e 67 65 64 2e 20 20 54 68 69 73 0a nchanged. This. 2840: 2a 2a 20 69 64 65 6e 74 69 66 69 65 72 20 63 61 ** identifier ca 2850: 6e 20 62 65 20 61 74 74 61 63 68 65 64 20 74 6f n be attached to 2860: 20 72 65 73 6f 75 72 63 65 20 55 52 4c 73 20 74 resource URLs t 2870: 6f 20 66 6f 72 63 65 20 72 65 6c 6f 61 64 69 6e o force reloadin 2880: 67 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 72 65 g when.** the re 2890: 73 6f 75 72 63 65 73 20 63 68 61 6e 67 65 20 62 sources change b 28a0: 75 74 20 61 6c 6c 6f 77 20 74 68 65 20 72 65 73 ut allow the res 28b0: 6f 75 72 63 65 73 20 74 6f 20 62 65 20 72 65 61 ources to be rea 28c0: 64 20 66 72 6f 6d 20 63 61 63 68 65 0a 2a 2a 20 d from cache.** 28d0: 61 73 20 6c 6f 6e 67 20 61 73 20 74 68 65 79 20 as long as they 28e0: 61 72 65 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a are unchanged..* 28f0: 2a 0a 2a 2a 20 54 68 65 20 7a 52 65 73 6f 75 72 *.** The zResour 2900: 63 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 ce argument is t 2910: 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 43 4f 4e he name of a CON 2920: 46 49 47 20 73 65 74 74 69 6e 67 20 74 68 61 74 FIG setting that 2930: 0a 2a 2a 20 64 65 66 69 6e 65 73 20 74 68 65 20 .** defines the 2940: 72 65 73 6f 75 72 63 65 2e 20 20 45 78 61 6d 70 resource. Examp 2950: 6c 65 73 3a 20 20 22 63 73 73 22 2c 20 22 6c 6f les: "css", "lo 2960: 67 6f 2d 69 6d 61 67 65 22 2e 0a 2a 2f 0a 75 6e go-image"..*/.un 2970: 73 69 67 6e 65 64 20 69 6e 74 20 73 6b 69 6e 5f signed int skin_ 2980: 69 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a id(const char *z 2990: 52 65 73 6f 75 72 63 65 29 7b 0a 20 20 75 6e 73 Resource){. uns 29a0: 69 67 6e 65 64 20 69 6e 74 20 68 20 3d 20 30 3b igned int h = 0; 29b0: 0a 20 20 69 66 28 20 7a 41 6c 74 53 6b 69 6e 44 . if( zAltSkinD 29c0: 69 72 20 29 7b 0a 20 20 20 20 68 20 3d 20 73 6b ir ){. h = sk 29d0: 69 6e 5f 68 61 73 68 28 30 2c 20 7a 41 6c 74 53 in_hash(0, zAltS 29e0: 6b 69 6e 44 69 72 29 3b 0a 20 20 7d 65 6c 73 65 kinDir);. }else 29f0: 20 69 66 28 20 70 41 6c 74 53 6b 69 6e 20 29 7b if( pAltSkin ){ 2a00: 0a 20 20 20 20 68 20 3d 20 73 6b 69 6e 5f 68 61 . h = skin_ha 2a10: 73 68 28 30 2c 20 70 41 6c 74 53 6b 69 6e 2d 3e sh(0, pAltSkin-> 2a20: 7a 4c 61 62 65 6c 29 3b 0a 20 20 7d 65 6c 73 65 zLabel);. }else 2a30: 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 54 69 {. char *zMTi 2a40: 6d 65 20 3d 20 64 62 5f 67 65 74 5f 6d 74 69 6d me = db_get_mtim 2a50: 65 28 7a 52 65 73 6f 75 72 63 65 2c 20 30 2c 20 e(zResource, 0, 2a60: 30 29 3b 0a 20 20 20 20 68 20 3d 20 73 6b 69 6e 0);. h = skin 2a70: 5f 68 61 73 68 28 30 2c 20 7a 4d 54 69 6d 65 29 _hash(0, zMTime) 2a80: 3b 0a 20 20 20 20 66 6f 73 73 69 6c 5f 66 72 65 ;. fossil_fre 2a90: 65 28 7a 4d 54 69 6d 65 29 3b 0a 20 20 7d 0a 0a e(zMTime);. }.. 2aa0: 20 20 2f 2a 20 43 68 61 6e 67 65 20 74 68 65 20 /* Change the 2ab0: 49 44 20 65 76 65 72 79 20 74 69 6d 65 20 46 6f ID every time Fo 2ac0: 73 73 69 6c 20 69 73 20 72 65 63 6f 6d 70 69 6c ssil is recompil 2ad0: 65 64 20 2a 2f 0a 20 20 68 20 3d 20 73 6b 69 6e ed */. h = skin 2ae0: 5f 68 61 73 68 28 68 2c 20 66 6f 73 73 69 6c 5f _hash(h, fossil_ 2af0: 65 78 65 5f 69 64 28 29 29 3b 0a 20 20 72 65 74 exe_id());. ret 2b00: 75 72 6e 20 68 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 urn h;.}../*.** 2b10: 46 6f 72 20 61 20 73 6b 69 6e 20 6e 61 6d 65 64 For a skin named 2b20: 20 7a 53 6b 69 6e 4e 61 6d 65 2c 20 63 6f 6d 70 zSkinName, comp 2b30: 75 74 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 ute the name of 2b40: 74 68 65 20 43 4f 4e 46 49 47 20 74 61 62 6c 65 the CONFIG table 2b50: 0a 2a 2a 20 65 6e 74 72 79 20 77 68 65 72 65 20 .** entry where 2b60: 74 68 61 74 20 73 6b 69 6e 20 69 73 20 73 74 6f that skin is sto 2b70: 72 65 64 20 61 6e 64 20 72 65 74 75 72 6e 20 69 red and return i 2b80: 74 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 t..**.** Return 2b90: 4e 55 4c 4c 20 69 66 20 7a 53 6b 69 6e 4e 61 6d NULL if zSkinNam 2ba0: 65 20 69 73 20 4e 55 4c 4c 20 6f 72 20 61 6e 20 e is NULL or an 2bb0: 65 6d 70 74 79 20 73 74 72 69 6e 67 2e 0a 2a 2a empty string..** 2bc0: 0a 2a 2a 20 49 66 20 69 66 45 78 69 73 74 73 20 .** If ifExists 2bd0: 69 73 20 74 72 75 65 2c 20 61 6e 64 20 74 68 65 is true, and the 2be0: 20 6e 61 6d 65 64 20 73 6b 69 6e 20 64 6f 65 73 named skin does 2bf0: 20 6e 6f 74 20 65 78 69 73 74 2c 20 72 65 74 75 not exist, retu 2c00: 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 rn NULL..*/.stat 2c10: 69 63 20 63 68 61 72 20 2a 73 6b 69 6e 56 61 72 ic char *skinVar 2c20: 4e 61 6d 65 28 63 6f 6e 73 74 20 63 68 61 72 20 Name(const char 2c30: 2a 7a 53 6b 69 6e 4e 61 6d 65 2c 20 69 6e 74 20 *zSkinName, int 2c40: 69 66 45 78 69 73 74 73 29 7b 0a 20 20 63 68 61 ifExists){. cha 2c50: 72 20 2a 7a 3b 0a 20 20 69 66 28 20 7a 53 6b 69 r *z;. if( zSki 2c60: 6e 4e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 53 6b 69 nName==0 || zSki 2c70: 6e 4e 61 6d 65 5b 30 5d 3d 3d 30 20 29 20 72 65 nName[0]==0 ) re 2c80: 74 75 72 6e 20 30 3b 0a 20 20 7a 20 3d 20 6d 70 turn 0;. z = mp 2c90: 72 69 6e 74 66 28 22 73 6b 69 6e 3a 25 73 22 2c rintf("skin:%s", 2ca0: 20 7a 53 6b 69 6e 4e 61 6d 65 29 3b 0a 20 20 69 zSkinName);. i 2cb0: 66 28 20 69 66 45 78 69 73 74 73 20 26 26 20 21 f( ifExists && ! 2cc0: 64 62 5f 65 78 69 73 74 73 28 22 53 45 4c 45 43 db_exists("SELEC 2cd0: 54 20 31 20 46 52 4f 4d 20 63 6f 6e 66 69 67 20 T 1 FROM config 2ce0: 57 48 45 52 45 20 6e 61 6d 65 3d 25 51 22 2c 20 WHERE name=%Q", 2cf0: 7a 29 20 29 7b 0a 20 20 20 20 66 72 65 65 28 7a z) ){. free(z 2d00: 29 3b 0a 20 20 20 20 7a 20 3d 20 30 3b 0a 20 20 );. z = 0;. 2d10: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a }. return z;.}. 2d20: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 ./*.** Return tr 2d30: 75 65 20 69 66 20 74 68 65 72 65 20 65 78 69 73 ue if there exis 2d40: 74 73 20 61 20 73 6b 69 6e 20 6e 61 6d 65 20 22 ts a skin name " 2d50: 7a 53 6b 69 6e 4e 61 6d 65 22 2e 0a 2a 2f 0a 73 zSkinName"..*/.s 2d60: 74 61 74 69 63 20 69 6e 74 20 73 6b 69 6e 45 78 tatic int skinEx 2d70: 69 73 74 73 28 63 6f 6e 73 74 20 63 68 61 72 20 ists(const char 2d80: 2a 7a 53 6b 69 6e 4e 61 6d 65 29 7b 0a 20 20 69 *zSkinName){. i 2d90: 6e 74 20 69 3b 0a 20 20 69 66 28 20 7a 53 6b 69 nt i;. if( zSki 2da0: 6e 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 nName==0 ) retur 2db0: 6e 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 n 0;. for(i=0; 2dc0: 69 3c 63 6f 75 6e 74 28 61 42 75 69 6c 74 69 6e i<count(aBuiltin 2dd0: 53 6b 69 6e 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 Skin); i++){. 2de0: 20 69 66 28 20 66 6f 73 73 69 6c 5f 73 74 72 63 if( fossil_strc 2df0: 6d 70 28 7a 53 6b 69 6e 4e 61 6d 65 2c 20 61 42 mp(zSkinName, aB 2e00: 75 69 6c 74 69 6e 53 6b 69 6e 5b 69 5d 2e 7a 44 uiltinSkin[i].zD 2e10: 65 73 63 29 3d 3d 30 20 29 20 72 65 74 75 72 6e esc)==0 ) return 2e20: 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 1;. }. return 2e30: 20 64 62 5f 65 78 69 73 74 73 28 22 53 45 4c 45 db_exists("SELE 2e40: 43 54 20 31 20 46 52 4f 4d 20 63 6f 6e 66 69 67 CT 1 FROM config 2e50: 20 57 48 45 52 45 20 6e 61 6d 65 3d 27 73 6b 69 WHERE name='ski 2e60: 6e 3a 25 71 27 22 2c 20 7a 53 6b 69 6e 4e 61 6d n:%q'", zSkinNam 2e70: 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e e);.}../*.** Con 2e80: 73 74 72 75 63 74 20 61 6e 64 20 72 65 74 75 72 struct and retur 2e90: 6e 20 61 6e 20 73 74 72 69 6e 67 20 6f 66 20 53 n an string of S 2ea0: 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68 QL statements th 2eb0: 61 74 20 72 65 70 72 65 73 65 6e 74 73 0a 2a 2a at represents.** 2ec0: 20 61 20 22 73 6b 69 6e 22 20 73 65 74 74 69 6e a "skin" settin 2ed0: 67 2e 20 20 49 66 20 7a 4e 61 6d 65 3d 3d 30 20 g. If zName==0 2ee0: 74 68 65 6e 20 72 65 74 75 72 6e 20 74 68 65 20 then return the 2ef0: 73 6b 69 6e 20 63 75 72 72 65 6e 74 6c 79 0a 2a skin currently.* 2f00: 2a 20 69 6e 73 74 61 6c 6c 65 64 2e 20 20 4f 74 * installed. Ot 2f10: 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20 herwise, return 2f20: 6f 6e 65 20 6f 66 20 74 68 65 20 62 75 69 6c 74 one of the built 2f30: 2d 69 6e 20 73 6b 69 6e 73 20 64 65 73 69 67 6e -in skins design 2f40: 61 74 65 64 0a 2a 2a 20 62 79 20 7a 4e 61 6d 65 ated.** by zName 2f50: 2e 0a 2a 2a 0a 2a 2a 20 4d 65 6d 6f 72 79 20 74 ..**.** Memory t 2f60: 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72 o hold the retur 2f70: 6e 65 64 20 73 74 72 69 6e 67 20 69 73 20 6f 62 ned string is ob 2f80: 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c tained from mall 2f90: 6f 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 oc..*/.static ch 2fa0: 61 72 20 2a 67 65 74 53 6b 69 6e 28 63 6f 6e 73 ar *getSkin(cons 2fb0: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a t char *zName){. 2fc0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b const char *z; 2fd0: 0a 20 20 63 68 61 72 20 2a 7a 4c 61 62 65 6c 3b . char *zLabel; 2fe0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 42 6c 6f 62 . int i;. Blob 2ff0: 20 76 61 6c 3b 0a 20 20 62 6c 6f 62 5f 7a 65 72 val;. blob_zer 3000: 6f 28 26 76 61 6c 29 3b 0a 20 20 66 6f 72 28 69 o(&val);. for(i 3010: 3d 30 3b 20 69 3c 63 6f 75 6e 74 28 61 7a 53 6b =0; i<count(azSk 3020: 69 6e 46 69 6c 65 29 3b 20 69 2b 2b 29 7b 0a 20 inFile); i++){. 3030: 20 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a if( zName ){. 3040: 20 20 20 20 20 20 7a 4c 61 62 65 6c 20 3d 20 6d zLabel = m 3050: 70 72 69 6e 74 66 28 22 73 6b 69 6e 73 2f 25 73 printf("skins/%s 3060: 2f 25 73 2e 74 78 74 22 2c 20 7a 4e 61 6d 65 2c /%s.txt", zName, 3070: 20 61 7a 53 6b 69 6e 46 69 6c 65 5b 69 5d 29 3b azSkinFile[i]); 3080: 0a 20 20 20 20 20 20 7a 20 3d 20 62 75 69 6c 74 . z = built 3090: 69 6e 5f 74 65 78 74 28 7a 4c 61 62 65 6c 29 3b in_text(zLabel); 30a0: 0a 20 20 20 20 20 20 66 6f 73 73 69 6c 5f 66 72 . fossil_fr 30b0: 65 65 28 7a 4c 61 62 65 6c 29 3b 0a 20 20 20 20 ee(zLabel);. 30c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 20 3d }else{. z = 30d0: 20 64 62 5f 67 65 74 28 61 7a 53 6b 69 6e 46 69 db_get(azSkinFi 30e0: 6c 65 5b 69 5d 2c 20 30 29 3b 0a 20 20 20 20 20 le[i], 0);. 30f0: 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 if( z==0 ){. 3100: 20 20 20 20 20 7a 4c 61 62 65 6c 20 3d 20 6d 70 zLabel = mp 3110: 72 69 6e 74 66 28 22 73 6b 69 6e 73 2f 64 65 66 rintf("skins/def 3120: 61 75 6c 74 2f 25 73 2e 74 78 74 22 2c 20 61 7a ault/%s.txt", az 3130: 53 6b 69 6e 46 69 6c 65 5b 69 5d 29 3b 0a 20 20 SkinFile[i]);. 3140: 20 20 20 20 20 20 7a 20 3d 20 62 75 69 6c 74 69 z = builti 3150: 6e 5f 74 65 78 74 28 7a 4c 61 62 65 6c 29 3b 0a n_text(zLabel);. 3160: 20 20 20 20 20 20 20 20 66 6f 73 73 69 6c 5f 66 fossil_f 3170: 72 65 65 28 7a 4c 61 62 65 6c 29 3b 0a 20 20 20 ree(zLabel);. 3180: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 64 }. }. d 3190: 62 5f 75 6e 70 72 6f 74 65 63 74 28 50 52 4f 54 b_unprotect(PROT 31a0: 45 43 54 5f 43 4f 4e 46 49 47 29 3b 0a 20 20 20 ECT_CONFIG);. 31b0: 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 76 blob_appendf(&v 31c0: 61 6c 2c 0a 20 20 20 20 20 20 20 22 52 45 50 4c al,. "REPL 31d0: 41 43 45 20 49 4e 54 4f 20 63 6f 6e 66 69 67 28 ACE INTO config( 31e0: 6e 61 6d 65 2c 76 61 6c 75 65 2c 6d 74 69 6d 65 name,value,mtime 31f0: 29 20 56 41 4c 55 45 53 28 25 51 2c 25 51 2c 6e ) VALUES(%Q,%Q,n 3200: 6f 77 28 29 29 3b 5c 6e 22 2c 0a 20 20 20 20 20 ow());\n",. 3210: 20 20 61 7a 53 6b 69 6e 46 69 6c 65 5b 69 5d 2c azSkinFile[i], 3220: 20 7a 0a 20 20 20 20 29 3b 0a 20 20 20 20 64 62 z. );. db 3230: 5f 70 72 6f 74 65 63 74 5f 70 6f 70 28 29 3b 0a _protect_pop();. 3240: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 62 6c 6f }. return blo 3250: 62 5f 73 74 72 28 26 76 61 6c 29 3b 0a 7d 0a 0a b_str(&val);.}.. 3260: 2f 2a 0a 2a 2a 20 52 65 73 70 6f 6e 64 20 74 6f /*.** Respond to 3270: 20 61 20 52 65 6e 61 6d 65 20 62 75 74 74 6f 6e a Rename button 3280: 20 70 72 65 73 73 2e 20 20 52 65 74 75 72 6e 20 press. Return 3290: 54 52 55 45 20 69 66 20 61 20 64 69 61 6c 6f 67 TRUE if a dialog 32a0: 20 77 61 73 20 70 61 69 6e 74 65 64 2e 0a 2a 2a was painted..** 32b0: 20 52 65 74 75 72 6e 20 46 41 4c 53 45 20 74 6f Return FALSE to 32c0: 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 74 continue with t 32d0: 68 65 20 6d 61 69 6e 20 53 6b 69 6e 73 20 70 61 he main Skins pa 32e0: 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e ge..*/.static in 32f0: 74 20 73 6b 69 6e 52 65 6e 61 6d 65 28 76 6f 69 t skinRename(voi 3300: 64 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 d){. const char 3310: 20 2a 7a 4f 6c 64 4e 61 6d 65 3b 0a 20 20 63 6f *zOldName;. co 3320: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 65 77 4e 61 nst char *zNewNa 3330: 6d 65 3b 0a 20 20 69 6e 74 20 65 78 20 3d 20 30 me;. int ex = 0 3340: 3b 0a 20 20 69 66 28 20 50 28 22 72 65 6e 61 6d ;. if( P("renam 3350: 65 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 e")==0 ) return 3360: 30 3b 0a 20 20 7a 4f 6c 64 4e 61 6d 65 20 3d 20 0;. zOldName = 3370: 50 28 22 73 6e 22 29 3b 0a 20 20 7a 4e 65 77 4e P("sn");. zNewN 3380: 61 6d 65 20 3d 20 50 28 22 6e 65 77 6e 61 6d 65 ame = P("newname 3390: 22 29 3b 0a 20 20 69 66 28 20 7a 4f 6c 64 4e 61 ");. if( zOldNa 33a0: 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 me==0 ) return 0 33b0: 3b 0a 20 20 69 66 28 20 7a 4e 65 77 4e 61 6d 65 ;. if( zNewName 33c0: 3d 3d 30 20 7c 7c 20 7a 4e 65 77 4e 61 6d 65 5b ==0 || zNewName[ 33d0: 30 5d 3d 3d 30 20 7c 7c 20 28 65 78 20 3d 20 73 0]==0 || (ex = s 33e0: 6b 69 6e 45 78 69 73 74 73 28 7a 4e 65 77 4e 61 kinExists(zNewNa 33f0: 6d 65 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 me))!=0 ){. i 3400: 66 28 20 7a 4e 65 77 4e 61 6d 65 3d 3d 30 20 29 f( zNewName==0 ) 3410: 20 7a 4e 65 77 4e 61 6d 65 20 3d 20 7a 4f 6c 64 zNewName = zOld 3420: 4e 61 6d 65 3b 0a 20 20 20 20 73 74 79 6c 65 5f Name;. style_ 3430: 73 65 74 5f 63 75 72 72 65 6e 74 5f 66 65 61 74 set_current_feat 3440: 75 72 65 28 22 73 6b 69 6e 73 22 29 3b 0a 20 20 ure("skins");. 3450: 20 20 73 74 79 6c 65 5f 68 65 61 64 65 72 28 22 style_header(" 3460: 52 65 6e 61 6d 65 20 41 20 53 6b 69 6e 22 29 3b Rename A Skin"); 3470: 0a 20 20 20 20 69 66 28 20 65 78 20 29 7b 0a 20 . if( ex ){. 3480: 20 20 20 20 20 40 20 3c 70 3e 3c 73 70 61 6e 20 @ <p><span 3490: 63 6c 61 73 73 3d 22 67 65 6e 65 72 61 6c 45 72 class="generalEr 34a0: 72 6f 72 22 3e 54 68 65 72 65 20 69 73 20 61 6c ror">There is al 34b0: 72 65 61 64 79 20 61 6e 6f 74 68 65 72 20 73 6b ready another sk 34c0: 69 6e 0a 20 20 20 20 20 20 40 20 6e 61 6d 65 64 in. @ named 34d0: 20 22 25 68 28 7a 4e 65 77 4e 61 6d 65 29 22 2e "%h(zNewName)". 34e0: 20 20 43 68 6f 6f 73 65 20 61 20 64 69 66 66 65 Choose a diffe 34f0: 72 65 6e 74 20 6e 61 6d 65 2e 3c 2f 73 70 61 6e rent name.</span 3500: 3e 3c 2f 70 3e 0a 20 20 20 20 7d 0a 20 20 20 20 ></p>. }. 3510: 40 20 3c 66 6f 72 6d 20 61 63 74 69 6f 6e 3d 22 @ <form action=" 3520: 25 52 2f 73 65 74 75 70 5f 73 6b 69 6e 5f 61 64 %R/setup_skin_ad 3530: 6d 69 6e 22 20 6d 65 74 68 6f 64 3d 22 70 6f 73 min" method="pos 3540: 74 22 3e 3c 64 69 76 3e 0a 20 20 20 20 40 20 3c t"><div>. @ < 3550: 74 61 62 6c 65 20 62 6f 72 64 65 72 3d 22 30 22 table border="0" 3560: 3e 3c 74 72 3e 0a 20 20 20 20 40 20 3c 74 72 3e ><tr>. @ <tr> 3570: 3c 74 64 20 61 6c 69 67 6e 3d 22 72 69 67 68 74 <td align="right 3580: 22 3e 43 75 72 72 65 6e 74 20 6e 61 6d 65 3a 3c ">Current name:< 3590: 74 64 20 61 6c 69 67 6e 3d 22 6c 65 66 74 22 3e td align="left"> 35a0: 3c 62 3e 25 68 28 7a 4f 6c 64 4e 61 6d 65 29 3c <b>%h(zOldName)< 35b0: 2f 62 3e 0a 20 20 20 20 40 20 3c 74 72 3e 3c 74 /b>. @ <tr><t 35c0: 64 20 61 6c 69 67 6e 3d 22 72 69 67 68 74 22 3e d align="right"> 35d0: 4e 65 77 20 6e 61 6d 65 3a 3c 74 64 20 61 6c 69 New name:<td ali 35e0: 67 6e 3d 22 6c 65 66 74 22 3e 0a 20 20 20 20 40 gn="left">. @ 35f0: 20 3c 69 6e 70 75 74 20 74 79 70 65 3d 22 74 65 <input type="te 3600: 78 74 22 20 73 69 7a 65 3d 22 33 35 22 20 6e 61 xt" size="35" na 3610: 6d 65 3d 22 6e 65 77 6e 61 6d 65 22 20 76 61 6c me="newname" val 3620: 75 65 3d 22 25 68 28 7a 4e 65 77 4e 61 6d 65 29 ue="%h(zNewName) 3630: 22 3e 0a 20 20 20 20 40 20 3c 74 72 3e 3c 74 64 ">. @ <tr><td 3640: 3e 3c 74 64 3e 0a 20 20 20 20 40 20 3c 69 6e 70 ><td>. @ <inp 3650: 75 74 20 74 79 70 65 3d 22 68 69 64 64 65 6e 22 ut type="hidden" 3660: 20 6e 61 6d 65 3d 22 73 6e 22 20 76 61 6c 75 65 name="sn" value 3670: 3d 22 25 68 28 7a 4f 6c 64 4e 61 6d 65 29 22 3e ="%h(zOldName)"> 3680: 0a 20 20 20 20 40 20 3c 69 6e 70 75 74 20 74 79 . @ <input ty 3690: 70 65 3d 22 73 75 62 6d 69 74 22 20 6e 61 6d 65 pe="submit" name 36a0: 3d 22 72 65 6e 61 6d 65 22 20 76 61 6c 75 65 3d ="rename" value= 36b0: 22 52 65 6e 61 6d 65 22 3e 0a 20 20 20 20 40 20 "Rename">. @ 36c0: 3c 69 6e 70 75 74 20 74 79 70 65 3d 22 73 75 62 <input type="sub 36d0: 6d 69 74 22 20 6e 61 6d 65 3d 22 63 61 6e 72 65 mit" name="canre 36e0: 6e 22 20 76 61 6c 75 65 3d 22 43 61 6e 63 65 6c n" value="Cancel 36f0: 22 3e 0a 20 20 20 20 40 20 3c 2f 74 61 62 6c 65 ">. @ </table 3700: 3e 0a 20 20 20 20 6c 6f 67 69 6e 5f 69 6e 73 65 >. login_inse 3710: 72 74 5f 63 73 72 66 5f 73 65 63 72 65 74 28 29 rt_csrf_secret() 3720: 3b 0a 20 20 20 20 40 20 3c 2f 64 69 76 3e 3c 2f ;. @ </div></ 3730: 66 6f 72 6d 3e 0a 20 20 20 20 73 74 79 6c 65 5f form>. style_ 3740: 66 69 6e 69 73 68 5f 70 61 67 65 28 29 3b 0a 20 finish_page();. 3750: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d return 1;. } 3760: 0a 20 20 64 62 5f 75 6e 70 72 6f 74 65 63 74 28 . db_unprotect( 3770: 50 52 4f 54 45 43 54 5f 43 4f 4e 46 49 47 29 3b PROTECT_CONFIG); 3780: 0a 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63 . db_multi_exec 3790: 28 0a 20 20 20 20 22 55 50 44 41 54 45 20 63 6f (. "UPDATE co 37a0: 6e 66 69 67 20 53 45 54 20 6e 61 6d 65 3d 27 73 nfig SET name='s 37b0: 6b 69 6e 3a 25 71 27 20 57 48 45 52 45 20 6e 61 kin:%q' WHERE na 37c0: 6d 65 3d 27 73 6b 69 6e 3a 25 71 27 3b 22 2c 0a me='skin:%q';",. 37d0: 20 20 20 20 7a 4e 65 77 4e 61 6d 65 2c 20 7a 4f zNewName, zO 37e0: 6c 64 4e 61 6d 65 0a 20 20 29 3b 0a 20 20 64 62 ldName. );. db 37f0: 5f 70 72 6f 74 65 63 74 5f 70 6f 70 28 29 3b 0a _protect_pop();. 3800: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f return 0;.}../ 3810: 2a 0a 2a 2a 20 52 65 73 70 6f 6e 64 20 74 6f 20 *.** Respond to 3820: 61 20 53 61 76 65 20 62 75 74 74 6f 6e 20 70 72 a Save button pr 3830: 65 73 73 2e 20 20 52 65 74 75 72 6e 20 54 52 55 ess. Return TRU 3840: 45 20 69 66 20 61 20 64 69 61 6c 6f 67 20 77 61 E if a dialog wa 3850: 73 20 70 61 69 6e 74 65 64 2e 0a 2a 2a 20 52 65 s painted..** Re 3860: 74 75 72 6e 20 46 41 4c 53 45 20 74 6f 20 63 6f turn FALSE to co 3870: 6e 74 69 6e 75 65 20 77 69 74 68 20 74 68 65 20 ntinue with the 3880: 6d 61 69 6e 20 53 6b 69 6e 73 20 70 61 67 65 2e main Skins page. 3890: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 .*/.static int s 38a0: 6b 69 6e 53 61 76 65 28 63 6f 6e 73 74 20 63 68 kinSave(const ch 38b0: 61 72 20 2a 7a 43 75 72 72 65 6e 74 29 7b 0a 20 ar *zCurrent){. 38c0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 65 const char *zNe 38d0: 77 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 65 78 20 wName;. int ex 38e0: 3d 20 30 3b 0a 20 20 69 66 28 20 50 28 22 73 61 = 0;. if( P("sa 38f0: 76 65 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e ve")==0 ) return 3900: 20 30 3b 0a 20 20 7a 4e 65 77 4e 61 6d 65 20 3d 0;. zNewName = 3910: 20 50 28 22 73 76 6e 61 6d 65 22 29 3b 0a 20 20 P("svname");. 3920: 69 66 28 20 7a 4e 65 77 4e 61 6d 65 20 26 26 20 if( zNewName && 3930: 7a 4e 65 77 4e 61 6d 65 5b 30 5d 21 3d 30 20 29 zNewName[0]!=0 ) 3940: 7b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 4e 65 77 {. }. if( zNew 3950: 4e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 4e 65 77 4e Name==0 || zNewN 3960: 61 6d 65 5b 30 5d 3d 3d 30 20 7c 7c 20 28 65 78 ame[0]==0 || (ex 3970: 20 3d 20 73 6b 69 6e 45 78 69 73 74 73 28 7a 4e = skinExists(zN 3980: 65 77 4e 61 6d 65 29 29 21 3d 30 20 29 7b 0a 20 ewName))!=0 ){. 3990: 20 20 20 69 66 28 20 7a 4e 65 77 4e 61 6d 65 3d if( zNewName= 39a0: 3d 30 20 29 20 7a 4e 65 77 4e 61 6d 65 20 3d 20 =0 ) zNewName = 39b0: 22 22 3b 0a 20 20 20 20 73 74 79 6c 65 5f 73 65 "";. style_se 39c0: 74 5f 63 75 72 72 65 6e 74 5f 66 65 61 74 75 72 t_current_featur 39d0: 65 28 22 73 6b 69 6e 73 22 29 3b 0a 20 20 20 20 e("skins");. 39e0: 73 74 79 6c 65 5f 68 65 61 64 65 72 28 22 53 61 style_header("Sa 39f0: 76 65 20 43 75 72 72 65 6e 74 20 53 6b 69 6e 22 ve Current Skin" 3a00: 29 3b 0a 20 20 20 20 69 66 28 20 65 78 20 29 7b );. if( ex ){ 3a10: 0a 20 20 20 20 20 20 40 20 3c 70 3e 3c 73 70 61 . @ <p><spa 3a20: 6e 20 63 6c 61 73 73 3d 22 67 65 6e 65 72 61 6c n class="general 3a30: 45 72 72 6f 72 22 3e 54 68 65 72 65 20 69 73 20 Error">There is 3a40: 61 6c 72 65 61 64 79 20 61 6e 6f 74 68 65 72 20 already another 3a50: 73 6b 69 6e 0a 20 20 20 20 20 20 40 20 6e 61 6d skin. @ nam 3a60: 65 64 20 22 25 68 28 7a 4e 65 77 4e 61 6d 65 29 ed "%h(zNewName) 3a70: 22 2e 20 20 43 68 6f 6f 73 65 20 61 20 64 69 66 ". Choose a dif 3a80: 66 65 72 65 6e 74 20 6e 61 6d 65 2e 3c 2f 73 70 ferent name.</sp 3a90: 61 6e 3e 3c 2f 70 3e 0a 20 20 20 20 7d 0a 20 20 an></p>. }. 3aa0: 20 20 40 20 3c 66 6f 72 6d 20 61 63 74 69 6f 6e @ <form action 3ab0: 3d 22 25 52 2f 73 65 74 75 70 5f 73 6b 69 6e 5f ="%R/setup_skin_ 3ac0: 61 64 6d 69 6e 22 20 6d 65 74 68 6f 64 3d 22 70 admin" method="p 3ad0: 6f 73 74 22 3e 3c 64 69 76 3e 0a 20 20 20 20 40 ost"><div>. @ 3ae0: 20 3c 74 61 62 6c 65 20 62 6f 72 64 65 72 3d 22 <table border=" 3af0: 30 22 3e 3c 74 72 3e 0a 20 20 20 20 40 20 3c 74 0"><tr>. @ <t 3b00: 72 3e 3c 74 64 20 61 6c 69 67 6e 3d 22 72 69 67 r><td align="rig 3b10: 68 74 22 3e 4e 61 6d 65 20 66 6f 72 20 74 68 69 ht">Name for thi 3b20: 73 20 73 6b 69 6e 3a 3c 74 64 20 61 6c 69 67 6e s skin:<td align 3b30: 3d 22 6c 65 66 74 22 3e 0a 20 20 20 20 40 20 3c ="left">. @ < 3b40: 69 6e 70 75 74 20 74 79 70 65 3d 22 74 65 78 74 input type="text 3b50: 22 20 73 69 7a 65 3d 22 33 35 22 20 6e 61 6d 65 " size="35" name 3b60: 3d 22 73 76 6e 61 6d 65 22 20 76 61 6c 75 65 3d ="svname" value= 3b70: 22 25 68 28 7a 4e 65 77 4e 61 6d 65 29 22 3e 0a "%h(zNewName)">. 3b80: 20 20 20 20 40 20 3c 74 72 3e 3c 74 64 3e 3c 74 @ <tr><td><t 3b90: 64 3e 0a 20 20 20 20 40 20 3c 69 6e 70 75 74 20 d>. @ <input 3ba0: 74 79 70 65 3d 22 73 75 62 6d 69 74 22 20 6e 61 type="submit" na 3bb0: 6d 65 3d 22 73 61 76 65 22 20 76 61 6c 75 65 3d me="save" value= 3bc0: 22 53 61 76 65 22 3e 0a 20 20 20 20 40 20 3c 69 "Save">. @ <i 3bd0: 6e 70 75 74 20 74 79 70 65 3d 22 73 75 62 6d 69 nput type="submi 3be0: 74 22 20 6e 61 6d 65 3d 22 63 61 6e 73 61 76 65 t" name="cansave 3bf0: 22 20 76 61 6c 75 65 3d 22 43 61 6e 63 65 6c 22 " value="Cancel" 3c00: 3e 0a 20 20 20 20 40 20 3c 2f 74 61 62 6c 65 3e >. @ </table> 3c10: 0a 20 20 20 20 6c 6f 67 69 6e 5f 69 6e 73 65 72 . login_inser 3c20: 74 5f 63 73 72 66 5f 73 65 63 72 65 74 28 29 3b t_csrf_secret(); 3c30: 0a 20 20 20 20 40 20 3c 2f 64 69 76 3e 3c 2f 66 . @ </div></f 3c40: 6f 72 6d 3e 0a 20 20 20 20 73 74 79 6c 65 5f 66 orm>. style_f 3c50: 69 6e 69 73 68 5f 70 61 67 65 28 29 3b 0a 20 20 inish_page();. 3c60: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a return 1;. }. 3c70: 20 20 64 62 5f 75 6e 70 72 6f 74 65 63 74 28 50 db_unprotect(P 3c80: 52 4f 54 45 43 54 5f 43 4f 4e 46 49 47 29 3b 0a ROTECT_CONFIG);. 3c90: 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28 db_multi_exec( 3ca0: 0a 20 20 20 20 22 49 4e 53 45 52 54 20 4f 52 20 . "INSERT OR 3cb0: 49 47 4e 4f 52 45 20 49 4e 54 4f 20 63 6f 6e 66 IGNORE INTO conf 3cc0: 69 67 28 6e 61 6d 65 2c 20 76 61 6c 75 65 2c 20 ig(name, value, 3cd0: 6d 74 69 6d 65 29 22 0a 20 20 20 20 22 56 41 4c mtime)". "VAL 3ce0: 55 45 53 28 27 73 6b 69 6e 3a 25 71 27 2c 25 51 UES('skin:%q',%Q 3cf0: 2c 6e 6f 77 28 29 29 22 2c 0a 20 20 20 20 7a 4e ,now())",. zN 3d00: 65 77 4e 61 6d 65 2c 20 7a 43 75 72 72 65 6e 74 ewName, zCurrent 3d10: 0a 20 20 29 3b 0a 20 20 64 62 5f 70 72 6f 74 65 . );. db_prote 3d20: 63 74 5f 70 6f 70 28 29 3b 0a 20 20 72 65 74 75 ct_pop();. retu 3d30: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 rn 0;.}../*.** W 3d40: 45 42 50 41 47 45 3a 20 73 65 74 75 70 5f 73 6b EBPAGE: setup_sk 3d50: 69 6e 5f 61 64 6d 69 6e 0a 2a 2a 0a 2a 2a 20 41 in_admin.**.** A 3d60: 64 6d 69 6e 69 73 74 72 61 74 69 76 65 20 61 63 dministrative ac 3d70: 74 69 6f 6e 73 20 6f 6e 20 73 6b 69 6e 73 2e 20 tions on skins. 3d80: 20 46 6f 72 20 61 64 6d 69 6e 69 73 74 72 61 74 For administrat 3d90: 6f 72 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69 ors only..*/.voi 3da0: 64 20 73 65 74 75 70 5f 73 6b 69 6e 5f 61 64 6d d setup_skin_adm 3db0: 69 6e 28 76 6f 69 64 29 7b 0a 20 20 63 6f 6e 73 in(void){. cons 3dc0: 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 63 68 61 t char *z;. cha 3dd0: 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 63 68 61 72 r *zName;. char 3de0: 20 2a 7a 45 72 72 20 3d 20 30 3b 0a 20 20 63 6f *zErr = 0;. co 3df0: 6e 73 74 20 63 68 61 72 20 2a 7a 43 75 72 72 65 nst char *zCurre 3e00: 6e 74 20 3d 20 30 3b 20 20 2f 2a 20 43 75 72 72 nt = 0; /* Curr 3e10: 65 6e 74 20 73 6b 69 6e 20 2a 2f 0a 20 20 69 6e ent skin */. in 3e20: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 t i; 3e30: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 /* Loop 3e40: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 53 74 counter */. St 3e50: 6d 74 20 71 3b 0a 20 20 69 6e 74 20 73 65 65 6e mt q;. int seen 3e60: 43 75 72 72 65 6e 74 20 3d 20 30 3b 0a 20 20 69 Current = 0;. i 3e70: 6e 74 20 6f 6e 63 65 3b 0a 0a 20 20 6c 6f 67 69 nt once;.. logi 3e80: 6e 5f 63 68 65 63 6b 5f 63 72 65 64 65 6e 74 69 n_check_credenti 3e90: 61 6c 73 28 29 3b 0a 20 20 69 66 28 20 21 67 2e als();. if( !g. 3ea0: 70 65 72 6d 2e 41 64 6d 69 6e 20 29 7b 0a 20 20 perm.Admin ){. 3eb0: 20 20 6c 6f 67 69 6e 5f 6e 65 65 64 65 64 28 30 login_needed(0 3ec0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 );. return;. 3ed0: 20 7d 0a 20 20 64 62 5f 62 65 67 69 6e 5f 74 72 }. db_begin_tr 3ee0: 61 6e 73 61 63 74 69 6f 6e 28 29 3b 0a 20 20 7a ansaction();. z 3ef0: 43 75 72 72 65 6e 74 20 3d 20 67 65 74 53 6b 69 Current = getSki 3f00: 6e 28 30 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b n(0);. for(i=0; 3f10: 20 69 3c 63 6f 75 6e 74 28 61 42 75 69 6c 74 69 i<count(aBuilti 3f20: 6e 53 6b 69 6e 29 3b 20 69 2b 2b 29 7b 0a 20 20 nSkin); i++){. 3f30: 20 20 61 42 75 69 6c 74 69 6e 53 6b 69 6e 5b 69 aBuiltinSkin[i 3f40: 5d 2e 7a 53 51 4c 20 3d 20 67 65 74 53 6b 69 6e ].zSQL = getSkin 3f50: 28 61 42 75 69 6c 74 69 6e 53 6b 69 6e 5b 69 5d (aBuiltinSkin[i] 3f60: 2e 7a 4c 61 62 65 6c 29 3b 0a 20 20 7d 0a 0a 20 .zLabel);. }.. 3f70: 20 73 74 79 6c 65 5f 73 65 74 5f 63 75 72 72 65 style_set_curre 3f80: 6e 74 5f 66 65 61 74 75 72 65 28 22 73 6b 69 6e nt_feature("skin 3f90: 73 22 29 3b 0a 0a 20 20 69 66 28 20 63 67 69 5f s");.. if( cgi_ 3fa0: 63 73 72 66 5f 73 61 66 65 28 32 29 20 29 7b 0a csrf_safe(2) ){. 3fb0: 20 20 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 72 /* Process r 3fc0: 65 71 75 65 73 74 73 20 74 6f 20 64 65 6c 65 74 equests to delet 3fd0: 65 20 61 20 75 73 65 72 2d 64 65 66 69 6e 65 64 e a user-defined 3fe0: 20 73 6b 69 6e 20 2a 2f 0a 20 20 20 20 69 66 28 skin */. if( 3ff0: 20 50 28 22 64 65 6c 31 22 29 20 26 26 20 28 7a P("del1") && (z 4000: 4e 61 6d 65 20 3d 20 73 6b 69 6e 56 61 72 4e 61 Name = skinVarNa 4010: 6d 65 28 50 28 22 73 6e 22 29 2c 20 31 29 29 21 me(P("sn"), 1))! 4020: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 74 79 6c =0 ){. styl 4030: 65 5f 68 65 61 64 65 72 28 22 43 6f 6e 66 69 72 e_header("Confir 4040: 6d 20 43 75 73 74 6f 6d 20 53 6b 69 6e 20 44 65 m Custom Skin De 4050: 6c 65 74 65 22 29 3b 0a 20 20 20 20 20 20 40 20 lete");. @ 4060: 3c 66 6f 72 6d 20 61 63 74 69 6f 6e 3d 22 25 52 <form action="%R 4070: 2f 73 65 74 75 70 5f 73 6b 69 6e 5f 61 64 6d 69 /setup_skin_admi 4080: 6e 22 20 6d 65 74 68 6f 64 3d 22 70 6f 73 74 22 n" method="post" 4090: 3e 3c 64 69 76 3e 0a 20 20 20 20 20 20 40 20 3c ><div>. @ < 40a0: 70 3e 44 65 6c 65 74 69 6f 6e 20 6f 66 20 61 20 p>Deletion of a 40b0: 63 75 73 74 6f 6d 20 73 6b 69 6e 20 69 73 20 61 custom skin is a 40c0: 20 70 65 72 6d 61 6e 65 6e 74 20 61 63 74 69 6f permanent actio 40d0: 6e 20 74 68 61 74 20 63 61 6e 6e 6f 74 0a 20 20 n that cannot. 40e0: 20 20 20 20 40 20 62 65 20 75 6e 64 6f 6e 65 2e @ be undone. 40f0: 20 20 50 6c 65 61 73 65 20 63 6f 6e 66 69 72 6d Please confirm 4100: 20 74 68 61 74 20 74 68 69 73 20 69 73 20 77 68 that this is wh 4110: 61 74 20 79 6f 75 20 77 61 6e 74 20 74 6f 20 64 at you want to d 4120: 6f 3a 3c 2f 70 3e 0a 20 20 20 20 20 20 40 20 3c o:</p>. @ < 4130: 69 6e 70 75 74 20 74 79 70 65 3d 22 68 69 64 64 input type="hidd 4140: 65 6e 22 20 6e 61 6d 65 3d 22 73 6e 22 20 76 61 en" name="sn" va 4150: 6c 75 65 3d 22 25 68 28 50 28 22 73 6e 22 29 29 lue="%h(P("sn")) 4160: 22 3e 0a 20 20 20 20 20 20 40 20 3c 69 6e 70 75 ">. @ <inpu 4170: 74 20 74 79 70 65 3d 22 73 75 62 6d 69 74 22 20 t type="submit" 4180: 6e 61 6d 65 3d 22 64 65 6c 32 22 20 76 61 6c 75 name="del2" valu 4190: 65 3d 22 43 6f 6e 66 69 72 6d 20 2d 20 44 65 6c e="Confirm - Del 41a0: 65 74 65 20 54 68 65 20 53 6b 69 6e 22 3e 0a 20 ete The Skin">. 41b0: 20 20 20 20 20 40 20 3c 69 6e 70 75 74 20 74 79 @ <input ty 41c0: 70 65 3d 22 73 75 62 6d 69 74 22 20 6e 61 6d 65 pe="submit" name 41d0: 3d 22 63 61 6e 63 65 6c 22 20 76 61 6c 75 65 3d ="cancel" value= 41e0: 22 43 61 6e 63 65 6c 20 2d 20 44 6f 20 4e 6f 74 "Cancel - Do Not 41f0: 20 44 65 6c 65 74 65 22 3e 0a 20 20 20 20 20 20 Delete">. 4200: 6c 6f 67 69 6e 5f 69 6e 73 65 72 74 5f 63 73 72 login_insert_csr 4210: 66 5f 73 65 63 72 65 74 28 29 3b 0a 20 20 20 20 f_secret();. 4220: 20 20 40 20 3c 2f 64 69 76 3e 3c 2f 66 6f 72 6d @ </div></form 4230: 3e 0a 20 20 20 20 20 20 73 74 79 6c 65 5f 66 69 >. style_fi 4240: 6e 69 73 68 5f 70 61 67 65 28 29 3b 0a 20 20 20 nish_page();. 4250: 20 20 20 64 62 5f 65 6e 64 5f 74 72 61 6e 73 61 db_end_transa 4260: 63 74 69 6f 6e 28 31 29 3b 0a 20 20 20 20 20 20 ction(1);. 4270: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 return;. }. 4280: 20 20 69 66 28 20 50 28 22 64 65 6c 32 22 29 21 if( P("del2")! 4290: 3d 30 20 26 26 20 28 7a 4e 61 6d 65 20 3d 20 73 =0 && (zName = s 42a0: 6b 69 6e 56 61 72 4e 61 6d 65 28 50 28 22 73 6e kinVarName(P("sn 42b0: 22 29 2c 20 31 29 29 21 3d 30 20 29 7b 0a 20 20 "), 1))!=0 ){. 42c0: 20 20 20 20 64 62 5f 75 6e 70 72 6f 74 65 63 74 db_unprotect 42d0: 28 50 52 4f 54 45 43 54 5f 43 4f 4e 46 49 47 29 (PROTECT_CONFIG) 42e0: 3b 0a 20 20 20 20 20 20 64 62 5f 6d 75 6c 74 69 ;. db_multi 42f0: 5f 65 78 65 63 28 22 44 45 4c 45 54 45 20 46 52 _exec("DELETE FR 4300: 4f 4d 20 63 6f 6e 66 69 67 20 57 48 45 52 45 20 OM config WHERE 4310: 6e 61 6d 65 3d 25 51 22 2c 20 7a 4e 61 6d 65 29 name=%Q", zName) 4320: 3b 0a 20 20 20 20 20 20 64 62 5f 70 72 6f 74 65 ;. db_prote 4330: 63 74 5f 70 6f 70 28 29 3b 0a 20 20 20 20 7d 0a ct_pop();. }. 4340: 20 20 20 20 69 66 28 20 50 28 22 64 72 61 66 74 if( P("draft 4350: 64 65 6c 22 29 21 3d 30 20 29 7b 0a 20 20 20 20 del")!=0 ){. 4360: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 const char *zD 4370: 72 61 66 74 20 3d 20 50 28 22 6e 61 6d 65 22 29 raft = P("name") 4380: 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 ;. if( sqli 4390: 74 65 33 5f 73 74 72 67 6c 6f 62 28 22 64 72 61 te3_strglob("dra 43a0: 66 74 5b 31 2d 39 5d 22 2c 7a 44 72 61 66 74 29 ft[1-9]",zDraft) 43b0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 64 ==0 ){. d 43c0: 62 5f 75 6e 70 72 6f 74 65 63 74 28 50 52 4f 54 b_unprotect(PROT 43d0: 45 43 54 5f 43 4f 4e 46 49 47 29 3b 0a 20 20 20 ECT_CONFIG);. 43e0: 20 20 20 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78 db_multi_ex 43f0: 65 63 28 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 ec("DELETE FROM 4400: 63 6f 6e 66 69 67 20 57 48 45 52 45 20 6e 61 6d config WHERE nam 4410: 65 20 47 4c 4f 42 20 27 25 71 2d 2a 27 22 2c 20 e GLOB '%q-*'", 4420: 7a 44 72 61 66 74 29 3b 0a 20 20 20 20 20 20 20 zDraft);. 4430: 20 64 62 5f 70 72 6f 74 65 63 74 5f 70 6f 70 28 db_protect_pop( 4440: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d );. }. } 4450: 0a 20 20 20 20 69 66 28 20 73 6b 69 6e 52 65 6e . if( skinRen 4460: 61 6d 65 28 29 20 7c 7c 20 73 6b 69 6e 53 61 76 ame() || skinSav 4470: 65 28 7a 43 75 72 72 65 6e 74 29 20 29 7b 0a 20 e(zCurrent) ){. 4480: 20 20 20 20 20 64 62 5f 65 6e 64 5f 74 72 61 6e db_end_tran 4490: 73 61 63 74 69 6f 6e 28 30 29 3b 0a 20 20 20 20 saction(0);. 44a0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a return;. }. 44b0: 0a 20 20 20 20 2f 2a 20 54 68 65 20 75 73 65 72 . /* The user 44c0: 20 70 72 65 73 73 65 64 20 6f 6e 65 20 6f 66 20 pressed one of 44d0: 74 68 65 20 22 49 6e 73 74 61 6c 6c 22 20 62 75 the "Install" bu 44e0: 74 74 6f 6e 73 2e 20 2a 2f 0a 20 20 20 20 69 66 ttons. */. if 44f0: 28 20 50 28 22 6c 6f 61 64 22 29 20 26 26 20 28 ( P("load") && ( 4500: 7a 20 3d 20 50 28 22 73 6e 22 29 29 21 3d 30 20 z = P("sn"))!=0 4510: 26 26 20 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20 && z[0] ){. 4520: 20 69 6e 74 20 73 65 65 6e 20 3d 20 30 3b 0a 0a int seen = 0;.. 4530: 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 /* Check t 4540: 6f 20 73 65 65 20 69 66 20 74 68 65 20 63 75 72 o see if the cur 4550: 72 65 6e 74 20 73 6b 69 6e 20 69 73 20 61 6c 72 rent skin is alr 4560: 65 61 64 79 20 73 61 76 65 64 2e 20 20 49 66 20 eady saved. If 4570: 69 74 20 69 73 2c 20 74 68 65 72 65 0a 20 20 20 it is, there. 4580: 20 20 20 2a 2a 20 69 73 20 6e 6f 20 6e 65 65 64 ** is no need 4590: 20 74 6f 20 63 72 65 61 74 65 20 61 20 62 61 63 to create a bac 45a0: 6b 75 70 20 2a 2f 0a 20 20 20 20 20 20 7a 43 75 kup */. zCu 45b0: 72 72 65 6e 74 20 3d 20 67 65 74 53 6b 69 6e 28 rrent = getSkin( 45c0: 30 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 0);. for(i= 45d0: 30 3b 20 69 3c 63 6f 75 6e 74 28 61 42 75 69 6c 0; i<count(aBuil 45e0: 74 69 6e 53 6b 69 6e 29 3b 20 69 2b 2b 29 7b 0a tinSkin); i++){. 45f0: 20 20 20 20 20 20 20 20 69 66 28 20 66 6f 73 73 if( foss 4600: 69 6c 5f 73 74 72 63 6d 70 28 61 42 75 69 6c 74 il_strcmp(aBuilt 4610: 69 6e 53 6b 69 6e 5b 69 5d 2e 7a 53 51 4c 2c 20 inSkin[i].zSQL, 4620: 7a 43 75 72 72 65 6e 74 29 3d 3d 30 20 29 7b 0a zCurrent)==0 ){. 4630: 20 20 20 20 20 20 20 20 20 20 73 65 65 6e 20 3d seen = 4640: 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 1;. br 4650: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 eak;. }. 4660: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 }. if( 4670: 20 21 73 65 65 6e 20 29 7b 0a 20 20 20 20 20 20 !seen ){. 4680: 20 20 73 65 65 6e 20 3d 20 64 62 5f 65 78 69 73 seen = db_exis 4690: 74 73 28 22 53 45 4c 45 43 54 20 31 20 46 52 4f ts("SELECT 1 FRO 46a0: 4d 20 63 6f 6e 66 69 67 20 57 48 45 52 45 20 6e M config WHERE n 46b0: 61 6d 65 20 47 4c 4f 42 20 27 73 6b 69 6e 3a 2a ame GLOB 'skin:* 46c0: 27 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 '". 46d0: 20 20 20 20 20 20 20 20 20 20 20 20 22 20 41 4e " AN 46e0: 44 20 76 61 6c 75 65 3d 25 51 22 2c 20 7a 43 75 D value=%Q", zCu 46f0: 72 72 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 rrent);. 4700: 69 66 28 20 21 73 65 65 6e 20 29 7b 0a 20 20 20 if( !seen ){. 4710: 20 20 20 20 20 20 20 64 62 5f 75 6e 70 72 6f 74 db_unprot 4720: 65 63 74 28 50 52 4f 54 45 43 54 5f 43 4f 4e 46 ect(PROTECT_CONF 4730: 49 47 29 3b 0a 20 20 20 20 20 20 20 20 20 20 64 IG);. d 4740: 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28 0a 20 20 b_multi_exec(. 4750: 20 20 20 20 20 20 20 20 20 20 22 49 4e 53 45 52 "INSER 4760: 54 20 49 4e 54 4f 20 63 6f 6e 66 69 67 28 6e 61 T INTO config(na 4770: 6d 65 2c 76 61 6c 75 65 2c 6d 74 69 6d 65 29 20 me,value,mtime) 4780: 56 41 4c 55 45 53 28 22 0a 20 20 20 20 20 20 20 VALUES(". 4790: 20 20 20 20 20 22 20 20 73 74 72 66 74 69 6d 65 " strftime 47a0: 28 27 73 6b 69 6e 3a 42 61 63 6b 75 70 20 4f 6e ('skin:Backup On 47b0: 20 25 25 59 2d 25 25 6d 2d 25 25 64 20 25 25 48 %%Y-%%m-%%d %%H 47c0: 3a 25 25 4d 3a 25 25 53 27 29 2c 22 0a 20 20 20 :%%M:%%S'),". 47d0: 20 20 20 20 20 20 20 20 20 22 20 20 25 51 2c 6e " %Q,n 47e0: 6f 77 28 29 29 22 2c 20 7a 43 75 72 72 65 6e 74 ow())", zCurrent 47f0: 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 . );. 4800: 20 20 20 20 20 20 20 20 64 62 5f 70 72 6f 74 65 db_prote 4810: 63 74 5f 70 6f 70 28 29 3b 0a 20 20 20 20 20 20 ct_pop();. 4820: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 }. }. 4830: 20 20 73 65 65 6e 20 3d 20 30 3b 0a 20 20 20 20 seen = 0;. 4840: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 63 6f 75 for(i=0; i<cou 4850: 6e 74 28 61 42 75 69 6c 74 69 6e 53 6b 69 6e 29 nt(aBuiltinSkin) 4860: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 ; i++){. 4870: 69 66 28 20 66 6f 73 73 69 6c 5f 73 74 72 63 6d if( fossil_strcm 4880: 70 28 61 42 75 69 6c 74 69 6e 53 6b 69 6e 5b 69 p(aBuiltinSkin[i 4890: 5d 2e 7a 44 65 73 63 2c 20 7a 29 3d 3d 30 20 29 ].zDesc, z)==0 ) 48a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 65 65 6e {. seen 48b0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 = 1;. 48c0: 7a 43 75 72 72 65 6e 74 20 3d 20 61 42 75 69 6c zCurrent = aBuil 48d0: 74 69 6e 53 6b 69 6e 5b 69 5d 2e 7a 53 51 4c 3b tinSkin[i].zSQL; 48e0: 0a 20 20 20 20 20 20 20 20 20 20 64 62 5f 75 6e . db_un 48f0: 70 72 6f 74 65 63 74 28 50 52 4f 54 45 43 54 5f protect(PROTECT_ 4900: 43 4f 4e 46 49 47 29 3b 0a 20 20 20 20 20 20 20 CONFIG);. 4910: 20 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63 db_multi_exec 4920: 28 22 25 73 22 2c 20 7a 43 75 72 72 65 6e 74 2f ("%s", zCurrent/ 4930: 2a 73 61 66 65 2d 66 6f 72 2d 25 73 2a 2f 29 3b *safe-for-%s*/); 4940: 0a 20 20 20 20 20 20 20 20 20 20 64 62 5f 70 72 . db_pr 4950: 6f 74 65 63 74 5f 70 6f 70 28 29 3b 0a 20 20 20 otect_pop();. 4960: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 break;. 4970: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a }. }. 4980: 20 20 20 20 20 20 69 66 28 20 21 73 65 65 6e 20 if( !seen 4990: 29 7b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 ){. zName 49a0: 20 3d 20 73 6b 69 6e 56 61 72 4e 61 6d 65 28 7a = skinVarName(z 49b0: 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 7a 43 75 ,0);. zCu 49c0: 72 72 65 6e 74 20 3d 20 64 62 5f 67 65 74 28 7a rrent = db_get(z 49d0: 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 Name, 0);. 49e0: 20 20 64 62 5f 75 6e 70 72 6f 74 65 63 74 28 50 db_unprotect(P 49f0: 52 4f 54 45 43 54 5f 43 4f 4e 46 49 47 29 3b 0a ROTECT_CONFIG);. 4a00: 20 20 20 20 20 20 20 20 64 62 5f 6d 75 6c 74 69 db_multi 4a10: 5f 65 78 65 63 28 22 25 73 22 2c 20 7a 43 75 72 _exec("%s", zCur 4a20: 72 65 6e 74 2f 2a 73 61 66 65 2d 66 6f 72 2d 25 rent/*safe-for-% 4a30: 73 2a 2f 29 3b 0a 20 20 20 20 20 20 20 20 64 62 s*/);. db 4a40: 5f 70 72 6f 74 65 63 74 5f 70 6f 70 28 29 3b 0a _protect_pop();. 4a50: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 }. }. 4a60: 7d 0a 0a 20 20 73 74 79 6c 65 5f 68 65 61 64 65 }.. style_heade 4a70: 72 28 22 53 6b 69 6e 73 22 29 3b 0a 20 20 69 66 r("Skins");. if 4a80: 28 20 7a 45 72 72 20 29 7b 0a 20 20 20 20 40 20 ( zErr ){. @ 4a90: 3c 70 20 73 74 79 6c 65 3d 22 63 6f 6c 6f 72 3a <p style="color: 4aa0: 72 65 64 22 3e 25 68 28 7a 45 72 72 29 3c 2f 70 red">%h(zErr)</p 4ab0: 3e 0a 20 20 7d 0a 20 20 40 20 3c 74 61 62 6c 65 >. }. @ <table 4ac0: 20 62 6f 72 64 65 72 3d 22 30 22 3e 0a 20 20 40 border="0">. @ 4ad0: 20 3c 74 72 3e 3c 74 64 20 63 6f 6c 73 70 61 6e <tr><td colspan 4ae0: 3d 34 3e 3c 68 32 3e 42 75 69 6c 74 2d 69 6e 20 =4><h2>Built-in 4af0: 53 6b 69 6e 73 3a 3c 2f 68 32 3e 3c 2f 74 64 3e Skins:</h2></td> 4b00: 3c 2f 74 68 3e 0a 20 20 66 6f 72 28 69 3d 30 3b </th>. for(i=0; 4b10: 20 69 3c 63 6f 75 6e 74 28 61 42 75 69 6c 74 69 i<count(aBuilti 4b20: 6e 53 6b 69 6e 29 3b 20 69 2b 2b 29 7b 0a 20 20 nSkin); i++){. 4b30: 20 20 7a 20 3d 20 61 42 75 69 6c 74 69 6e 53 6b z = aBuiltinSk 4b40: 69 6e 5b 69 5d 2e 7a 44 65 73 63 3b 0a 20 20 20 in[i].zDesc;. 4b50: 20 40 20 3c 74 72 3e 3c 74 64 3e 25 64 28 69 2b @ <tr><td>%d(i+ 4b60: 31 29 2e 3c 74 64 3e 25 68 28 7a 29 3c 74 64 3e 1).<td>%h(z)<td> 4b70: 26 6e 62 73 70 3b 26 6e 62 73 70 3b 3c 74 64 3e <td> 4b80: 0a 20 20 20 20 69 66 28 20 66 6f 73 73 69 6c 5f . if( fossil_ 4b90: 73 74 72 63 6d 70 28 61 42 75 69 6c 74 69 6e 53 strcmp(aBuiltinS 4ba0: 6b 69 6e 5b 69 5d 2e 7a 53 51 4c 2c 20 7a 43 75 kin[i].zSQL, zCu 4bb0: 72 72 65 6e 74 29 3d 3d 30 20 29 7b 0a 20 20 20 rrent)==0 ){. 4bc0: 20 20 20 40 20 28 43 75 72 72 65 6e 74 6c 79 20 @ (Currently 4bd0: 49 6e 20 55 73 65 29 0a 20 20 20 20 20 20 73 65 In Use). se 4be0: 65 6e 43 75 72 72 65 6e 74 20 3d 20 31 3b 0a 20 enCurrent = 1;. 4bf0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 }else{. 4c00: 40 20 3c 66 6f 72 6d 20 61 63 74 69 6f 6e 3d 22 @ <form action=" 4c10: 25 52 2f 73 65 74 75 70 5f 73 6b 69 6e 5f 61 64 %R/setup_skin_ad 4c20: 6d 69 6e 22 20 6d 65 74 68 6f 64 3d 22 70 6f 73 min" method="pos 4c30: 74 22 3e 0a 20 20 20 20 20 20 40 20 3c 69 6e 70 t">. @ <inp 4c40: 75 74 20 74 79 70 65 3d 22 68 69 64 64 65 6e 22 ut type="hidden" 4c50: 20 6e 61 6d 65 3d 22 73 6e 22 20 76 61 6c 75 65 name="sn" value 4c60: 3d 22 25 68 28 7a 29 22 3e 0a 20 20 20 20 20 20 ="%h(z)">. 4c70: 40 20 3c 69 6e 70 75 74 20 74 79 70 65 3d 22 73 @ <input type="s 4c80: 75 62 6d 69 74 22 20 6e 61 6d 65 3d 22 6c 6f 61 ubmit" name="loa 4c90: 64 22 20 76 61 6c 75 65 3d 22 49 6e 73 74 61 6c d" value="Instal 4ca0: 6c 22 3e 0a 20 20 20 20 20 20 6c 6f 67 69 6e 5f l">. login_ 4cb0: 69 6e 73 65 72 74 5f 63 73 72 66 5f 73 65 63 72 insert_csrf_secr 4cc0: 65 74 28 29 3b 0a 20 20 20 20 20 20 69 66 28 20 et();. if( 4cd0: 70 41 6c 74 53 6b 69 6e 3d 3d 26 61 42 75 69 6c pAltSkin==&aBuil 4ce0: 74 69 6e 53 6b 69 6e 5b 69 5d 20 29 7b 0a 20 20 tinSkin[i] ){. 4cf0: 20 20 20 20 20 20 40 20 28 43 75 72 72 65 6e 74 @ (Current 4d00: 20 6f 76 65 72 72 69 64 65 29 0a 20 20 20 20 20 override). 4d10: 20 7d 0a 20 20 20 20 20 20 40 20 3c 2f 66 6f 72 }. @ </for 4d20: 6d 3e 0a 20 20 20 20 7d 0a 20 20 20 20 40 20 3c m>. }. @ < 4d30: 2f 74 72 3e 0a 20 20 7d 0a 20 20 64 62 5f 70 72 /tr>. }. db_pr 4d40: 65 70 61 72 65 28 26 71 2c 0a 20 20 20 20 20 22 epare(&q,. " 4d50: 53 45 4c 45 43 54 20 73 75 62 73 74 72 28 6e 61 SELECT substr(na 4d60: 6d 65 2c 20 36 29 2c 20 76 61 6c 75 65 20 46 52 me, 6), value FR 4d70: 4f 4d 20 63 6f 6e 66 69 67 22 0a 20 20 20 20 20 OM config". 4d80: 22 20 57 48 45 52 45 20 6e 61 6d 65 20 47 4c 4f " WHERE name GLO 4d90: 42 20 27 73 6b 69 6e 3a 2a 27 22 0a 20 20 20 20 B 'skin:*'". 4da0: 20 22 20 4f 52 44 45 52 20 42 59 20 6e 61 6d 65 " ORDER BY name 4db0: 22 0a 20 20 29 3b 0a 20 20 6f 6e 63 65 20 3d 20 ". );. once = 4dc0: 31 3b 0a 20 20 77 68 69 6c 65 28 20 64 62 5f 73 1;. while( db_s 4dd0: 74 65 70 28 26 71 29 3d 3d 53 51 4c 49 54 45 5f tep(&q)==SQLITE_ 4de0: 52 4f 57 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 ROW ){. const 4df0: 20 63 68 61 72 20 2a 7a 4e 20 3d 20 64 62 5f 63 char *zN = db_c 4e00: 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71 2c 20 30 olumn_text(&q, 0 4e10: 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 );. const cha 4e20: 72 20 2a 7a 56 20 3d 20 64 62 5f 63 6f 6c 75 6d r *zV = db_colum 4e30: 6e 5f 74 65 78 74 28 26 71 2c 20 31 29 3b 0a 20 n_text(&q, 1);. 4e40: 20 20 20 69 2b 2b 3b 0a 20 20 20 20 69 66 28 20 i++;. if( 4e50: 6f 6e 63 65 20 29 7b 0a 20 20 20 20 20 20 6f 6e once ){. on 4e60: 63 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 40 20 ce = 0;. @ 4e70: 3c 74 72 3e 3c 74 64 20 63 6f 6c 73 70 61 6e 3d <tr><td colspan= 4e80: 34 3e 3c 68 32 3e 53 6b 69 6e 73 20 73 61 76 65 4><h2>Skins save 4e90: 64 20 61 73 20 22 73 6b 69 6e 3a 2a 27 20 65 6e d as "skin:*' en 4ea0: 74 72 69 65 73 20 5c 0a 20 20 20 20 20 20 40 20 tries \. @ 4eb0: 69 6e 20 74 68 65 20 43 4f 4e 46 49 47 20 74 61 in the CONFIG ta 4ec0: 62 6c 65 3a 3c 2f 68 32 3e 3c 2f 74 64 3e 3c 2f ble:</h2></td></ 4ed0: 74 72 3e 0a 20 20 20 20 7d 0a 20 20 20 20 40 20 tr>. }. @ 4ee0: 3c 74 72 3e 3c 74 64 3e 25 64 28 69 29 2e 3c 74 <tr><td>%d(i).<t 4ef0: 64 3e 25 68 28 7a 4e 29 3c 74 64 3e 26 6e 62 73 d>%h(zN)<td>&nbs 4f00: 70 3b 26 6e 62 73 70 3b 3c 74 64 3e 0a 20 20 20 p; <td>. 4f10: 20 40 20 3c 66 6f 72 6d 20 61 63 74 69 6f 6e 3d @ <form action= 4f20: 22 25 52 2f 73 65 74 75 70 5f 73 6b 69 6e 5f 61 "%R/setup_skin_a 4f30: 64 6d 69 6e 22 20 6d 65 74 68 6f 64 3d 22 70 6f dmin" method="po 4f40: 73 74 22 3e 0a 20 20 20 20 6c 6f 67 69 6e 5f 69 st">. login_i 4f50: 6e 73 65 72 74 5f 63 73 72 66 5f 73 65 63 72 65 nsert_csrf_secre 4f60: 74 28 29 3b 0a 20 20 20 20 69 66 28 20 66 6f 73 t();. if( fos 4f70: 73 69 6c 5f 73 74 72 63 6d 70 28 7a 56 2c 20 7a sil_strcmp(zV, z 4f80: 43 75 72 72 65 6e 74 29 3d 3d 30 20 29 7b 0a 20 Current)==0 ){. 4f90: 20 20 20 20 20 40 20 28 43 75 72 72 65 6e 74 6c @ (Currentl 4fa0: 79 20 49 6e 20 55 73 65 29 0a 20 20 20 20 20 20 y In Use). 4fb0: 73 65 65 6e 43 75 72 72 65 6e 74 20 3d 20 31 3b seenCurrent = 1; 4fc0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 . }else{. 4fd0: 20 20 40 20 3c 69 6e 70 75 74 20 74 79 70 65 3d @ <input type= 4fe0: 22 73 75 62 6d 69 74 22 20 6e 61 6d 65 3d 22 6c "submit" name="l 4ff0: 6f 61 64 22 20 76 61 6c 75 65 3d 22 49 6e 73 74 oad" value="Inst 5000: 61 6c 6c 22 3e 0a 20 20 20 20 20 20 40 20 3c 69 all">. @ <i 5010: 6e 70 75 74 20 74 79 70 65 3d 22 73 75 62 6d 69 nput type="submi 5020: 74 22 20 6e 61 6d 65 3d 22 64 65 6c 31 22 20 76 t" name="del1" v 5030: 61 6c 75 65 3d 22 44 65 6c 65 74 65 22 3e 0a 20 alue="Delete">. 5040: 20 20 20 7d 0a 20 20 20 20 40 20 3c 69 6e 70 75 }. @ <inpu 5050: 74 20 74 79 70 65 3d 22 73 75 62 6d 69 74 22 20 t type="submit" 5060: 6e 61 6d 65 3d 22 72 65 6e 61 6d 65 22 20 76 61 name="rename" va 5070: 6c 75 65 3d 22 52 65 6e 61 6d 65 22 3e 0a 20 20 lue="Rename">. 5080: 20 20 40 20 3c 69 6e 70 75 74 20 74 79 70 65 3d @ <input type= 5090: 22 68 69 64 64 65 6e 22 20 6e 61 6d 65 3d 22 73 "hidden" name="s 50a0: 6e 22 20 76 61 6c 75 65 3d 22 25 68 28 7a 4e 29 n" value="%h(zN) 50b0: 22 3e 0a 20 20 20 20 40 20 3c 2f 66 6f 72 6d 3e ">. @ </form> 50c0: 3c 2f 74 72 3e 0a 20 20 7d 0a 20 20 64 62 5f 66 </tr>. }. db_f 50d0: 69 6e 61 6c 69 7a 65 28 26 71 29 3b 0a 20 20 69 inalize(&q);. i 50e0: 66 28 20 21 73 65 65 6e 43 75 72 72 65 6e 74 20 f( !seenCurrent 50f0: 29 7b 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 ){. i++;. 5100: 40 20 3c 74 72 3e 3c 74 64 20 63 6f 6c 73 70 61 @ <tr><td colspa 5110: 6e 3d 34 3e 3c 68 32 3e 43 75 72 72 65 6e 74 20 n=4><h2>Current 5120: 73 6b 69 6e 20 69 6e 20 63 73 73 2f 68 65 61 64 skin in css/head 5130: 65 72 2f 66 6f 6f 74 65 72 2f 64 65 74 61 69 6c er/footer/detail 5140: 73 20 65 6e 74 72 69 65 73 20 5c 0a 20 20 20 20 s entries \. 5150: 40 20 69 6e 20 74 68 65 20 43 4f 4e 46 49 47 20 @ in the CONFIG 5160: 74 61 62 6c 65 3a 3c 2f 68 32 3e 3c 2f 74 64 3e table:</h2></td> 5170: 3c 2f 74 72 3e 0a 20 20 20 20 40 20 3c 74 72 3e </tr>. @ <tr> 5180: 3c 74 64 3e 25 64 28 69 29 2e 3c 74 64 3e 3c 69 <td>%d(i).<td><i 5190: 3e 43 75 72 72 65 6e 74 3c 2f 69 3e 3c 74 64 3e >Current</i><td> 51a0: 26 6e 62 73 70 3b 26 6e 62 73 70 3b 3c 74 64 3e <td> 51b0: 0a 20 20 20 20 40 20 3c 66 6f 72 6d 20 61 63 74 . @ <form act 51c0: 69 6f 6e 3d 22 25 52 2f 73 65 74 75 70 5f 73 6b ion="%R/setup_sk 51d0: 69 6e 5f 61 64 6d 69 6e 22 20 6d 65 74 68 6f 64 in_admin" method 51e0: 3d 22 70 6f 73 74 22 3e 0a 20 20 20 20 40 20 3c ="post">. @ < 51f0: 69 6e 70 75 74 20 74 79 70 65 3d 22 73 75 62 6d input type="subm 5200: 69 74 22 20 6e 61 6d 65 3d 22 73 61 76 65 22 20 it" name="save" 5210: 76 61 6c 75 65 3d 22 42 61 63 6b 75 70 22 3e 0a value="Backup">. 5220: 20 20 20 20 6c 6f 67 69 6e 5f 69 6e 73 65 72 74 login_insert 5230: 5f 63 73 72 66 5f 73 65 63 72 65 74 28 29 3b 0a _csrf_secret();. 5240: 20 20 20 20 40 20 3c 2f 66 6f 72 6d 3e 0a 20 20 @ </form>. 5250: 7d 0a 20 20 64 62 5f 70 72 65 70 61 72 65 28 26 }. db_prepare(& 5260: 71 2c 0a 20 20 20 20 20 22 53 45 4c 45 43 54 20 q,. "SELECT 5270: 44 49 53 54 49 4e 43 54 20 73 75 62 73 74 72 28 DISTINCT substr( 5280: 6e 61 6d 65 2c 20 31 2c 20 36 29 20 46 52 4f 4d name, 1, 6) FROM 5290: 20 63 6f 6e 66 69 67 22 0a 20 20 20 20 20 22 20 config". " 52a0: 57 48 45 52 45 20 6e 61 6d 65 20 47 4c 4f 42 20 WHERE name GLOB 52b0: 27 64 72 61 66 74 5b 31 2d 39 5d 2d 2a 27 22 0a 'draft[1-9]-*'". 52c0: 20 20 20 20 20 22 20 4f 52 44 45 52 20 42 59 20 " ORDER BY 52d0: 6e 61 6d 65 22 0a 20 20 29 3b 0a 20 20 6f 6e 63 name". );. onc 52e0: 65 20 3d 20 31 3b 0a 20 20 77 68 69 6c 65 28 20 e = 1;. while( 52f0: 64 62 5f 73 74 65 70 28 26 71 29 3d 3d 53 51 4c db_step(&q)==SQL 5300: 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 63 ITE_ROW ){. c 5310: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 20 3d 20 onst char *zN = 5320: 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 db_column_text(& 5330: 71 2c 20 30 29 3b 0a 20 20 20 20 69 2b 2b 3b 0a q, 0);. i++;. 5340: 20 20 20 20 69 66 28 20 6f 6e 63 65 20 29 7b 0a if( once ){. 5350: 20 20 20 20 20 20 6f 6e 63 65 20 3d 20 30 3b 0a once = 0;. 5360: 20 20 20 20 20 20 40 20 3c 74 72 3e 3c 74 64 20 @ <tr><td 5370: 63 6f 6c 73 70 61 6e 3d 34 3e 3c 68 32 3e 44 72 colspan=4><h2>Dr 5380: 61 66 74 20 73 6b 69 6e 73 20 73 74 6f 72 65 64 aft skins stored 5390: 20 61 73 20 22 64 72 61 66 74 5b 31 2d 39 5d 2d as "draft[1-9]- 53a0: 2a 27 20 65 6e 74 72 69 65 73 20 5c 0a 20 20 20 *' entries \. 53b0: 20 20 20 40 20 69 6e 20 74 68 65 20 43 4f 4e 46 @ in the CONF 53c0: 49 47 20 74 61 62 6c 65 3a 3c 2f 68 32 3e 3c 2f IG table:</h2></ 53d0: 74 64 3e 3c 2f 74 72 3e 0a 20 20 20 20 7d 0a 20 td></tr>. }. 53e0: 20 20 20 40 20 3c 74 72 3e 3c 74 64 3e 25 64 28 @ <tr><td>%d( 53f0: 69 29 2e 3c 74 64 3e 25 68 28 7a 4e 29 3c 74 64 i).<td>%h(zN)<td 5400: 3e 26 6e 62 73 70 3b 26 6e 62 73 70 3b 3c 74 64 > <td 5410: 3e 0a 20 20 20 20 40 20 3c 66 6f 72 6d 20 61 63 >. @ <form ac 5420: 74 69 6f 6e 3d 22 25 52 2f 73 65 74 75 70 5f 73 tion="%R/setup_s 5430: 6b 69 6e 5f 61 64 6d 69 6e 22 20 6d 65 74 68 6f kin_admin" metho 5440: 64 3d 22 70 6f 73 74 22 3e 0a 20 20 20 20 6c 6f d="post">. lo 5450: 67 69 6e 5f 69 6e 73 65 72 74 5f 63 73 72 66 5f gin_insert_csrf_ 5460: 73 65 63 72 65 74 28 29 3b 0a 20 20 20 20 40 20 secret();. @ 5470: 3c 69 6e 70 75 74 20 74 79 70 65 3d 22 73 75 62 <input type="sub 5480: 6d 69 74 22 20 6e 61 6d 65 3d 22 64 72 61 66 74 mit" name="draft 5490: 64 65 6c 22 20 76 61 6c 75 65 3d 22 44 65 6c 65 del" value="Dele 54a0: 74 65 22 3e 0a 20 20 20 20 40 20 3c 69 6e 70 75 te">. @ <inpu 54b0: 74 20 74 79 70 65 3d 22 68 69 64 64 65 6e 22 20 t type="hidden" 54c0: 6e 61 6d 65 3d 22 6e 61 6d 65 22 20 76 61 6c 75 name="name" valu 54d0: 65 3d 22 25 68 28 7a 4e 29 22 3e 0a 20 20 20 20 e="%h(zN)">. 54e0: 40 20 3c 2f 66 6f 72 6d 3e 3c 2f 74 72 3e 0a 20 @ </form></tr>. 54f0: 20 7d 0a 20 20 64 62 5f 66 69 6e 61 6c 69 7a 65 }. db_finalize 5500: 28 26 71 29 3b 0a 0a 20 20 40 20 3c 2f 74 61 62 (&q);.. @ </tab 5510: 6c 65 3e 0a 20 20 73 74 79 6c 65 5f 66 69 6e 69 le>. style_fini 5520: 73 68 5f 70 61 67 65 28 29 3b 0a 20 20 64 62 5f sh_page();. db_ 5530: 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 end_transaction( 5540: 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 0);.}../*.** Gen 5550: 65 72 61 74 65 20 48 54 4d 4c 20 66 6f 72 20 61 erate HTML for a 5560: 20 3c 73 65 6c 65 63 74 3e 20 74 68 61 74 20 6c <select> that l 5570: 69 73 74 73 20 61 6c 6c 20 74 68 65 20 61 76 61 ists all the ava 5580: 69 6c 61 62 6c 65 20 73 6b 69 6e 20 6e 61 6d 65 ilable skin name 5590: 73 2c 0a 2a 2a 20 65 78 63 65 70 74 20 66 6f 72 s,.** except for 55a0: 20 7a 45 78 63 65 70 74 20 69 66 20 7a 45 78 63 zExcept if zExc 55b0: 65 70 74 21 3d 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 ept!=NULL..*/.st 55c0: 61 74 69 63 20 76 6f 69 64 20 73 6b 69 6e 5f 65 atic void skin_e 55d0: 6d 69 74 5f 73 6b 69 6e 5f 73 65 6c 65 63 74 6f mit_skin_selecto 55e0: 72 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 r(. const char 55f0: 2a 7a 56 61 72 4e 61 6d 65 2c 20 20 20 20 20 20 *zVarName, 5600: 2f 2a 20 56 61 72 69 61 62 6c 65 20 6e 61 6d 65 /* Variable name 5610: 20 66 6f 72 20 74 68 65 20 3c 73 65 6c 65 63 74 for the <select 5620: 3e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 > */. const cha 5630: 72 20 2a 7a 44 65 66 61 75 6c 74 2c 20 20 20 20 r *zDefault, 5640: 20 20 2f 2a 20 54 68 65 20 64 65 66 61 75 6c 74 /* The default 5650: 20 76 61 6c 75 65 2c 20 69 66 20 6e 6f 74 20 4e value, if not N 5660: 55 4c 4c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 ULL */. const c 5670: 68 61 72 20 2a 7a 45 78 63 65 70 74 20 20 20 20 har *zExcept 5680: 20 20 20 20 2f 2a 20 4f 6d 69 74 20 74 68 69 73 /* Omit this 5690: 20 73 6b 69 6e 20 69 66 20 6e 6f 74 20 4e 55 4c skin if not NUL 56a0: 4c 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b L */.){. int i; 56b0: 0a 20 20 40 20 3c 73 65 6c 65 63 74 20 73 69 7a . @ <select siz 56c0: 65 3d 27 31 27 20 6e 61 6d 65 3d 27 25 73 28 7a e='1' name='%s(z 56d0: 56 61 72 4e 61 6d 65 29 27 3e 0a 20 20 69 66 28 VarName)'>. if( 56e0: 20 66 6f 73 73 69 6c 5f 73 74 72 63 6d 70 28 7a fossil_strcmp(z 56f0: 45 78 63 65 70 74 2c 20 22 63 75 72 72 65 6e 74 Except, "current 5700: 22 29 21 3d 30 20 29 7b 0a 20 20 20 20 40 20 3c ")!=0 ){. @ < 5710: 6f 70 74 69 6f 6e 20 76 61 6c 75 65 3d 27 63 75 option value='cu 5720: 72 72 65 6e 74 27 3e 43 75 72 72 65 6e 74 6c 79 rrent'>Currently 5730: 20 49 6e 20 55 73 65 3c 2f 6f 70 74 69 6f 6e 3e In Use</option> 5740: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 . }. for(i=0; 5750: 69 3c 63 6f 75 6e 74 28 61 42 75 69 6c 74 69 6e i<count(aBuiltin 5760: 53 6b 69 6e 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 Skin); i++){. 5770: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 const char *zNa 5780: 6d 65 20 3d 20 61 42 75 69 6c 74 69 6e 53 6b 69 me = aBuiltinSki 5790: 6e 5b 69 5d 2e 7a 4c 61 62 65 6c 3b 0a 20 20 20 n[i].zLabel;. 57a0: 20 69 66 28 20 66 6f 73 73 69 6c 5f 73 74 72 63 if( fossil_strc 57b0: 6d 70 28 7a 4e 61 6d 65 2c 20 7a 45 78 63 65 70 mp(zName, zExcep 57c0: 74 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 t)==0 ) continue 57d0: 3b 0a 20 20 20 20 69 66 28 20 66 6f 73 73 69 6c ;. if( fossil 57e0: 5f 73 74 72 63 6d 70 28 7a 44 65 66 61 75 6c 74 _strcmp(zDefault 57f0: 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 , zName)==0 ){. 5800: 20 20 20 20 20 40 20 3c 6f 70 74 69 6f 6e 20 76 @ <option v 5810: 61 6c 75 65 3d 27 25 73 28 7a 4e 61 6d 65 29 27 alue='%s(zName)' 5820: 20 73 65 6c 65 63 74 65 64 3e 5c 0a 20 20 20 20 selected>\. 5830: 20 20 40 20 25 68 28 61 42 75 69 6c 74 69 6e 53 @ %h(aBuiltinS 5840: 6b 69 6e 5b 69 5d 2e 7a 44 65 73 63 29 20 28 62 kin[i].zDesc) (b 5850: 75 69 6c 74 2d 69 6e 29 3c 2f 6f 70 74 69 6f 6e uilt-in)</option 5860: 3e 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 >. }else{. 5870: 20 20 20 40 20 3c 6f 70 74 69 6f 6e 20 76 61 6c @ <option val 5880: 75 65 3d 27 25 73 28 7a 4e 61 6d 65 29 27 3e 5c ue='%s(zName)'>\ 5890: 0a 20 20 20 20 20 20 40 20 25 68 28 61 42 75 69 . @ %h(aBui 58a0: 6c 74 69 6e 53 6b 69 6e 5b 69 5d 2e 7a 44 65 73 ltinSkin[i].zDes 58b0: 63 29 20 28 62 75 69 6c 74 2d 69 6e 29 3c 2f 6f c) (built-in)</o 58c0: 70 74 69 6f 6e 3e 0a 20 20 20 20 7d 0a 20 20 7d ption>. }. } 58d0: 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 39 . for(i=1; i<=9 58e0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 ; i++){. char 58f0: 20 7a 4e 61 6d 65 5b 32 30 5d 3b 0a 20 20 20 20 zName[20];. 5900: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 sqlite3_snprintf 5910: 28 73 69 7a 65 6f 66 28 7a 4e 61 6d 65 29 2c 20 (sizeof(zName), 5920: 7a 4e 61 6d 65 2c 20 22 64 72 61 66 74 25 64 22 zName, "draft%d" 5930: 2c 20 69 29 3b 0a 20 20 20 20 69 66 28 20 66 6f , i);. if( fo 5940: 73 73 69 6c 5f 73 74 72 63 6d 70 28 7a 4e 61 6d ssil_strcmp(zNam 5950: 65 2c 20 7a 45 78 63 65 70 74 29 3d 3d 30 20 29 e, zExcept)==0 ) 5960: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 continue;. i 5970: 66 28 20 66 6f 73 73 69 6c 5f 73 74 72 63 6d 70 f( fossil_strcmp 5980: 28 7a 44 65 66 61 75 6c 74 2c 20 7a 4e 61 6d 65 (zDefault, zName 5990: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 40 20 )==0 ){. @ 59a0: 3c 6f 70 74 69 6f 6e 20 76 61 6c 75 65 3d 27 25 <option value='% 59b0: 73 28 7a 4e 61 6d 65 29 27 20 73 65 6c 65 63 74 s(zName)' select 59c0: 65 64 3e 25 73 28 7a 4e 61 6d 65 29 3c 2f 6f 70 ed>%s(zName)</op 59d0: 74 69 6f 6e 3e 0a 20 20 20 20 7d 65 6c 73 65 7b tion>. }else{ 59e0: 0a 20 20 20 20 20 20 40 20 3c 6f 70 74 69 6f 6e . @ <option 59f0: 20 76 61 6c 75 65 3d 27 25 73 28 7a 4e 61 6d 65 value='%s(zName 5a00: 29 27 3e 25 73 28 7a 4e 61 6d 65 29 3c 2f 6f 70 )'>%s(zName)</op 5a10: 74 69 6f 6e 3e 0a 20 20 20 20 7d 0a 20 20 7d 0a tion>. }. }. 5a20: 20 20 40 20 3c 2f 73 65 6c 65 63 74 3e 0a 7d 0a @ </select>.}. 5a30: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 ./*.** Return th 5a40: 65 20 74 65 78 74 20 6f 66 20 6f 6e 65 20 6f 66 e text of one of 5a50: 20 74 68 65 20 73 6b 69 6e 20 66 69 6c 65 73 2e the skin files. 5a60: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 .*/.static const 5a70: 20 63 68 61 72 20 2a 73 6b 69 6e 5f 66 69 6c 65 char *skin_file 5a80: 5f 63 6f 6e 74 65 6e 74 28 63 6f 6e 73 74 20 63 _content(const c 5a90: 68 61 72 20 2a 7a 4c 61 62 65 6c 2c 20 63 6f 6e har *zLabel, con 5aa0: 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 29 7b st char *zFile){ 5ab0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a . const char *z 5ac0: 52 65 73 75 6c 74 3b 0a 20 20 69 66 28 20 66 6f Result;. if( fo 5ad0: 73 73 69 6c 5f 73 74 72 63 6d 70 28 7a 4c 61 62 ssil_strcmp(zLab 5ae0: 65 6c 2c 20 22 63 75 72 72 65 6e 74 22 29 3d 3d el, "current")== 5af0: 30 20 29 7b 0a 20 20 20 20 7a 52 65 73 75 6c 74 0 ){. zResult 5b00: 20 3d 20 73 6b 69 6e 5f 67 65 74 28 7a 46 69 6c = skin_get(zFil 5b10: 65 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 e);. }else if( 5b20: 73 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62 28 sqlite3_strglob( 5b30: 22 64 72 61 66 74 5b 31 2d 39 5d 22 2c 20 7a 4c "draft[1-9]", zL 5b40: 61 62 65 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 abel)==0 ){. 5b50: 7a 52 65 73 75 6c 74 20 3d 20 64 62 5f 67 65 74 zResult = db_get 5b60: 5f 6d 70 72 69 6e 74 66 28 22 22 2c 20 22 25 73 _mprintf("", "%s 5b70: 2d 25 73 22 2c 20 7a 4c 61 62 65 6c 2c 20 7a 46 -%s", zLabel, zF 5b80: 69 6c 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 ile);. }else{. 5b90: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f int i;. fo 5ba0: 72 28 69 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 r(i=0; i<2; i++) 5bb0: 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4b {. char *zK 5bc0: 65 79 20 3d 20 6d 70 72 69 6e 74 66 28 22 73 6b ey = mprintf("sk 5bd0: 69 6e 73 2f 25 73 2f 25 73 2e 74 78 74 22 2c 20 ins/%s/%s.txt", 5be0: 7a 4c 61 62 65 6c 2c 20 7a 46 69 6c 65 29 3b 0a zLabel, zFile);. 5bf0: 20 20 20 20 20 20 7a 52 65 73 75 6c 74 20 3d 20 zResult = 5c00: 62 75 69 6c 74 69 6e 5f 74 65 78 74 28 7a 4b 65 builtin_text(zKe 5c10: 79 29 3b 0a 20 20 20 20 20 20 66 6f 73 73 69 6c y);. fossil 5c20: 5f 66 72 65 65 28 7a 4b 65 79 29 3b 0a 20 20 20 _free(zKey);. 5c30: 20 20 20 69 66 28 20 7a 52 65 73 75 6c 74 21 3d if( zResult!= 5c40: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 0 ) break;. 5c50: 20 7a 4c 61 62 65 6c 20 3d 20 22 64 65 66 61 75 zLabel = "defau 5c60: 6c 74 22 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 lt";. }. }. 5c70: 20 72 65 74 75 72 6e 20 7a 52 65 73 75 6c 74 3b return zResult; 5c80: 0a 7d 0a 0a 65 78 74 65 72 6e 20 63 6f 6e 73 74 .}..extern const 5c90: 20 73 74 72 75 63 74 20 73 74 72 63 74 43 73 73 struct strctCss 5ca0: 44 65 66 61 75 6c 74 73 20 7b 0a 2f 2a 20 46 72 Defaults {./* Fr 5cb0: 6f 6d 20 74 68 65 20 67 65 6e 65 72 61 74 65 64 om the generated 5cc0: 20 64 65 66 61 75 6c 74 5f 63 73 73 2e 68 2c 20 default_css.h, 5cd0: 77 68 69 63 68 20 77 65 20 63 61 6e 6e 6f 74 20 which we cannot 5ce0: 23 69 6e 63 6c 75 64 65 20 68 65 72 65 0a 2a 2a #include here.** 5cf0: 20 77 69 74 68 6f 75 74 20 63 61 75 73 69 6e 67 without causing 5d00: 20 61 6e 20 4f 44 52 20 76 69 6f 6c 61 74 69 6f an ODR violatio 5d10: 6e 2e 0a 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 n..*/. const ch 5d20: 61 72 20 2a 65 6c 65 6d 65 6e 74 43 6c 61 73 73 ar *elementClass 5d30: 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 65 6c ; /* Name of el 5d40: 65 6d 65 6e 74 20 6e 65 65 64 65 64 20 2a 2f 0a ement needed */. 5d50: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 76 61 const char *va 5d60: 6c 75 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 lue; /* 5d70: 43 53 53 20 74 65 78 74 20 2a 2f 0a 7d 20 63 73 CSS text */.} cs 5d80: 73 44 65 66 61 75 6c 74 4c 69 73 74 5b 5d 3b 0a sDefaultList[];. 5d90: 0a 2f 2a 0a 2a 2a 20 57 45 42 50 41 47 45 3a 20 ./*.** WEBPAGE: 5da0: 73 65 74 75 70 5f 73 6b 69 6e 65 64 69 74 0a 2a setup_skinedit.* 5db0: 2a 0a 2a 2a 20 45 64 69 74 20 61 73 70 65 63 74 *.** Edit aspect 5dc0: 73 20 6f 66 20 61 20 73 6b 69 6e 20 64 65 74 65 s of a skin dete 5dd0: 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 77 3d rmined by the w= 5de0: 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 query parameter 5df0: 2e 0a 2a 2a 20 52 65 71 75 69 72 65 73 20 41 64 ..** Requires Ad 5e00: 6d 69 6e 20 6f 72 20 53 65 74 75 70 20 70 72 69 min or Setup pri 5e10: 76 69 6c 65 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 vileges..**.** 5e20: 20 20 77 3d 4e 55 4d 20 20 20 20 20 2d 2d 20 30 w=NUM -- 0 5e30: 3d 43 53 53 2c 20 31 3d 66 6f 6f 74 65 72 2c 20 =CSS, 1=footer, 5e40: 32 3d 68 65 61 64 65 72 2c 20 33 3d 64 65 74 61 2=header, 3=deta 5e50: 69 6c 73 2c 20 34 3d 6a 73 0a 2a 2a 20 20 20 20 ils, 4=js.** 5e60: 73 6b 3d 4e 55 4d 20 20 20 20 2d 2d 20 74 68 65 sk=NUM -- the 5e70: 20 64 72 61 66 74 20 73 6b 69 6e 20 6e 75 6d 62 draft skin numb 5e80: 65 72 0a 2a 2f 0a 76 6f 69 64 20 73 65 74 75 70 er.*/.void setup 5e90: 5f 73 6b 69 6e 65 64 69 74 28 76 6f 69 64 29 7b _skinedit(void){ 5ea0: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 . static const 5eb0: 73 74 72 75 63 74 20 73 53 6b 69 6e 41 64 64 72 struct sSkinAddr 5ec0: 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 {. const cha 5ed0: 72 20 2a 7a 46 69 6c 65 3b 0a 20 20 20 20 63 6f r *zFile;. co 5ee0: 6e 73 74 20 63 68 61 72 20 2a 7a 54 69 74 6c 65 nst char *zTitle 5ef0: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 ;. const char 5f00: 20 2a 7a 53 75 62 6d 65 6e 75 3b 0a 20 20 7d 20 *zSubmenu;. } 5f10: 61 53 6b 69 6e 41 74 74 72 5b 5d 20 3d 20 7b 0a aSkinAttr[] = {. 5f20: 20 20 20 20 2f 2a 20 30 20 2a 2f 20 7b 20 22 63 /* 0 */ { "c 5f30: 73 73 22 2c 20 20 20 20 20 22 43 53 53 22 2c 20 ss", "CSS", 5f40: 20 20 20 20 20 20 20 20 20 20 20 20 22 43 53 53 "CSS 5f50: 22 2c 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a ", },. /* 5f60: 20 31 20 2a 2f 20 7b 20 22 66 6f 6f 74 65 72 22 1 */ { "footer" 5f70: 2c 20 20 22 50 61 67 65 20 46 6f 6f 74 65 72 22 , "Page Footer" 5f80: 2c 20 20 20 20 20 22 46 6f 6f 74 65 72 22 2c 20 , "Footer", 5f90: 20 7d 2c 0a 20 20 20 20 2f 2a 20 32 20 2a 2f 20 },. /* 2 */ 5fa0: 7b 20 22 68 65 61 64 65 72 22 2c 20 20 22 50 61 { "header", "Pa 5fb0: 67 65 20 48 65 61 64 65 72 22 2c 20 20 20 20 20 ge Header", 5fc0: 22 48 65 61 64 65 72 22 2c 20 20 7d 2c 0a 20 20 "Header", },. 5fd0: 20 20 2f 2a 20 33 20 2a 2f 20 7b 20 22 64 65 74 /* 3 */ { "det 5fe0: 61 69 6c 73 22 2c 20 22 44 69 73 70 6c 61 79 20 ails", "Display 5ff0: 44 65 74 61 69 6c 73 22 2c 20 22 44 65 74 61 69 Details", "Detai 6000: 6c 73 22 2c 20 7d 2c 0a 20 20 20 20 2f 2a 20 34 ls", },. /* 4 6010: 20 2a 2f 20 7b 20 22 6a 73 22 2c 20 20 20 20 20 */ { "js", 6020: 20 22 4a 61 76 61 53 63 72 69 70 74 22 2c 20 20 "JavaScript", 6030: 20 20 20 20 22 53 63 72 69 70 74 22 2c 20 20 7d "Script", } 6040: 2c 0a 20 20 7d 3b 0a 20 20 63 6f 6e 73 74 20 63 ,. };. const c 6050: 68 61 72 20 2a 7a 42 61 73 69 73 3b 20 20 20 20 har *zBasis; 6060: 20 20 20 20 20 2f 2a 20 54 68 65 20 62 61 73 65 /* The base 6070: 6c 69 6e 65 20 66 69 6c 65 20 2a 2f 0a 20 20 63 line file */. c 6080: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 onst char *zOrig 6090: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 ; /* Or 60a0: 69 67 69 6e 61 6c 20 63 6f 6e 74 65 6e 74 20 70 iginal content p 60b0: 72 69 6f 72 20 74 6f 20 65 64 69 74 69 6e 67 20 rior to editing 60c0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 */. const char 60d0: 2a 7a 43 6f 6e 74 65 6e 74 3b 20 20 20 20 20 20 *zContent; 60e0: 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 61 66 74 65 /* Content afte 60f0: 72 20 65 64 69 74 69 6e 67 20 2a 2f 0a 20 20 63 r editing */. c 6100: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 66 6c 74 onst char *zDflt 6110: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 ; /* De 6120: 66 61 75 6c 74 20 63 6f 6e 74 65 6e 74 20 2a 2f fault content */ 6130: 0a 20 20 63 68 61 72 20 2a 7a 44 72 61 66 74 3b . char *zDraft; 6140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f / 6150: 2a 20 57 68 69 63 68 20 64 72 61 66 74 3a 20 20 * Which draft: 6160: 22 64 72 61 66 74 25 64 22 20 2a 2f 0a 20 20 63 "draft%d" */. c 6170: 68 61 72 20 2a 7a 54 69 74 6c 65 3b 20 20 20 20 har *zTitle; 6180: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 69 /* Ti 6190: 74 6c 65 20 6f 66 20 74 68 69 73 20 70 61 67 65 tle of this page 61a0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 */. const char 61b0: 20 2a 7a 46 69 6c 65 3b 20 20 20 20 20 20 20 20 *zFile; 61c0: 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 22 63 73 73 /* One of "css 61d0: 22 2c 20 22 66 6f 6f 74 65 72 22 2c 20 22 68 65 ", "footer", "he 61e0: 61 64 65 72 22 2c 20 22 64 65 74 61 69 6c 73 22 ader", "details" 61f0: 20 2a 2f 0a 20 20 69 6e 74 20 69 53 6b 69 6e 3b */. int iSkin; 6200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6210: 20 20 2f 2a 20 64 72 61 66 74 20 6e 75 6d 62 65 /* draft numbe 6220: 72 2e 20 20 31 2e 2e 39 20 2a 2f 0a 20 20 69 6e r. 1..9 */. in 6230: 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 t ii; 6240: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 /* Ind 6250: 65 78 20 69 6e 20 61 53 6b 69 6e 41 74 74 72 5b ex in aSkinAttr[ 6260: 5d 20 6f 66 20 74 68 69 73 20 66 69 6c 65 20 2a ] of this file * 6270: 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 /. int j; 6280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6290: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 /* Loop counter 62a0: 2a 2f 0a 20 20 69 6e 74 20 69 73 52 65 76 65 72 */. int isRever 62b0: 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 t = 0; 62c0: 20 2f 2a 20 54 72 75 65 20 69 66 20 52 65 76 65 /* True if Reve 62d0: 72 74 2d 74 6f 2d 42 61 73 65 6c 69 6e 65 20 77 rt-to-Baseline w 62e0: 61 73 20 70 72 65 73 73 65 64 20 2a 2f 0a 0a 20 as pressed */.. 62f0: 20 6c 6f 67 69 6e 5f 63 68 65 63 6b 5f 63 72 65 login_check_cre 6300: 64 65 6e 74 69 61 6c 73 28 29 3b 0a 0a 20 20 2f dentials();.. / 6310: 2a 20 46 69 67 75 72 65 20 6f 75 74 20 77 68 69 * Figure out whi 6320: 63 68 20 73 6b 69 6e 20 77 65 20 61 72 65 20 65 ch skin we are e 6330: 64 69 74 69 6e 67 20 2a 2f 0a 20 20 69 53 6b 69 diting */. iSki 6340: 6e 20 3d 20 61 74 6f 69 28 50 44 28 22 73 6b 22 n = atoi(PD("sk" 6350: 2c 22 31 22 29 29 3b 0a 20 20 69 66 28 20 69 53 ,"1"));. if( iS 6360: 6b 69 6e 3c 31 20 7c 7c 20 69 53 6b 69 6e 3e 39 kin<1 || iSkin>9 6370: 20 29 20 69 53 6b 69 6e 20 3d 20 31 3b 0a 0a 20 ) iSkin = 1;.. 6380: 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 /* Check that t 6390: 68 65 20 75 73 65 72 20 69 73 20 61 75 74 68 6f he user is autho 63a0: 72 69 7a 65 64 20 74 6f 20 65 64 69 74 20 74 68 rized to edit th 63b0: 69 73 20 73 6b 69 6e 2e 20 2a 2f 0a 20 20 69 66 is skin. */. if 63c0: 28 20 21 67 2e 70 65 72 6d 2e 41 64 6d 69 6e 20 ( !g.perm.Admin 63d0: 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 41 6c ){. char *zAl 63e0: 6c 6f 77 65 64 45 64 69 74 6f 72 73 20 3d 20 22 lowedEditors = " 63f0: 22 3b 0a 20 20 20 20 47 6c 6f 62 20 2a 70 41 6c ";. Glob *pAl 6400: 6c 6f 77 65 64 45 64 69 74 6f 72 73 3b 0a 20 20 lowedEditors;. 6410: 20 20 69 6e 74 20 69 73 4d 61 74 63 68 20 3d 20 int isMatch = 6420: 30 3b 0a 20 20 20 20 69 66 28 20 6c 6f 67 69 6e 0;. if( login 6430: 5f 69 73 5f 69 6e 64 69 76 69 64 75 61 6c 28 29 _is_individual() 6440: 20 29 7b 0a 20 20 20 20 20 20 7a 41 6c 6c 6f 77 ){. zAllow 6450: 65 64 45 64 69 74 6f 72 73 20 3d 20 64 62 5f 67 edEditors = db_g 6460: 65 74 5f 6d 70 72 69 6e 74 66 28 22 22 2c 20 22 et_mprintf("", " 6470: 64 72 61 66 74 25 64 2d 75 73 65 72 73 22 2c 20 draft%d-users", 6480: 69 53 6b 69 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 iSkin);. }. 6490: 20 20 69 66 28 20 7a 41 6c 6c 6f 77 65 64 45 64 if( zAllowedEd 64a0: 69 74 6f 72 73 5b 30 5d 20 29 7b 0a 20 20 20 20 itors[0] ){. 64b0: 20 20 70 41 6c 6c 6f 77 65 64 45 64 69 74 6f 72 pAllowedEditor 64c0: 73 20 3d 20 67 6c 6f 62 5f 63 72 65 61 74 65 28 s = glob_create( 64d0: 7a 41 6c 6c 6f 77 65 64 45 64 69 74 6f 72 73 29 zAllowedEditors) 64e0: 3b 0a 20 20 20 20 20 20 69 73 4d 61 74 63 68 20 ;. isMatch 64f0: 3d 20 67 6c 6f 62 5f 6d 61 74 63 68 28 70 41 6c = glob_match(pAl 6500: 6c 6f 77 65 64 45 64 69 74 6f 72 73 2c 20 67 2e lowedEditors, g. 6510: 7a 4c 6f 67 69 6e 29 3b 0a 20 20 20 20 20 20 67 zLogin);. g 6520: 6c 6f 62 5f 66 72 65 65 28 70 41 6c 6c 6f 77 65 lob_free(pAllowe 6530: 64 45 64 69 74 6f 72 73 29 3b 0a 20 20 20 20 7d dEditors);. } 6540: 0a 20 20 20 20 69 66 28 20 69 73 4d 61 74 63 68 . if( isMatch 6550: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6c 6f 67 ==0 ){. log 6560: 69 6e 5f 6e 65 65 64 65 64 28 30 29 3b 0a 20 20 in_needed(0);. 6570: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 return;. 6580: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 66 69 67 75 }. }.. /* figu 6590: 72 65 20 6f 75 74 20 77 68 69 63 68 20 66 69 6c re out which fil 65a0: 65 20 69 73 20 74 6f 20 62 65 20 65 64 69 74 65 e is to be edite 65b0: 64 20 2a 2f 0a 20 20 69 69 20 3d 20 61 74 6f 69 d */. ii = atoi 65c0: 28 50 44 28 22 77 22 2c 22 30 22 29 29 3b 0a 20 (PD("w","0"));. 65d0: 20 69 66 28 20 69 69 3c 30 20 7c 7c 20 69 69 3e if( ii<0 || ii> 65e0: 63 6f 75 6e 74 28 61 53 6b 69 6e 41 74 74 72 29 count(aSkinAttr) 65f0: 20 29 20 69 69 20 3d 20 30 3b 0a 20 20 7a 46 69 ) ii = 0;. zFi 6600: 6c 65 20 3d 20 61 53 6b 69 6e 41 74 74 72 5b 69 le = aSkinAttr[i 6610: 69 5d 2e 7a 46 69 6c 65 3b 0a 20 20 7a 44 72 61 i].zFile;. zDra 6620: 66 74 20 3d 20 6d 70 72 69 6e 74 66 28 22 64 72 ft = mprintf("dr 6630: 61 66 74 25 64 22 2c 20 69 53 6b 69 6e 29 3b 0a aft%d", iSkin);. 6640: 20 20 7a 54 69 74 6c 65 20 3d 20 6d 70 72 69 6e zTitle = mprin 6650: 74 66 28 22 25 73 20 66 6f 72 20 44 72 61 66 74 tf("%s for Draft 6660: 25 64 22 2c 20 61 53 6b 69 6e 41 74 74 72 5b 69 %d", aSkinAttr[i 6670: 69 5d 2e 7a 54 69 74 6c 65 2c 20 69 53 6b 69 6e i].zTitle, iSkin 6680: 29 3b 0a 20 20 7a 42 61 73 69 73 20 3d 20 50 44 );. zBasis = PD 6690: 28 22 62 61 73 69 73 22 2c 22 63 75 72 72 65 6e ("basis","curren 66a0: 74 22 29 3b 0a 20 20 7a 44 66 6c 74 20 3d 20 73 t");. zDflt = s 66b0: 6b 69 6e 5f 66 69 6c 65 5f 63 6f 6e 74 65 6e 74 kin_file_content 66c0: 28 7a 42 61 73 69 73 2c 20 7a 46 69 6c 65 29 3b (zBasis, zFile); 66d0: 0a 20 20 7a 4f 72 69 67 20 3d 20 64 62 5f 67 65 . zOrig = db_ge 66e0: 74 5f 6d 70 72 69 6e 74 66 28 7a 44 66 6c 74 2c t_mprintf(zDflt, 66f0: 20 22 64 72 61 66 74 25 64 2d 25 73 22 2c 69 53 "draft%d-%s",iS 6700: 6b 69 6e 2c 7a 46 69 6c 65 29 3b 0a 20 20 7a 43 kin,zFile);. zC 6710: 6f 6e 74 65 6e 74 20 3d 20 50 44 28 7a 46 69 6c ontent = PD(zFil 6720: 65 2c 7a 4f 72 69 67 29 3b 0a 20 20 69 66 28 20 e,zOrig);. if( 6730: 50 28 22 72 65 76 65 72 74 22 29 21 3d 30 20 26 P("revert")!=0 & 6740: 26 20 63 67 69 5f 63 73 72 66 5f 73 61 66 65 28 & cgi_csrf_safe( 6750: 32 29 20 29 7b 0a 20 20 20 20 7a 43 6f 6e 74 65 2) ){. zConte 6760: 6e 74 20 3d 20 7a 44 66 6c 74 3b 0a 20 20 20 20 nt = zDflt;. 6770: 69 73 52 65 76 65 72 74 20 3d 20 31 3b 0a 20 20 isRevert = 1;. 6780: 7d 0a 0a 20 20 64 62 5f 62 65 67 69 6e 5f 74 72 }.. db_begin_tr 6790: 61 6e 73 61 63 74 69 6f 6e 28 29 3b 0a 20 20 73 ansaction();. s 67a0: 74 79 6c 65 5f 73 65 74 5f 63 75 72 72 65 6e 74 tyle_set_current 67b0: 5f 66 65 61 74 75 72 65 28 22 73 6b 69 6e 73 22 _feature("skins" 67c0: 29 3b 0a 20 20 73 74 79 6c 65 5f 68 65 61 64 65 );. style_heade 67d0: 72 28 22 25 73 22 2c 20 7a 54 69 74 6c 65 29 3b r("%s", zTitle); 67e0: 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 63 6f . for(j=0; j<co 67f0: 75 6e 74 28 61 53 6b 69 6e 41 74 74 72 29 3b 20 unt(aSkinAttr); 6800: 6a 2b 2b 29 7b 0a 20 20 20 20 73 74 79 6c 65 5f j++){. style_ 6810: 73 75 62 6d 65 6e 75 5f 65 6c 65 6d 65 6e 74 28 submenu_element( 6820: 61 53 6b 69 6e 41 74 74 72 5b 6a 5d 2e 7a 53 75 aSkinAttr[j].zSu 6830: 62 6d 65 6e 75 2c 0a 20 20 20 20 20 20 20 20 20 bmenu,. 6840: 20 22 25 52 2f 73 65 74 75 70 5f 73 6b 69 6e 65 "%R/setup_skine 6850: 64 69 74 3f 77 3d 25 64 26 62 61 73 69 73 3d 25 dit?w=%d&basis=% 6860: 68 26 73 6b 3d 25 64 22 2c 6a 2c 7a 42 61 73 69 h&sk=%d",j,zBasi 6870: 73 2c 69 53 6b 69 6e 29 3b 0a 20 20 7d 0a 20 20 s,iSkin);. }. 6880: 40 20 3c 66 6f 72 6d 20 61 63 74 69 6f 6e 3d 22 @ <form action=" 6890: 25 52 2f 73 65 74 75 70 5f 73 6b 69 6e 65 64 69 %R/setup_skinedi 68a0: 74 22 20 6d 65 74 68 6f 64 3d 22 70 6f 73 74 22 t" method="post" 68b0: 3e 3c 64 69 76 3e 0a 20 20 6c 6f 67 69 6e 5f 69 ><div>. login_i 68c0: 6e 73 65 72 74 5f 63 73 72 66 5f 73 65 63 72 65 nsert_csrf_secre 68d0: 74 28 29 3b 0a 20 20 40 20 3c 69 6e 70 75 74 20 t();. @ <input 68e0: 74 79 70 65 3d 27 68 69 64 64 65 6e 27 20 6e 61 type='hidden' na 68f0: 6d 65 3d 27 77 27 20 76 61 6c 75 65 3d 27 25 64 me='w' value='%d 6900: 28 69 69 29 27 3e 0a 20 20 40 20 3c 69 6e 70 75 (ii)'>. @ <inpu 6910: 74 20 74 79 70 65 3d 27 68 69 64 64 65 6e 27 20 t type='hidden' 6920: 6e 61 6d 65 3d 27 73 6b 27 20 76 61 6c 75 65 3d name='sk' value= 6930: 27 25 64 28 69 53 6b 69 6e 29 27 3e 0a 20 20 40 '%d(iSkin)'>. @ 6940: 20 3c 68 32 3e 45 64 69 74 20 25 73 28 7a 54 69 <h2>Edit %s(zTi 6950: 74 6c 65 29 3a 3c 2f 68 32 3e 0a 20 20 69 66 28 tle):</h2>. if( 6960: 20 50 28 22 73 75 62 6d 69 74 22 29 20 26 26 20 P("submit") && 6970: 63 67 69 5f 63 73 72 66 5f 73 61 66 65 28 32 29 cgi_csrf_safe(2) 6980: 0a 20 20 20 26 26 20 28 7a 4f 72 69 67 3d 3d 30 . && (zOrig==0 6990: 20 7c 7c 20 73 74 72 63 6d 70 28 7a 4f 72 69 67 || strcmp(zOrig 69a0: 2c 7a 43 6f 6e 74 65 6e 74 29 21 3d 30 29 0a 20 ,zContent)!=0). 69b0: 20 29 7b 0a 20 20 20 20 64 62 5f 73 65 74 5f 6d ){. db_set_m 69c0: 70 72 69 6e 74 66 28 7a 43 6f 6e 74 65 6e 74 2c printf(zContent, 69d0: 20 30 2c 20 22 64 72 61 66 74 25 64 2d 25 73 22 0, "draft%d-%s" 69e0: 2c 69 53 6b 69 6e 2c 7a 46 69 6c 65 29 3b 0a 20 ,iSkin,zFile);. 69f0: 20 7d 0a 20 20 40 20 3c 74 65 78 74 61 72 65 61 }. @ <textarea 6a00: 20 6e 61 6d 65 3d 22 25 73 28 7a 46 69 6c 65 29 name="%s(zFile) 6a10: 22 20 72 6f 77 73 3d 22 31 30 22 20 63 6f 6c 73 " rows="10" cols 6a20: 3d 22 38 30 22 3e 5c 0a 20 20 40 20 25 68 28 7a ="80">\. @ %h(z 6a30: 43 6f 6e 74 65 6e 74 29 3c 2f 74 65 78 74 61 72 Content)</textar 6a40: 65 61 3e 0a 20 20 40 20 3c 62 72 3e 0a 20 20 40 ea>. @ <br>. @ 6a50: 20 3c 69 6e 70 75 74 20 74 79 70 65 3d 22 73 75 <input type="su 6a60: 62 6d 69 74 22 20 6e 61 6d 65 3d 22 73 75 62 6d bmit" name="subm 6a70: 69 74 22 20 76 61 6c 75 65 3d 22 41 70 70 6c 79 it" value="Apply 6a80: 20 43 68 61 6e 67 65 73 22 3e 0a 20 20 69 66 28 Changes">. if( 6a90: 20 69 73 52 65 76 65 72 74 20 29 7b 0a 20 20 20 isRevert ){. 6aa0: 20 40 20 26 6c 61 72 72 3b 20 50 72 65 73 73 20 @ ← Press 6ab0: 74 6f 20 63 6f 6d 70 6c 65 74 65 20 72 65 76 65 to complete reve 6ac0: 72 73 69 6f 6e 20 74 6f 20 22 25 73 28 7a 42 61 rsion to "%s(zBa 6ad0: 73 69 73 29 22 0a 20 20 7d 65 6c 73 65 20 69 66 sis)". }else if 6ae0: 28 20 66 6f 73 73 69 6c 5f 73 74 72 63 6d 70 28 ( fossil_strcmp( 6af0: 7a 43 6f 6e 74 65 6e 74 2c 7a 44 66 6c 74 29 21 zContent,zDflt)! 6b00: 3d 30 20 29 7b 0a 20 20 20 20 40 20 3c 69 6e 70 =0 ){. @ <inp 6b10: 75 74 20 74 79 70 65 3d 22 73 75 62 6d 69 74 22 ut type="submit" 6b20: 20 6e 61 6d 65 3d 22 72 65 76 65 72 74 22 20 76 name="revert" v 6b30: 61 6c 75 65 3d 27 52 65 76 65 72 74 20 54 6f 20 alue='Revert To 6b40: 22 25 73 28 7a 42 61 73 69 73 29 22 27 3e 0a 20 "%s(zBasis)"'>. 6b50: 20 7d 0a 20 20 40 20 3c 68 72 3e 0a 20 20 40 20 }. @ <hr>. @ 6b60: 42 61 73 65 6c 69 6e 65 3a 20 5c 0a 20 20 73 6b Baseline: \. sk 6b70: 69 6e 5f 65 6d 69 74 5f 73 6b 69 6e 5f 73 65 6c in_emit_skin_sel 6b80: 65 63 74 6f 72 28 22 62 61 73 69 73 22 2c 20 7a ector("basis", z 6b90: 42 61 73 69 73 2c 20 7a 44 72 61 66 74 29 3b 0a Basis, zDraft);. 6ba0: 20 20 40 20 3c 69 6e 70 75 74 20 74 79 70 65 3d @ <input type= 6bb0: 22 73 75 62 6d 69 74 22 20 6e 61 6d 65 3d 22 64 "submit" name="d 6bc0: 69 66 66 22 20 76 61 6c 75 65 3d 22 55 6e 69 66 iff" value="Unif 6bd0: 69 65 64 20 44 69 66 66 22 3e 0a 20 20 40 20 3c ied Diff">. @ < 6be0: 69 6e 70 75 74 20 74 79 70 65 3d 22 73 75 62 6d input type="subm 6bf0: 69 74 22 20 6e 61 6d 65 3d 22 73 62 73 64 69 66 it" name="sbsdif 6c00: 66 22 20 76 61 6c 75 65 3d 22 53 69 64 65 2d 62 f" value="Side-b 6c10: 79 2d 53 69 64 65 20 44 69 66 66 22 3e 0a 20 20 y-Side Diff">. 6c20: 69 66 28 20 50 28 22 64 69 66 66 22 29 21 3d 30 if( P("diff")!=0 6c30: 20 7c 7c 20 50 28 22 73 62 73 64 69 66 66 22 29 || P("sbsdiff") 6c40: 21 3d 30 20 29 7b 0a 20 20 20 20 42 6c 6f 62 20 !=0 ){. Blob 6c50: 66 72 6f 6d 2c 20 74 6f 2c 20 6f 75 74 3b 0a 20 from, to, out;. 6c60: 20 20 20 44 69 66 66 43 6f 6e 66 69 67 20 44 43 DiffConfig DC 6c70: 66 67 3b 0a 20 20 20 20 63 6f 6e 73 74 72 75 63 fg;. construc 6c80: 74 5f 64 69 66 66 5f 66 6c 61 67 73 28 31 2c 20 t_diff_flags(1, 6c90: 26 44 43 66 67 29 3b 0a 20 20 20 20 44 43 66 67 &DCfg);. DCfg 6ca0: 2e 64 69 66 66 46 6c 61 67 73 20 7c 3d 20 44 49 .diffFlags |= DI 6cb0: 46 46 5f 53 54 52 49 50 5f 45 4f 4c 43 52 3b 0a FF_STRIP_EOLCR;. 6cc0: 20 20 20 20 69 66 28 20 50 28 22 73 62 73 64 69 if( P("sbsdi 6cd0: 66 66 22 29 21 3d 30 20 29 20 44 43 66 67 2e 64 ff")!=0 ) DCfg.d 6ce0: 69 66 66 46 6c 61 67 73 20 7c 3d 20 44 49 46 46 iffFlags |= DIFF 6cf0: 5f 53 49 44 45 42 59 53 49 44 45 3b 0a 20 20 20 _SIDEBYSIDE;. 6d00: 20 62 6c 6f 62 5f 69 6e 69 74 28 26 74 6f 2c 20 blob_init(&to, 6d10: 7a 43 6f 6e 74 65 6e 74 2c 20 2d 31 29 3b 0a 20 zContent, -1);. 6d20: 20 20 20 62 6c 6f 62 5f 69 6e 69 74 28 26 66 72 blob_init(&fr 6d30: 6f 6d 2c 20 73 6b 69 6e 5f 66 69 6c 65 5f 63 6f om, skin_file_co 6d40: 6e 74 65 6e 74 28 7a 42 61 73 69 73 2c 20 7a 46 ntent(zBasis, zF 6d50: 69 6c 65 29 2c 20 2d 31 29 3b 0a 20 20 20 20 62 ile), -1);. b 6d60: 6c 6f 62 5f 7a 65 72 6f 28 26 6f 75 74 29 3b 0a lob_zero(&out);. 6d70: 20 20 20 20 44 43 66 67 2e 64 69 66 66 46 6c 61 DCfg.diffFla 6d80: 67 73 20 7c 3d 20 44 49 46 46 5f 48 54 4d 4c 20 gs |= DIFF_HTML 6d90: 7c 20 44 49 46 46 5f 4e 4f 54 54 4f 4f 42 49 47 | DIFF_NOTTOOBIG 6da0: 3b 0a 20 20 20 20 69 66 28 20 44 43 66 67 2e 64 ;. if( DCfg.d 6db0: 69 66 66 46 6c 61 67 73 20 26 20 44 49 46 46 5f iffFlags & DIFF_ 6dc0: 53 49 44 45 42 59 53 49 44 45 20 29 7b 0a 20 20 SIDEBYSIDE ){. 6dd0: 20 20 20 20 74 65 78 74 5f 64 69 66 66 28 26 66 text_diff(&f 6de0: 72 6f 6d 2c 20 26 74 6f 2c 20 26 6f 75 74 2c 20 rom, &to, &out, 6df0: 26 44 43 66 67 29 3b 0a 20 20 20 20 20 20 40 20 &DCfg);. @ 6e00: 25 73 28 62 6c 6f 62 5f 73 74 72 28 26 6f 75 74 %s(blob_str(&out 6e10: 29 29 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 )). }else{. 6e20: 20 20 20 20 44 43 66 67 2e 64 69 66 66 46 6c 61 DCfg.diffFla 6e30: 67 73 20 7c 3d 20 44 49 46 46 5f 4c 49 4e 45 4e gs |= DIFF_LINEN 6e40: 4f 3b 0a 20 20 20 20 20 20 74 65 78 74 5f 64 69 O;. text_di 6e50: 66 66 28 26 66 72 6f 6d 2c 20 26 74 6f 2c 20 26 ff(&from, &to, & 6e60: 6f 75 74 2c 20 26 44 43 66 67 29 3b 0a 20 20 20 out, &DCfg);. 6e70: 20 20 20 40 20 3c 70 72 65 20 63 6c 61 73 73 3d @ <pre class= 6e80: 22 75 64 69 66 66 22 3e 0a 20 20 20 20 20 20 40 "udiff">. @ 6e90: 20 25 73 28 62 6c 6f 62 5f 73 74 72 28 26 6f 75 %s(blob_str(&ou 6ea0: 74 29 29 0a 20 20 20 20 20 20 40 20 3c 2f 70 72 t)). @ </pr 6eb0: 65 3e 0a 20 20 20 20 7d 0a 20 20 20 20 62 6c 6f e>. }. blo 6ec0: 62 5f 72 65 73 65 74 28 26 66 72 6f 6d 29 3b 0a b_reset(&from);. 6ed0: 20 20 20 20 62 6c 6f 62 5f 72 65 73 65 74 28 26 blob_reset(& 6ee0: 74 6f 29 3b 0a 20 20 20 20 62 6c 6f 62 5f 72 65 to);. blob_re 6ef0: 73 65 74 28 26 6f 75 74 29 3b 0a 20 20 7d 0a 20 set(&out);. }. 6f00: 20 40 20 3c 2f 64 69 76 3e 3c 2f 66 6f 72 6d 3e @ </div></form> 6f10: 0a 20 20 73 74 79 6c 65 5f 66 69 6e 69 73 68 5f . style_finish_ 6f20: 70 61 67 65 28 29 3b 0a 20 20 64 62 5f 65 6e 64 page();. db_end 6f30: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 30 29 3b _transaction(0); 6f40: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f .}../*.** Try to 6f50: 20 69 6e 69 74 69 61 6c 69 7a 65 20 64 72 61 66 initialize draf 6f60: 74 20 73 6b 69 6e 20 69 53 6b 69 6e 20 74 6f 20 t skin iSkin to 6f70: 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 6f 72 20 the built-in or 6f80: 70 72 65 65 78 69 73 74 69 6e 67 0a 2a 2a 20 73 preexisting.** s 6f90: 6b 69 6e 20 6e 61 6d 65 64 20 62 79 20 7a 54 65 kin named by zTe 6fa0: 6d 70 6c 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 mplate..*/.stati 6fb0: 63 20 76 6f 69 64 20 73 6b 69 6e 5f 69 6e 69 74 c void skin_init 6fc0: 69 61 6c 69 7a 65 5f 64 72 61 66 74 28 69 6e 74 ialize_draft(int 6fd0: 20 69 53 6b 69 6e 2c 20 63 6f 6e 73 74 20 63 68 iSkin, const ch 6fe0: 61 72 20 2a 7a 54 65 6d 70 6c 61 74 65 29 7b 0a ar *zTemplate){. 6ff0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 7a int i;. if( z 7000: 54 65 6d 70 6c 61 74 65 3d 3d 30 20 29 20 72 65 Template==0 ) re 7010: 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b turn;. for(i=0; 7020: 20 69 3c 63 6f 75 6e 74 28 61 7a 53 6b 69 6e 46 i<count(azSkinF 7030: 69 6c 65 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 ile); i++){. 7040: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 const char *z = 7050: 73 6b 69 6e 5f 66 69 6c 65 5f 63 6f 6e 74 65 6e skin_file_conten 7060: 74 28 7a 54 65 6d 70 6c 61 74 65 2c 20 61 7a 53 t(zTemplate, azS 7070: 6b 69 6e 46 69 6c 65 5b 69 5d 29 3b 0a 20 20 20 kinFile[i]);. 7080: 20 64 62 5f 73 65 74 5f 6d 70 72 69 6e 74 66 28 db_set_mprintf( 7090: 7a 2c 20 30 2c 20 22 64 72 61 66 74 25 64 2d 25 z, 0, "draft%d-% 70a0: 73 22 2c 20 69 53 6b 69 6e 2c 20 61 7a 53 6b 69 s", iSkin, azSki 70b0: 6e 46 69 6c 65 5b 69 5d 29 3b 0a 20 20 7d 0a 7d nFile[i]);. }.} 70c0: 0a 0a 2f 2a 0a 2a 2a 20 50 75 62 6c 69 73 68 20 ../*.** Publish 70d0: 74 68 65 20 64 72 61 66 74 20 73 6b 69 6e 20 69 the draft skin i 70e0: 53 6b 69 6e 20 61 73 20 74 68 65 20 6e 65 77 20 Skin as the new 70f0: 64 65 66 61 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74 default..*/.stat 7100: 69 63 20 76 6f 69 64 20 73 6b 69 6e 5f 70 75 62 ic void skin_pub 7110: 6c 69 73 68 28 69 6e 74 20 69 53 6b 69 6e 29 7b lish(int iSkin){ 7120: 0a 20 20 63 68 61 72 20 2a 7a 43 75 72 72 65 6e . char *zCurren 7130: 74 3b 20 20 20 20 2f 2a 20 53 51 4c 20 64 65 73 t; /* SQL des 7140: 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 cription of the 7150: 63 75 72 72 65 6e 74 20 73 6b 69 6e 20 2a 2f 0a current skin */. 7160: 20 20 63 68 61 72 20 2a 7a 42 75 69 6c 74 69 6e char *zBuiltin 7170: 3b 20 20 20 20 2f 2a 20 53 51 4c 20 64 65 73 63 ; /* SQL desc 7180: 72 69 70 74 69 6f 6e 20 6f 66 20 61 20 62 75 69 ription of a bui 7190: 6c 74 2d 69 6e 20 73 6b 69 6e 20 2a 2f 0a 20 20 lt-in skin */. 71a0: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 73 65 65 int i;. int see 71b0: 6e 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 54 n = 0; /* T 71c0: 72 75 65 20 69 66 20 6e 6f 20 6e 65 65 64 20 74 rue if no need t 71d0: 6f 20 6d 61 6b 65 20 61 20 62 61 63 6b 75 70 20 o make a backup 71e0: 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 */.. /* Check t 71f0: 6f 20 73 65 65 20 69 66 20 74 68 65 20 63 75 72 o see if the cur 7200: 72 65 6e 74 20 73 6b 69 6e 20 69 73 20 61 6c 72 rent skin is alr 7210: 65 61 64 79 20 73 61 76 65 64 2e 20 20 49 66 20 eady saved. If 7220: 69 74 20 69 73 2c 20 74 68 65 72 65 0a 20 20 2a it is, there. * 7230: 2a 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 * is no need to 7240: 63 72 65 61 74 65 20 61 20 62 61 63 6b 75 70 20 create a backup 7250: 2a 2f 0a 20 20 7a 43 75 72 72 65 6e 74 20 3d 20 */. zCurrent = 7260: 67 65 74 53 6b 69 6e 28 30 29 3b 0a 20 20 66 6f getSkin(0);. fo 7270: 72 28 69 3d 30 3b 20 69 3c 63 6f 75 6e 74 28 61 r(i=0; i<count(a 7280: 42 75 69 6c 74 69 6e 53 6b 69 6e 29 3b 20 69 2b BuiltinSkin); i+ 7290: 2b 29 7b 0a 20 20 20 20 7a 42 75 69 6c 74 69 6e +){. zBuiltin 72a0: 20 3d 20 67 65 74 53 6b 69 6e 28 61 42 75 69 6c = getSkin(aBuil 72b0: 74 69 6e 53 6b 69 6e 5b 69 5d 2e 7a 4c 61 62 65 tinSkin[i].zLabe 72c0: 6c 29 3b 0a 20 20 20 20 69 66 28 20 66 6f 73 73 l);. if( foss 72d0: 69 6c 5f 73 74 72 63 6d 70 28 7a 42 75 69 6c 74 il_strcmp(zBuilt 72e0: 69 6e 2c 20 7a 43 75 72 72 65 6e 74 29 3d 3d 30 in, zCurrent)==0 72f0: 20 29 7b 0a 20 20 20 20 20 20 73 65 65 6e 20 3d ){. seen = 7300: 20 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 1;. break; 7310: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 . }. }. if( 7320: 20 21 73 65 65 6e 20 29 7b 0a 20 20 20 20 73 65 !seen ){. se 7330: 65 6e 20 3d 20 64 62 5f 65 78 69 73 74 73 28 22 en = db_exists(" 7340: 53 45 4c 45 43 54 20 31 20 46 52 4f 4d 20 63 6f SELECT 1 FROM co 7350: 6e 66 69 67 20 57 48 45 52 45 20 6e 61 6d 65 20 nfig WHERE name 7360: 47 4c 4f 42 20 27 73 6b 69 6e 3a 2a 27 22 0a 20 GLOB 'skin:*'". 7370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7380: 20 20 20 20 20 20 22 20 41 4e 44 20 76 61 6c 75 " AND valu 7390: 65 3d 25 51 22 2c 20 7a 43 75 72 72 65 6e 74 29 e=%Q", zCurrent) 73a0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 73 65 65 ;. }. if( !see 73b0: 6e 20 29 7b 0a 20 20 20 20 64 62 5f 75 6e 70 72 n ){. db_unpr 73c0: 6f 74 65 63 74 28 50 52 4f 54 45 43 54 5f 43 4f otect(PROTECT_CO 73d0: 4e 46 49 47 29 3b 0a 20 20 20 20 64 62 5f 6d 75 NFIG);. db_mu 73e0: 6c 74 69 5f 65 78 65 63 28 0a 20 20 20 20 20 20 lti_exec(. 73f0: 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 6f 6e "INSERT INTO con 7400: 66 69 67 28 6e 61 6d 65 2c 76 61 6c 75 65 2c 6d fig(name,value,m 7410: 74 69 6d 65 29 20 56 41 4c 55 45 53 28 22 0a 20 time) VALUES(". 7420: 20 20 20 20 20 22 20 20 73 74 72 66 74 69 6d 65 " strftime 7430: 28 27 73 6b 69 6e 3a 42 61 63 6b 75 70 20 4f 6e ('skin:Backup On 7440: 20 25 25 59 2d 25 25 6d 2d 25 25 64 20 25 25 48 %%Y-%%m-%%d %%H 7450: 3a 25 25 4d 3a 25 25 53 27 29 2c 22 0a 20 20 20 :%%M:%%S'),". 7460: 20 20 20 22 20 20 25 51 2c 6e 6f 77 28 29 29 22 " %Q,now())" 7470: 2c 20 7a 43 75 72 72 65 6e 74 0a 20 20 20 20 29 , zCurrent. ) 7480: 3b 0a 20 20 20 20 64 62 5f 70 72 6f 74 65 63 74 ;. db_protect 7490: 5f 70 6f 70 28 29 3b 0a 20 20 7d 0a 0a 20 20 2f _pop();. }.. / 74a0: 2a 20 50 75 62 6c 69 73 68 20 64 72 61 66 74 20 * Publish draft 74b0: 69 53 6b 69 6e 20 2a 2f 0a 20 20 66 6f 72 28 69 iSkin */. for(i 74c0: 3d 30 3b 20 69 3c 63 6f 75 6e 74 28 61 7a 53 6b =0; i<count(azSk 74d0: 69 6e 46 69 6c 65 29 3b 20 69 2b 2b 29 7b 0a 20 inFile); i++){. 74e0: 20 20 20 63 68 61 72 20 2a 7a 4e 65 77 20 3d 20 char *zNew = 74f0: 64 62 5f 67 65 74 5f 6d 70 72 69 6e 74 66 28 22 db_get_mprintf(" 7500: 22 2c 20 22 64 72 61 66 74 25 64 2d 25 73 22 2c ", "draft%d-%s", 7510: 20 69 53 6b 69 6e 2c 20 61 7a 53 6b 69 6e 46 69 iSkin, azSkinFi 7520: 6c 65 5b 69 5d 29 3b 0a 20 20 20 20 64 62 5f 73 le[i]);. db_s 7530: 65 74 28 61 7a 53 6b 69 6e 46 69 6c 65 5b 69 5d et(azSkinFile[i] 7540: 2f 2a 77 6f 72 6b 73 2d 6c 69 6b 65 3a 22 78 22 /*works-like:"x" 7550: 2a 2f 2c 20 7a 4e 65 77 2c 20 30 29 3b 0a 20 20 */, zNew, 0);. 7560: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 45 42 50 41 }.}../*.** WEBPA 7570: 47 45 3a 20 73 65 74 75 70 5f 73 6b 69 6e 0a 2a GE: setup_skin.* 7580: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20 *.** Generate a 7590: 70 61 67 65 20 73 68 6f 77 69 6e 67 20 74 68 65 page showing the 75a0: 20 73 74 65 70 73 20 6e 65 65 64 65 64 20 74 6f steps needed to 75b0: 20 63 75 73 74 6f 6d 69 7a 65 20 61 20 73 6b 69 customize a ski 75c0: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 65 74 75 70 n..*/.void setup 75d0: 5f 73 6b 69 6e 28 76 6f 69 64 29 7b 0a 20 20 69 _skin(void){. i 75e0: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 2f nt i; / 75f0: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a * Loop counter * 7600: 2f 0a 20 20 69 6e 74 20 69 53 6b 69 6e 3b 20 20 /. int iSkin; 7610: 20 20 20 20 2f 2a 20 57 68 69 63 68 20 64 72 61 /* Which dra 7620: 66 74 20 73 6b 69 6e 20 69 73 20 62 65 69 6e 67 ft skin is being 7630: 20 65 64 69 74 65 64 20 2a 2f 0a 20 20 69 6e 74 edited */. int 7640: 20 69 73 53 65 74 75 70 3b 20 20 20 20 2f 2a 20 isSetup; /* 7650: 54 72 75 65 20 66 6f 72 20 61 6e 20 61 64 6d 69 True for an admi 7660: 6e 69 73 74 72 61 74 6f 72 20 2a 2f 0a 20 20 69 nistrator */. i 7670: 6e 74 20 69 73 45 64 69 74 6f 72 3b 20 20 20 2f nt isEditor; / 7680: 2a 20 4f 74 68 65 72 73 20 61 75 74 68 6f 72 69 * Others authori 7690: 7a 65 64 20 74 6f 20 6d 61 6b 65 20 65 64 69 74 zed to make edit 76a0: 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 41 6c s */. char *zAl 76b0: 6c 6f 77 65 64 45 64 69 74 6f 72 73 3b 20 20 20 lowedEditors; 76c0: 2f 2a 20 57 68 6f 20 6d 61 79 20 65 64 69 74 20 /* Who may edit 76d0: 74 68 65 20 64 72 61 66 74 20 73 6b 69 6e 20 2a the draft skin * 76e0: 2f 0a 20 20 63 68 61 72 20 2a 7a 42 61 73 65 3b /. char *zBase; 76f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /* 7700: 42 61 73 65 20 55 52 4c 20 66 6f 72 20 64 72 61 Base URL for dra 7710: 66 74 20 75 6e 64 65 72 20 74 65 73 74 20 2a 2f ft under test */ 7720: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 . static const 7730: 63 68 61 72 20 2a 63 6f 6e 73 74 20 61 7a 54 65 char *const azTe 7740: 73 74 50 61 67 65 73 5b 5d 20 3d 20 7b 0a 20 20 stPages[] = {. 7750: 20 20 20 22 68 6f 6d 65 22 2c 0a 20 20 20 20 20 "home",. 7760: 22 74 69 6d 65 6c 69 6e 65 22 2c 0a 20 20 20 20 "timeline",. 7770: 20 22 64 69 72 3f 63 69 3d 74 69 70 22 2c 0a 20 "dir?ci=tip",. 7780: 20 20 20 20 22 64 69 72 3f 63 69 3d 74 69 70 26 "dir?ci=tip& 7790: 74 79 70 65 3d 74 72 65 65 22 2c 0a 20 20 20 20 type=tree",. 77a0: 20 22 62 72 6c 69 73 74 22 2c 0a 20 20 20 20 20 "brlist",. 77b0: 22 69 6e 66 6f 2f 74 72 75 6e 6b 22 2c 0a 20 20 "info/trunk",. 77c0: 7d 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 };.. /* Figure 77d0: 6f 75 74 20 77 68 69 63 68 20 73 6b 69 6e 20 77 out which skin w 77e0: 65 20 61 72 65 20 65 64 69 74 69 6e 67 20 2a 2f e are editing */ 77f0: 0a 20 20 69 53 6b 69 6e 20 3d 20 61 74 6f 69 28 . iSkin = atoi( 7800: 50 44 28 22 73 6b 22 2c 22 31 22 29 29 3b 0a 20 PD("sk","1"));. 7810: 20 69 66 28 20 69 53 6b 69 6e 3c 31 20 7c 7c 20 if( iSkin<1 || 7820: 69 53 6b 69 6e 3e 39 20 29 20 69 53 6b 69 6e 20 iSkin>9 ) iSkin 7830: 3d 20 31 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72 = 1;.. /* Figur 7840: 65 20 6f 75 74 20 69 66 20 74 68 65 20 63 75 72 e out if the cur 7850: 72 65 6e 74 20 75 73 65 72 20 69 73 20 61 6c 6c rent user is all 7860: 6f 77 65 64 20 74 6f 20 6d 61 6b 65 20 61 64 6d owed to make adm 7870: 69 6e 69 73 74 72 61 74 69 76 65 0a 20 20 2a 2a inistrative. ** 7880: 20 63 68 61 6e 67 65 73 20 61 6e 64 2f 6f 72 20 changes and/or 7890: 65 64 69 74 73 0a 20 20 2a 2f 0a 20 20 6c 6f 67 edits. */. log 78a0: 69 6e 5f 63 68 65 63 6b 5f 63 72 65 64 65 6e 74 in_check_credent 78b0: 69 61 6c 73 28 29 3b 0a 20 20 69 66 28 20 21 6c ials();. if( !l 78c0: 6f 67 69 6e 5f 69 73 5f 69 6e 64 69 76 69 64 75 ogin_is_individu 78d0: 61 6c 28 29 20 29 7b 0a 20 20 20 20 6c 6f 67 69 al() ){. logi 78e0: 6e 5f 6e 65 65 64 65 64 28 30 29 3b 0a 20 20 20 n_needed(0);. 78f0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 7a return;. }. z 7900: 41 6c 6c 6f 77 65 64 45 64 69 74 6f 72 73 20 3d AllowedEditors = 7910: 20 64 62 5f 67 65 74 5f 6d 70 72 69 6e 74 66 28 db_get_mprintf( 7920: 22 22 2c 20 22 64 72 61 66 74 25 64 2d 75 73 65 "", "draft%d-use 7930: 72 73 22 2c 20 69 53 6b 69 6e 29 3b 0a 20 20 69 rs", iSkin);. i 7940: 66 28 20 67 2e 70 65 72 6d 2e 41 64 6d 69 6e 20 f( g.perm.Admin 7950: 29 7b 0a 20 20 20 20 69 73 53 65 74 75 70 20 3d ){. isSetup = 7960: 20 69 73 45 64 69 74 6f 72 20 3d 20 31 3b 0a 20 isEditor = 1;. 7970: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 47 6c 6f 62 }else{. Glob 7980: 20 2a 70 41 6c 6c 6f 77 65 64 45 64 69 74 6f 72 *pAllowedEditor 7990: 73 3b 0a 20 20 20 20 69 73 53 65 74 75 70 20 3d s;. isSetup = 79a0: 20 69 73 45 64 69 74 6f 72 20 3d 20 30 3b 0a 20 isEditor = 0;. 79b0: 20 20 20 69 66 28 20 7a 41 6c 6c 6f 77 65 64 45 if( zAllowedE 79c0: 64 69 74 6f 72 73 5b 30 5d 20 29 7b 0a 20 20 20 ditors[0] ){. 79d0: 20 20 20 70 41 6c 6c 6f 77 65 64 45 64 69 74 6f pAllowedEdito 79e0: 72 73 20 3d 20 67 6c 6f 62 5f 63 72 65 61 74 65 rs = glob_create 79f0: 28 7a 41 6c 6c 6f 77 65 64 45 64 69 74 6f 72 73 (zAllowedEditors 7a00: 29 3b 0a 20 20 20 20 20 20 69 73 45 64 69 74 6f );. isEdito 7a10: 72 20 3d 20 67 6c 6f 62 5f 6d 61 74 63 68 28 70 r = glob_match(p 7a20: 41 6c 6c 6f 77 65 64 45 64 69 74 6f 72 73 2c 20 AllowedEditors, 7a30: 67 2e 7a 4c 6f 67 69 6e 29 3b 0a 20 20 20 20 20 g.zLogin);. 7a40: 20 67 6c 6f 62 5f 66 72 65 65 28 70 41 6c 6c 6f glob_free(pAllo 7a50: 77 65 64 45 64 69 74 6f 72 73 29 3b 0a 20 20 20 wedEditors);. 7a60: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 }. }.. /* Ini 7a70: 74 69 61 6c 69 7a 65 20 74 68 65 20 73 6b 69 6e tialize the skin 7a80: 2c 20 69 66 20 72 65 71 75 65 73 74 65 64 20 61 , if requested a 7a90: 6e 64 20 61 75 74 68 6f 72 69 7a 65 64 2e 20 2a nd authorized. * 7aa0: 2f 0a 20 20 69 66 28 20 50 28 22 69 6e 69 74 33 /. if( P("init3 7ab0: 22 29 21 3d 30 20 26 26 20 69 73 45 64 69 74 6f ")!=0 && isEdito 7ac0: 72 20 29 7b 0a 20 20 20 20 73 6b 69 6e 5f 69 6e r ){. skin_in 7ad0: 69 74 69 61 6c 69 7a 65 5f 64 72 61 66 74 28 69 itialize_draft(i 7ae0: 53 6b 69 6e 2c 20 50 28 22 69 6e 69 74 73 6b 69 Skin, P("initski 7af0: 6e 22 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 n"));. }. if( 7b00: 50 28 22 73 75 62 6d 69 74 32 22 29 21 3d 30 20 P("submit2")!=0 7b10: 26 26 20 69 73 53 65 74 75 70 20 29 7b 0a 20 20 && isSetup ){. 7b20: 20 20 64 62 5f 73 65 74 5f 6d 70 72 69 6e 74 66 db_set_mprintf 7b30: 28 50 44 28 22 65 64 69 74 6f 72 73 22 2c 22 22 (PD("editors","" 7b40: 29 2c 20 30 2c 20 22 64 72 61 66 74 25 64 2d 75 ), 0, "draft%d-u 7b50: 73 65 72 73 22 2c 20 69 53 6b 69 6e 29 3b 0a 20 sers", iSkin);. 7b60: 20 20 20 7a 41 6c 6c 6f 77 65 64 45 64 69 74 6f zAllowedEdito 7b70: 72 73 20 3d 20 64 62 5f 67 65 74 5f 6d 70 72 69 rs = db_get_mpri 7b80: 6e 74 66 28 22 22 2c 20 22 64 72 61 66 74 25 64 ntf("", "draft%d 7b90: 2d 75 73 65 72 73 22 2c 20 69 53 6b 69 6e 29 3b -users", iSkin); 7ba0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 75 62 6c 69 . }.. /* Publi 7bb0: 73 68 20 74 68 65 20 64 72 61 66 74 20 73 6b 69 sh the draft ski 7bc0: 6e 20 2a 2f 0a 20 20 69 66 28 20 50 28 22 70 75 n */. if( P("pu 7bd0: 62 37 22 29 21 3d 30 20 26 26 20 50 42 28 22 70 b7")!=0 && PB("p 7be0: 75 62 37 63 6b 31 22 29 20 26 26 20 50 42 28 22 ub7ck1") && PB(" 7bf0: 70 75 62 37 63 6b 32 22 29 20 29 7b 0a 20 20 20 pub7ck2") ){. 7c00: 20 73 6b 69 6e 5f 70 75 62 6c 69 73 68 28 69 53 skin_publish(iS 7c10: 6b 69 6e 29 3b 0a 20 20 7d 0a 0a 20 20 73 74 79 kin);. }.. sty 7c20: 6c 65 5f 73 65 74 5f 63 75 72 72 65 6e 74 5f 66 le_set_current_f 7c30: 65 61 74 75 72 65 28 22 73 6b 69 6e 73 22 29 3b eature("skins"); 7c40: 0a 20 20 73 74 79 6c 65 5f 68 65 61 64 65 72 28 . style_header( 7c50: 22 43 75 73 74 6f 6d 69 7a 65 20 53 6b 69 6e 22 "Customize Skin" 7c60: 29 3b 0a 0a 20 20 40 20 3c 70 3e 43 75 73 74 6f );.. @ <p>Custo 7c70: 6d 69 7a 65 20 74 68 65 20 6c 6f 6f 6b 20 6f 66 mize the look of 7c80: 20 74 68 69 73 20 46 6f 73 73 69 6c 20 72 65 70 this Fossil rep 7c90: 6f 73 69 74 6f 72 79 20 62 79 20 6d 61 6b 69 6e ository by makin 7ca0: 67 20 63 68 61 6e 67 65 73 0a 20 20 40 20 74 6f g changes. @ to 7cb0: 20 74 68 65 20 43 53 53 2c 20 48 65 61 64 65 72 the CSS, Header 7cc0: 2c 20 46 6f 6f 74 65 72 2c 20 61 6e 64 20 44 65 , Footer, and De 7cd0: 74 61 69 6c 20 53 65 74 74 69 6e 67 73 20 69 6e tail Settings in 7ce0: 20 6f 6e 65 20 6f 66 20 6e 69 6e 65 20 22 64 72 one of nine "dr 7cf0: 61 66 74 22 0a 20 20 40 20 63 6f 6e 66 69 67 75 aft". @ configu 7d00: 72 61 74 69 6f 6e 73 2e 20 20 54 68 65 6e 2c 20 rations. Then, 7d10: 61 66 74 65 72 20 76 65 72 69 66 79 69 6e 67 20 after verifying 7d20: 74 68 61 74 20 61 6c 6c 20 69 73 20 77 6f 72 6b that all is work 7d30: 69 6e 67 20 63 6f 72 72 65 63 74 6c 79 2c 0a 20 ing correctly,. 7d40: 20 40 20 70 75 62 6c 69 73 68 20 74 68 65 20 64 @ publish the d 7d50: 72 61 66 74 20 74 6f 20 62 65 63 6f 6d 65 20 74 raft to become t 7d60: 68 65 20 6e 65 77 20 6d 61 69 6e 20 53 6b 69 6e he new main Skin 7d70: 2e 20 55 73 65 72 73 20 63 61 6e 20 73 65 6c 65 . Users can sele 7d80: 63 74 20 61 20 73 6b 69 6e 0a 20 20 40 20 6f 66 ct a skin. @ of 7d90: 20 74 68 65 69 72 20 63 68 6f 69 63 65 20 66 72 their choice fr 7da0: 6f 6d 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 om the built-in 7db0: 6f 6e 65 73 20 6f 72 20 74 68 65 20 6c 6f 63 61 ones or the loca 7dc0: 6c 6c 79 2d 65 64 69 74 65 64 20 6f 6e 65 20 76 lly-edited one v 7dd0: 69 61 0a 20 20 40 20 3c 61 20 68 72 65 66 3d 27 ia. @ <a href=' 7de0: 25 52 2f 73 6b 69 6e 73 27 3e 74 68 65 20 2f 73 %R/skins'>the /s 7df0: 6b 69 6e 73 20 70 61 67 65 3c 2f 61 3e 2e 3c 2f kins page</a>.</ 7e00: 70 3e 0a 20 20 40 0a 20 20 40 20 3c 61 20 6e 61 p>. @. @ <a na 7e10: 6d 65 3d 27 73 74 65 70 31 27 3e 3c 2f 61 3e 0a me='step1'></a>. 7e20: 20 20 40 20 3c 68 31 3e 53 74 65 70 20 31 3a 20 @ <h1>Step 1: 7e30: 49 64 65 6e 74 69 66 79 20 57 68 69 63 68 20 44 Identify Which D 7e40: 72 61 66 74 20 54 6f 20 55 73 65 3c 2f 68 31 3e raft To Use</h1> 7e50: 0a 20 20 40 0a 20 20 40 20 3c 70 3e 54 68 65 20 . @. @ <p>The 7e60: 6d 61 69 6e 20 73 6b 69 6e 20 6f 66 20 46 6f 73 main skin of Fos 7e70: 73 69 6c 20 63 61 6e 6e 6f 74 20 62 65 20 65 64 sil cannot be ed 7e80: 69 74 65 64 20 64 69 72 65 63 74 6c 79 2e 20 20 ited directly. 7e90: 49 6e 73 74 65 61 64 2c 0a 20 20 40 20 65 64 69 Instead,. @ edi 7ea0: 74 73 20 61 72 65 20 6d 61 64 65 20 74 6f 20 6f ts are made to o 7eb0: 6e 65 20 6f 66 20 6e 69 6e 65 20 64 72 61 66 74 ne of nine draft 7ec0: 20 73 6b 69 6e 73 2e 20 20 41 20 64 72 61 66 74 skins. A draft 7ed0: 20 73 6b 69 6e 20 63 61 6e 20 74 68 65 6e 0a 20 skin can then. 7ee0: 20 40 20 62 65 20 70 75 62 6c 69 73 68 65 64 20 @ be published 7ef0: 74 6f 20 62 65 63 6f 6d 65 20 74 68 65 20 64 65 to become the de 7f00: 66 61 75 6c 74 20 73 6b 69 6e 2e 0a 20 20 40 20 fault skin.. @ 7f10: 4e 69 6e 65 20 73 65 70 61 72 61 74 65 20 64 72 Nine separate dr 7f20: 61 66 74 73 20 61 72 65 20 61 76 61 69 6c 61 62 afts are availab 7f30: 6c 65 20 74 6f 20 66 61 63 69 6c 69 74 61 74 65 le to facilitate 7f40: 20 41 2f 42 20 74 65 73 74 69 6e 67 2e 3c 2f 70 A/B testing.</p 7f50: 3e 0a 20 20 40 0a 20 20 40 20 3c 66 6f 72 6d 20 >. @. @ <form 7f60: 6d 65 74 68 6f 64 3d 27 50 4f 53 54 27 20 61 63 method='POST' ac 7f70: 74 69 6f 6e 3d 27 25 52 2f 73 65 74 75 70 5f 73 tion='%R/setup_s 7f80: 6b 69 6e 23 73 74 65 70 32 27 20 69 64 3d 27 66 kin#step2' id='f 7f90: 30 31 27 3e 0a 20 20 40 20 3c 70 20 63 6c 61 73 01'>. @ <p clas 7fa0: 73 3d 27 73 6b 69 6e 49 6e 70 75 74 27 3e 44 72 s='skinInput'>Dr 7fb0: 61 66 74 20 73 6b 69 6e 20 74 6f 20 65 64 69 74 aft skin to edit 7fc0: 3a 0a 20 20 40 20 3c 73 65 6c 65 63 74 20 73 69 :. @ <select si 7fd0: 7a 65 3d 27 31 27 20 6e 61 6d 65 3d 27 73 6b 27 ze='1' name='sk' 7fe0: 20 69 64 3d 27 73 6b 53 74 65 70 31 27 3e 0a 20 id='skStep1'>. 7ff0: 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 39 3b 20 for(i=1; i<=9; 8000: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 3d i++){. if( i= 8010: 3d 69 53 6b 69 6e 20 29 7b 0a 20 20 20 20 20 20 =iSkin ){. 8020: 40 20 3c 6f 70 74 69 6f 6e 20 76 61 6c 75 65 3d @ <option value= 8030: 27 25 64 28 69 29 27 20 73 65 6c 65 63 74 65 64 '%d(i)' selected 8040: 3e 64 72 61 66 74 25 64 28 69 29 3c 2f 6f 70 74 >draft%d(i)</opt 8050: 69 6f 6e 3e 0a 20 20 20 20 7d 65 6c 73 65 7b 0a ion>. }else{. 8060: 20 20 20 20 20 20 40 20 3c 6f 70 74 69 6f 6e 20 @ <option 8070: 76 61 6c 75 65 3d 27 25 64 28 69 29 27 3e 64 72 value='%d(i)'>dr 8080: 61 66 74 25 64 28 69 29 3c 2f 6f 70 74 69 6f 6e aft%d(i)</option 8090: 3e 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 40 20 >. }. }. @ 80a0: 3c 2f 73 65 6c 65 63 74 3e 0a 20 20 40 20 3c 2f </select>. @ </ 80b0: 70 3e 0a 20 20 40 20 3c 2f 66 6f 72 6d 3e 0a 20 p>. @ </form>. 80c0: 20 40 0a 20 20 40 20 3c 61 20 6e 61 6d 65 3d 27 @. @ <a name=' 80d0: 73 74 65 70 32 27 3e 3c 2f 61 3e 0a 20 20 40 20 step2'></a>. @ 80e0: 3c 68 31 3e 53 74 65 70 20 32 3a 20 41 75 74 68 <h1>Step 2: Auth 80f0: 65 6e 74 69 63 61 74 65 3c 2f 68 31 3e 0a 20 20 enticate</h1>. 8100: 40 0a 20 20 69 66 28 20 69 73 53 65 74 75 70 20 @. if( isSetup 8110: 29 7b 0a 20 20 20 20 40 20 3c 70 3e 41 73 20 61 ){. @ <p>As a 8120: 6e 20 61 64 6d 69 6e 69 73 74 72 61 74 6f 72 2c n administrator, 8130: 20 79 6f 75 20 63 61 6e 20 6d 61 6b 65 20 61 6e you can make an 8140: 79 20 65 64 69 74 73 20 79 6f 75 20 6c 69 6b 65 y edits you like 8150: 20 74 6f 20 74 68 69 73 20 6f 72 0a 20 20 20 20 to this or. 8160: 40 20 61 6e 79 20 6f 74 68 65 72 20 73 6b 69 6e @ any other skin 8170: 2e 20 20 59 6f 75 20 63 61 6e 20 61 6c 73 6f 20 . You can also 8180: 61 75 74 68 6f 72 69 7a 65 20 6f 74 68 65 72 20 authorize other 8190: 75 73 65 72 73 20 74 6f 20 65 64 69 74 20 74 68 users to edit th 81a0: 69 73 0a 20 20 20 20 40 20 73 6b 69 6e 2e 20 20 is. @ skin. 81b0: 41 6e 79 20 75 73 65 72 20 77 68 6f 73 65 20 6c Any user whose l 81c0: 6f 67 69 6e 20 6e 61 6d 65 20 6d 61 74 63 68 65 ogin name matche 81d0: 73 20 74 68 65 20 63 6f 6d 6d 61 2d 73 65 70 61 s the comma-sepa 81e0: 72 61 74 65 64 20 6c 69 73 74 0a 20 20 20 20 40 rated list. @ 81f0: 20 6f 66 20 47 4c 4f 42 20 65 78 70 72 65 73 73 of GLOB express 8200: 69 6f 6e 73 20 62 65 6c 6f 77 20 69 73 20 67 69 ions below is gi 8210: 76 65 6e 20 73 70 65 63 69 61 6c 20 70 65 72 6d ven special perm 8220: 69 73 73 69 6f 6e 20 74 6f 20 65 64 69 74 0a 20 ission to edit. 8230: 20 20 20 40 20 74 68 65 20 64 72 61 66 74 25 64 @ the draft%d 8240: 28 69 53 6b 69 6e 29 20 73 6b 69 6e 3a 0a 20 20 (iSkin) skin:. 8250: 20 20 40 0a 20 20 20 20 40 20 3c 66 6f 72 6d 20 @. @ <form 8260: 6d 65 74 68 6f 64 3d 27 50 4f 53 54 27 20 61 63 method='POST' ac 8270: 74 69 6f 6e 3d 27 25 52 2f 73 65 74 75 70 5f 73 tion='%R/setup_s 8280: 6b 69 6e 23 73 74 65 70 32 27 20 69 64 3d 27 66 kin#step2' id='f 8290: 30 32 27 3e 0a 20 20 20 20 40 20 3c 70 20 63 6c 02'>. @ <p cl 82a0: 61 73 73 3d 27 73 6b 69 6e 49 6e 70 75 74 27 3e ass='skinInput'> 82b0: 0a 20 20 20 20 40 20 3c 69 6e 70 75 74 20 74 79 . @ <input ty 82c0: 70 65 3d 27 68 69 64 64 65 6e 27 20 6e 61 6d 65 pe='hidden' name 82d0: 3d 27 73 6b 27 20 76 61 6c 75 65 3d 27 25 64 28 ='sk' value='%d( 82e0: 69 53 6b 69 6e 29 27 3e 0a 20 20 20 20 40 20 41 iSkin)'>. @ A 82f0: 75 74 68 6f 72 69 7a 65 64 20 65 64 69 74 6f 72 uthorized editor 8300: 73 20 66 6f 72 20 73 6b 69 6e 20 64 72 61 66 74 s for skin draft 8310: 25 64 28 69 53 6b 69 6e 29 3a 0a 20 20 20 20 40 %d(iSkin):. @ 8320: 20 3c 69 6e 70 75 74 20 74 79 70 65 3d 27 74 65 <input type='te 8330: 78 74 27 20 6e 61 6d 65 3d 27 65 64 69 74 6f 72 xt' name='editor 8340: 73 27 20 76 61 6c 75 65 3d 27 25 68 28 7a 41 6c s' value='%h(zAl 8350: 6c 6f 77 65 64 45 64 69 74 6f 72 73 29 27 5c 0a lowedEditors)'\. 8360: 20 20 20 20 40 20 20 77 69 64 74 68 3d 27 34 30 @ width='40 8370: 27 3e 0a 20 20 20 20 40 20 3c 69 6e 70 75 74 20 '>. @ <input 8380: 74 79 70 65 3d 27 73 75 62 6d 69 74 27 20 6e 61 type='submit' na 8390: 6d 65 3d 27 73 75 62 6d 69 74 32 27 20 76 61 6c me='submit2' val 83a0: 75 65 3d 27 43 68 61 6e 67 65 27 3e 0a 20 20 20 ue='Change'>. 83b0: 20 40 20 3c 2f 70 3e 0a 20 20 20 20 40 20 3c 2f @ </p>. @ </ 83c0: 66 6f 72 6d 3e 0a 20 20 7d 65 6c 73 65 20 69 66 form>. }else if 83d0: 28 20 69 73 45 64 69 74 6f 72 20 29 7b 0a 20 20 ( isEditor ){. 83e0: 20 20 40 20 3c 70 3e 59 6f 75 20 61 72 65 20 61 @ <p>You are a 83f0: 75 74 68 6f 72 69 7a 65 64 20 74 6f 20 6d 61 6b uthorized to mak 8400: 65 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 e changes to the 8410: 20 64 72 61 66 74 25 64 28 69 53 6b 69 6e 29 20 draft%d(iSkin) 8420: 73 6b 69 6e 2e 0a 20 20 20 20 40 20 43 6f 6e 74 skin.. @ Cont 8430: 69 6e 75 65 20 74 6f 20 74 68 65 20 3c 61 20 68 inue to the <a h 8440: 72 65 66 3d 27 23 73 74 65 70 33 27 3e 6e 65 78 ref='#step3'>nex 8450: 74 20 73 74 65 70 3c 2f 61 3e 2e 3c 2f 70 3e 0a t step</a>.</p>. 8460: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 40 20 3c }else{. @ < 8470: 70 3e 59 6f 75 20 61 72 65 20 6e 6f 74 20 61 75 p>You are not au 8480: 74 68 6f 72 69 7a 65 64 20 74 6f 20 6d 61 6b 65 thorized to make 8490: 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 changes to the 84a0: 64 72 61 66 74 25 64 28 69 53 6b 69 6e 29 0a 20 draft%d(iSkin). 84b0: 20 20 20 40 20 73 6b 69 6e 2e 20 20 43 6f 6e 74 @ skin. Cont 84c0: 61 63 74 20 74 68 65 20 61 64 6d 69 6e 69 73 74 act the administ 84d0: 72 61 74 6f 72 20 6f 66 20 74 68 69 73 20 46 6f rator of this Fo 84e0: 73 73 69 6c 20 72 65 70 6f 73 69 74 6f 72 79 20 ssil repository 84f0: 66 6f 72 0a 20 20 20 20 40 20 66 75 72 74 68 65 for. @ furthe 8500: 72 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 3c 2f r information.</ 8510: 70 3e 0a 20 20 7d 0a 20 20 40 0a 20 20 40 20 3c p>. }. @. @ < 8520: 61 20 6e 61 6d 65 3d 27 73 74 65 70 33 27 3e 3c a name='step3'>< 8530: 2f 61 3e 0a 20 20 40 20 3c 68 31 3e 53 74 65 70 /a>. @ <h1>Step 8540: 20 33 3a 20 49 6e 69 74 69 61 6c 69 7a 65 20 54 3: Initialize T 8550: 68 65 20 44 72 61 66 74 3c 2f 68 31 3e 0a 20 20 he Draft</h1>. 8560: 40 0a 20 20 69 66 28 20 21 69 73 45 64 69 74 6f @. if( !isEdito 8570: 72 20 29 7b 0a 20 20 20 20 40 20 3c 70 3e 59 6f r ){. @ <p>Yo 8580: 75 20 61 72 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 u are not allowe 8590: 64 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 d to initialize 85a0: 64 72 61 66 74 25 64 28 69 53 6b 69 6e 29 2e 20 draft%d(iSkin). 85b0: 20 43 6f 6e 74 61 63 74 0a 20 20 20 20 40 20 74 Contact. @ t 85c0: 68 65 20 61 64 6d 69 6e 69 73 74 72 61 74 6f 72 he administrator 85d0: 20 66 6f 72 20 74 68 69 73 20 72 65 70 6f 73 69 for this reposi 85e0: 74 6f 72 79 20 66 6f 72 20 6d 6f 72 65 20 69 6e tory for more in 85f0: 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 7d 65 6c formation.. }el 8600: 73 65 7b 0a 20 20 20 20 40 20 3c 70 3e 49 6e 69 se{. @ <p>Ini 8610: 74 69 61 6c 69 7a 65 20 74 68 65 20 64 72 61 66 tialize the draf 8620: 74 25 64 28 69 53 6b 69 6e 29 20 73 6b 69 6e 20 t%d(iSkin) skin 8630: 74 6f 20 6f 6e 65 20 6f 66 20 74 68 65 20 62 75 to one of the bu 8640: 69 6c 74 2d 69 6e 20 73 6b 69 6e 73 0a 20 20 20 ilt-in skins. 8650: 20 40 20 6f 72 20 61 20 70 72 65 65 78 69 73 74 @ or a preexist 8660: 69 6e 67 20 73 6b 69 6e 2c 20 74 6f 20 75 73 65 ing skin, to use 8670: 20 61 73 20 61 20 62 61 73 65 6c 69 6e 65 2e 3c as a baseline.< 8680: 2f 70 3e 0a 20 20 20 20 40 0a 20 20 20 20 40 20 /p>. @. @ 8690: 3c 66 6f 72 6d 20 6d 65 74 68 6f 64 3d 27 50 4f <form method='PO 86a0: 53 54 27 20 61 63 74 69 6f 6e 3d 27 25 52 2f 73 ST' action='%R/s 86b0: 65 74 75 70 5f 73 6b 69 6e 23 73 74 65 70 34 27 etup_skin#step4' 86c0: 20 69 64 3d 27 66 30 33 27 3e 0a 20 20 20 20 40 id='f03'>. @ 86d0: 20 3c 70 20 63 6c 61 73 73 3d 27 73 6b 69 6e 49 <p class='skinI 86e0: 6e 70 75 74 27 3e 0a 20 20 20 20 40 20 3c 69 6e nput'>. @ <in 86f0: 70 75 74 20 74 79 70 65 3d 27 68 69 64 64 65 6e put type='hidden 8700: 27 20 6e 61 6d 65 3d 27 73 6b 27 20 76 61 6c 75 ' name='sk' valu 8710: 65 3d 27 25 64 28 69 53 6b 69 6e 29 27 3e 0a 20 e='%d(iSkin)'>. 8720: 20 20 20 40 20 49 6e 69 74 69 61 6c 69 7a 65 20 @ Initialize 8730: 73 6b 69 6e 20 3c 62 3e 64 72 61 66 74 25 64 28 skin <b>draft%d( 8740: 69 53 6b 69 6e 29 3c 2f 62 3e 20 75 73 69 6e 67 iSkin)</b> using 8750: 0a 20 20 20 20 73 6b 69 6e 5f 65 6d 69 74 5f 73 . skin_emit_s 8760: 6b 69 6e 5f 73 65 6c 65 63 74 6f 72 28 22 69 6e kin_selector("in 8770: 69 74 73 6b 69 6e 22 2c 20 22 63 75 72 72 65 6e itskin", "curren 8780: 74 22 2c 20 30 29 3b 0a 20 20 20 20 40 20 3c 69 t", 0);. @ <i 8790: 6e 70 75 74 20 74 79 70 65 3d 27 73 75 62 6d 69 nput type='submi 87a0: 74 27 20 6e 61 6d 65 3d 27 69 6e 69 74 33 27 20 t' name='init3' 87b0: 76 61 6c 75 65 3d 27 47 6f 27 3e 0a 20 20 20 20 value='Go'>. 87c0: 40 20 3c 2f 70 3e 0a 20 20 20 20 40 20 3c 2f 66 @ </p>. @ </f 87d0: 6f 72 6d 3e 0a 20 20 7d 0a 20 20 40 0a 20 20 40 orm>. }. @. @ 87e0: 20 3c 61 20 6e 61 6d 65 3d 27 73 74 65 70 34 27 <a name='step4' 87f0: 3e 3c 2f 61 3e 0a 20 20 40 20 3c 68 31 3e 53 74 ></a>. @ <h1>St 8800: 65 70 20 34 3a 20 4d 61 6b 65 20 45 64 69 74 73 ep 4: Make Edits 8810: 3c 2f 68 31 3e 0a 20 20 40 0a 20 20 69 66 28 20 </h1>. @. if( 8820: 21 69 73 45 64 69 74 6f 72 20 29 7b 0a 20 20 20 !isEditor ){. 8830: 20 40 20 3c 70 3e 59 6f 75 20 61 72 65 20 6e 6f @ <p>You are no 8840: 74 20 61 75 74 68 6f 72 69 7a 65 64 20 74 6f 20 t authorized to 8850: 6d 61 6b 65 20 65 64 69 74 73 20 74 6f 20 74 68 make edits to th 8860: 65 20 64 72 61 66 74 25 64 28 69 53 6b 69 6e 29 e draft%d(iSkin) 8870: 20 73 6b 69 6e 2e 0a 20 20 20 20 40 20 43 6f 6e skin.. @ Con 8880: 74 61 63 74 20 74 68 65 20 61 64 6d 69 6e 69 73 tact the adminis 8890: 74 72 61 74 6f 72 20 6f 66 20 74 68 69 73 20 46 trator of this F 88a0: 6f 73 73 69 6c 20 72 65 70 6f 73 69 74 6f 72 79 ossil repository 88b0: 20 66 6f 72 20 68 65 6c 70 2e 3c 2f 70 3e 0a 20 for help.</p>. 88c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 40 20 3c 70 }else{. @ <p 88d0: 3e 45 64 69 74 20 74 68 65 20 63 6f 6d 70 6f 6e >Edit the compon 88e0: 65 6e 74 73 20 6f 66 20 74 68 65 20 64 72 61 66 ents of the draf 88f0: 74 25 64 28 69 53 6b 69 6e 29 20 73 6b 69 6e 3a t%d(iSkin) skin: 8900: 0a 20 20 20 20 40 20 3c 75 6c 3e 0a 20 20 20 20 . @ <ul>. 8910: 40 20 3c 6c 69 3e 3c 61 20 68 72 65 66 3d 27 25 @ <li><a href='% 8920: 52 2f 73 65 74 75 70 5f 73 6b 69 6e 65 64 69 74 R/setup_skinedit 8930: 3f 77 3d 30 26 73 6b 3d 25 64 28 69 53 6b 69 6e ?w=0&sk=%d(iSkin 8940: 29 27 20 74 61 72 67 65 74 3d 27 5f 62 6c 61 6e )' target='_blan 8950: 6b 27 3e 43 53 53 3c 2f 61 3e 0a 20 20 20 20 40 k'>CSS</a>. @ 8960: 20 3c 6c 69 3e 3c 61 20 68 72 65 66 3d 27 25 52 <li><a href='%R 8970: 2f 73 65 74 75 70 5f 73 6b 69 6e 65 64 69 74 3f /setup_skinedit? 8980: 77 3d 32 26 73 6b 3d 25 64 28 69 53 6b 69 6e 29 w=2&sk=%d(iSkin) 8990: 27 20 74 61 72 67 65 74 3d 27 5f 62 6c 61 6e 6b ' target='_blank 89a0: 27 3e 5c 0a 20 20 20 20 40 20 48 65 61 64 65 72 '>\. @ Header 89b0: 3c 2f 61 3e 0a 20 20 20 20 40 20 3c 6c 69 3e 3c </a>. @ <li>< 89c0: 61 20 68 72 65 66 3d 27 25 52 2f 73 65 74 75 70 a href='%R/setup 89d0: 5f 73 6b 69 6e 65 64 69 74 3f 77 3d 31 26 73 6b _skinedit?w=1&sk 89e0: 3d 25 64 28 69 53 6b 69 6e 29 27 20 74 61 72 67 =%d(iSkin)' targ 89f0: 65 74 3d 27 5f 62 6c 61 6e 6b 27 3e 5c 0a 20 20 et='_blank'>\. 8a00: 20 20 40 20 46 6f 6f 74 65 72 3c 2f 61 3e 0a 20 @ Footer</a>. 8a10: 20 20 20 40 20 3c 6c 69 3e 3c 61 20 68 72 65 66 @ <li><a href 8a20: 3d 27 25 52 2f 73 65 74 75 70 5f 73 6b 69 6e 65 ='%R/setup_skine 8a30: 64 69 74 3f 77 3d 33 26 73 6b 3d 25 64 28 69 53 dit?w=3&sk=%d(iS 8a40: 6b 69 6e 29 27 20 74 61 72 67 65 74 3d 27 5f 62 kin)' target='_b 8a50: 6c 61 6e 6b 27 3e 5c 0a 20 20 20 20 40 20 44 65 lank'>\. @ De 8a60: 74 61 69 6c 73 3c 2f 61 3e 0a 20 20 20 20 40 20 tails</a>. @ 8a70: 3c 6c 69 3e 3c 61 20 68 72 65 66 3d 27 25 52 2f <li><a href='%R/ 8a80: 73 65 74 75 70 5f 73 6b 69 6e 65 64 69 74 3f 77 setup_skinedit?w 8a90: 3d 34 26 73 6b 3d 25 64 28 69 53 6b 69 6e 29 27 =4&sk=%d(iSkin)' 8aa0: 20 74 61 72 67 65 74 3d 27 5f 62 6c 61 6e 6b 27 target='_blank' 8ab0: 3e 5c 0a 20 20 20 20 40 20 4a 61 76 61 73 63 72 >\. @ Javascr 8ac0: 69 70 74 3c 2f 61 3e 20 28 6f 70 74 69 6f 6e 61 ipt</a> (optiona 8ad0: 6c 29 0a 20 20 20 20 40 20 3c 2f 75 6c 3e 0a 20 l). @ </ul>. 8ae0: 20 7d 0a 20 20 40 0a 20 20 40 20 3c 61 20 6e 61 }. @. @ <a na 8af0: 6d 65 3d 27 73 74 65 70 35 27 3e 3c 2f 61 3e 0a me='step5'></a>. 8b00: 20 20 40 20 3c 68 31 3e 53 74 65 70 20 35 3a 20 @ <h1>Step 5: 8b10: 56 65 72 69 66 79 20 54 68 65 20 44 72 61 66 74 Verify The Draft 8b20: 20 53 6b 69 6e 3c 2f 68 31 3e 0a 20 20 40 0a 20 Skin</h1>. @. 8b30: 20 40 20 3c 70 3e 54 6f 20 74 65 73 74 20 74 68 @ <p>To test th 8b40: 69 73 20 64 72 61 66 74 20 73 6b 69 6e 2c 20 69 is draft skin, i 8b50: 6e 73 65 72 74 20 74 65 78 74 20 22 2f 64 72 61 nsert text "/dra 8b60: 66 74 25 64 28 69 53 6b 69 6e 29 2f 22 20 6a 75 ft%d(iSkin)/" ju 8b70: 73 74 20 62 65 66 6f 72 65 20 74 68 65 0a 20 20 st before the. 8b80: 40 20 6f 70 65 72 61 74 69 6f 6e 20 6e 61 6d 65 @ operation name 8b90: 20 69 6e 20 74 68 65 20 55 52 4c 2e 20 20 48 65 in the URL. He 8ba0: 72 65 20 61 72 65 20 61 20 66 65 77 20 6c 69 6e re are a few lin 8bb0: 6b 73 20 74 6f 20 74 72 79 3a 0a 20 20 40 20 3c ks to try:. @ < 8bc0: 75 6c 3e 0a 20 20 69 66 28 20 69 44 72 61 66 74 ul>. if( iDraft 8bd0: 53 6b 69 6e 20 26 26 20 73 71 6c 69 74 65 33 5f Skin && sqlite3_ 8be0: 73 74 72 67 6c 6f 62 28 22 2a 2f 64 72 61 66 74 strglob("*/draft 8bf0: 5b 31 2d 39 5d 22 2c 20 67 2e 7a 42 61 73 65 55 [1-9]", g.zBaseU 8c00: 52 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 42 RL)==0 ){. zB 8c10: 61 73 65 20 3d 20 6d 70 72 69 6e 74 66 28 22 25 ase = mprintf("% 8c20: 2e 2a 73 2f 64 72 61 66 74 25 64 22 2c 20 28 69 .*s/draft%d", (i 8c30: 6e 74 29 73 74 72 6c 65 6e 28 67 2e 7a 42 61 73 nt)strlen(g.zBas 8c40: 65 55 52 4c 29 2d 37 2c 67 2e 7a 42 61 73 65 55 eURL)-7,g.zBaseU 8c50: 52 4c 2c 69 53 6b 69 6e 29 3b 0a 20 20 7d 65 6c RL,iSkin);. }el 8c60: 73 65 7b 0a 20 20 20 20 7a 42 61 73 65 20 3d 20 se{. zBase = 8c70: 6d 70 72 69 6e 74 66 28 22 25 73 2f 64 72 61 66 mprintf("%s/draf 8c80: 74 25 64 22 2c 20 67 2e 7a 42 61 73 65 55 52 4c t%d", g.zBaseURL 8c90: 2c 20 69 53 6b 69 6e 29 3b 0a 20 20 7d 0a 20 20 , iSkin);. }. 8ca0: 66 6f 72 28 69 3d 30 3b 20 69 3c 63 6f 75 6e 74 for(i=0; i<count 8cb0: 28 61 7a 54 65 73 74 50 61 67 65 73 29 3b 20 69 (azTestPages); i 8cc0: 2b 2b 29 7b 0a 20 20 20 20 40 20 3c 6c 69 3e 3c ++){. @ <li>< 8cd0: 61 20 68 72 65 66 3d 27 25 73 28 7a 42 61 73 65 a href='%s(zBase 8ce0: 29 2f 25 73 28 61 7a 54 65 73 74 50 61 67 65 73 )/%s(azTestPages 8cf0: 5b 69 5d 29 27 20 74 61 72 67 65 74 3d 27 5f 62 [i])' target='_b 8d00: 6c 61 6e 6b 27 3e 5c 0a 20 20 20 20 40 20 25 73 lank'>\. @ %s 8d10: 28 7a 42 61 73 65 29 2f 25 73 28 61 7a 54 65 73 (zBase)/%s(azTes 8d20: 74 50 61 67 65 73 5b 69 5d 29 3c 2f 61 3e 0a 20 tPages[i])</a>. 8d30: 20 7d 0a 20 20 66 6f 73 73 69 6c 5f 66 72 65 65 }. fossil_free 8d40: 28 7a 42 61 73 65 29 3b 0a 20 20 40 20 3c 2f 75 (zBase);. @ </u 8d50: 6c 3e 0a 20 20 40 0a 20 20 40 20 3c 70 3e 59 6f l>. @. @ <p>Yo 8d60: 75 20 77 69 6c 6c 20 70 72 6f 62 61 62 6c 79 20 u will probably 8d70: 6e 65 65 64 20 74 6f 20 70 72 65 73 73 20 52 65 need to press Re 8d80: 6c 6f 61 64 20 6f 6e 20 79 6f 75 72 20 62 72 6f load on your bro 8d90: 77 73 65 72 20 62 65 66 6f 72 65 20 61 6e 79 0a wser before any. 8da0: 20 20 40 20 43 53 53 20 63 68 61 6e 67 65 73 20 @ CSS changes 8db0: 77 69 6c 6c 20 74 61 6b 65 20 65 66 66 65 63 74 will take effect 8dc0: 2e 3c 2f 70 3e 0a 20 20 40 0a 20 20 40 20 3c 61 .</p>. @. @ <a 8dd0: 20 68 61 6d 65 3d 27 73 74 65 70 36 27 3e 3c 2f hame='step6'></ 8de0: 61 3e 0a 20 20 40 20 3c 68 31 3e 53 74 65 70 20 a>. @ <h1>Step 8df0: 36 3a 20 49 74 65 72 61 74 65 3c 2f 68 31 3e 0a 6: Iterate</h1>. 8e00: 20 20 40 0a 20 20 40 20 3c 70 3e 52 65 70 65 61 @. @ <p>Repea 8e10: 74 20 3c 61 20 68 72 65 66 3d 27 23 73 74 65 70 t <a href='#step 8e20: 34 27 3e 73 74 65 70 20 34 3c 2f 61 3e 20 61 6e 4'>step 4</a> an 8e30: 64 0a 20 20 40 20 3c 61 20 68 72 65 66 3d 27 23 d. @ <a href='# 8e40: 73 74 65 70 35 27 3e 73 74 65 70 20 35 3c 2f 61 step5'>step 5</a 8e50: 3e 20 61 73 20 6d 61 6e 79 20 74 69 6d 65 73 20 > as many times 8e60: 61 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 as necessary to 8e70: 63 72 65 61 74 65 0a 20 20 40 20 61 20 70 72 6f create. @ a pro 8e80: 64 75 63 74 69 6f 6e 2d 72 65 61 64 79 20 73 6b duction-ready sk 8e90: 69 6e 2e 0a 20 20 40 0a 20 20 40 20 3c 61 20 6e in.. @. @ <a n 8ea0: 61 6d 65 3d 27 73 74 65 70 37 27 3e 3c 2f 61 3e ame='step7'></a> 8eb0: 0a 20 20 40 20 3c 68 31 3e 53 74 65 70 20 37 3a . @ <h1>Step 7: 8ec0: 20 50 75 62 6c 69 73 68 3c 2f 68 31 3e 0a 20 20 Publish</h1>. 8ed0: 40 0a 20 20 69 66 28 20 21 67 2e 70 65 72 6d 2e @. if( !g.perm. 8ee0: 41 64 6d 69 6e 20 29 7b 0a 20 20 20 20 40 20 3c Admin ){. @ < 8ef0: 70 3e 4f 6e 6c 79 20 61 64 6d 69 6e 69 73 74 72 p>Only administr 8f00: 61 74 6f 72 73 20 61 72 65 20 61 6c 6c 6f 77 65 ators are allowe 8f10: 64 20 74 6f 20 70 75 62 6c 69 73 68 20 64 72 61 d to publish dra 8f20: 66 74 20 73 6b 69 6e 73 2e 20 20 43 6f 6e 74 61 ft skins. Conta 8f30: 63 74 0a 20 20 20 20 40 20 61 6e 20 61 64 6d 69 ct. @ an admi 8f40: 6e 69 73 74 72 61 74 6f 72 20 74 6f 20 67 65 74 nistrator to get 8f50: 20 74 68 69 73 20 22 64 72 61 66 74 25 64 28 69 this "draft%d(i 8f60: 53 6b 69 6e 29 22 20 73 6b 69 6e 20 70 75 62 6c Skin)" skin publ 8f70: 69 73 68 65 64 2e 3c 2f 70 3e 0a 20 20 7d 65 6c ished.</p>. }el 8f80: 73 65 7b 0a 20 20 20 20 40 20 3c 70 3e 57 68 65 se{. @ <p>Whe 8f90: 6e 20 74 68 65 20 64 72 61 66 74 25 64 28 69 53 n the draft%d(iS 8fa0: 6b 69 6e 29 20 73 6b 69 6e 20 69 73 20 72 65 61 kin) skin is rea 8fb0: 64 79 20 66 6f 72 20 70 72 6f 64 75 63 74 69 6f dy for productio 8fc0: 6e 20 75 73 65 2c 0a 20 20 20 20 40 20 6d 61 6b n use,. @ mak 8fd0: 65 20 69 74 20 74 68 65 20 64 65 66 61 75 6c 74 e it the default 8fe0: 20 73 6b 69 6e 20 62 79 20 63 6c 69 63 6b 69 6e skin by clickin 8ff0: 67 20 74 68 65 20 61 63 6b 6e 6f 77 6c 65 64 67 g the acknowledg 9000: 65 6d 65 6e 74 73 20 61 6e 64 0a 20 20 20 20 40 ements and. @ 9010: 20 70 72 65 73 73 69 6e 67 20 74 68 65 20 62 75 pressing the bu 9020: 74 74 6f 6e 20 62 65 6c 6f 77 3a 3c 2f 70 3e 0a tton below:</p>. 9030: 20 20 20 20 40 0a 20 20 20 20 40 20 3c 66 6f 72 @. @ <for 9040: 6d 20 6d 65 74 68 6f 64 3d 27 50 4f 53 54 27 20 m method='POST' 9050: 61 63 74 69 6f 6e 3d 27 25 52 2f 73 65 74 75 70 action='%R/setup 9060: 5f 73 6b 69 6e 23 73 74 65 70 37 27 3e 0a 20 20 _skin#step7'>. 9070: 20 20 40 20 3c 70 20 63 6c 61 73 73 3d 27 73 6b @ <p class='sk 9080: 69 6e 49 6e 70 75 74 27 3e 0a 20 20 20 20 40 20 inInput'>. @ 9090: 3c 69 6e 70 75 74 20 74 79 70 65 3d 27 68 69 64 <input type='hid 90a0: 64 65 6e 27 20 6e 61 6d 65 3d 27 73 6b 27 20 76 den' name='sk' v 90b0: 61 6c 75 65 3d 27 25 64 28 69 53 6b 69 6e 29 27 alue='%d(iSkin)' 90c0: 3e 0a 20 20 20 20 40 20 3c 69 6e 70 75 74 20 74 >. @ <input t 90d0: 79 70 65 3d 27 63 68 65 63 6b 62 6f 78 27 20 6e ype='checkbox' n 90e0: 61 6d 65 3d 27 70 75 62 37 63 6b 31 27 20 76 61 ame='pub7ck1' va 90f0: 6c 75 65 3d 27 79 65 73 27 3e 5c 0a 20 20 20 20 lue='yes'>\. 9100: 40 20 53 6b 69 6e 20 64 72 61 66 74 25 64 28 69 @ Skin draft%d(i 9110: 53 6b 69 6e 29 20 68 61 73 20 62 65 65 6e 20 74 Skin) has been t 9120: 65 73 74 65 64 20 61 6e 64 20 66 6f 75 6e 64 20 ested and found 9130: 72 65 61 64 79 20 66 6f 72 20 70 72 6f 64 75 63 ready for produc 9140: 74 69 6f 6e 2e 3c 62 72 3e 0a 20 20 20 20 40 20 tion.<br>. @ 9150: 3c 69 6e 70 75 74 20 74 79 70 65 3d 27 63 68 65 <input type='che 9160: 63 6b 62 6f 78 27 20 6e 61 6d 65 3d 27 70 75 62 ckbox' name='pub 9170: 37 63 6b 32 27 20 76 61 6c 75 65 3d 27 79 65 73 7ck2' value='yes 9180: 27 3e 5c 0a 20 20 20 20 40 20 54 68 65 20 63 75 '>\. @ The cu 9190: 72 72 65 6e 74 20 73 6b 69 6e 20 73 68 6f 75 6c rrent skin shoul 91a0: 64 20 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e d be overwritten 91b0: 20 77 69 74 68 20 64 72 61 66 74 25 64 28 69 53 with draft%d(iS 91c0: 6b 69 6e 29 2e 3c 62 72 3e 0a 20 20 20 20 40 20 kin).<br>. @ 91d0: 3c 69 6e 70 75 74 20 74 79 70 65 3d 27 73 75 62 <input type='sub 91e0: 6d 69 74 27 20 6e 61 6d 65 3d 27 70 75 62 37 27 mit' name='pub7' 91f0: 20 76 61 6c 75 65 3d 27 50 75 62 6c 69 73 68 20 value='Publish 9200: 44 72 61 66 74 25 64 28 69 53 6b 69 6e 29 27 3e Draft%d(iSkin)'> 9210: 0a 20 20 20 20 40 20 3c 2f 70 3e 3c 2f 66 6f 72 . @ </p></for 9220: 6d 3e 0a 20 20 20 20 40 0a 20 20 20 20 40 20 3c m>. @. @ < 9230: 70 3e 59 6f 75 20 77 69 6c 6c 20 70 72 6f 62 61 p>You will proba 9240: 62 6c 79 20 6e 65 65 64 20 74 6f 20 70 72 65 73 bly need to pres 9250: 73 20 52 65 6c 6f 61 64 20 6f 6e 20 79 6f 75 72 s Reload on your 9260: 20 62 72 6f 77 73 65 72 20 61 66 74 65 72 0a 20 browser after. 9270: 20 20 20 40 20 70 75 62 6c 69 73 68 69 6e 67 20 @ publishing 9280: 74 68 65 20 6e 65 77 20 73 6b 69 6e 2e 3c 2f 70 the new skin.</p 9290: 3e 0a 20 20 7d 0a 20 20 40 0a 20 20 40 20 3c 61 >. }. @. @ <a 92a0: 20 6e 61 6d 65 3d 27 73 74 65 70 38 27 3e 3c 2f name='step8'></ 92b0: 61 3e 0a 20 20 40 20 3c 68 31 3e 53 74 65 70 20 a>. @ <h1>Step 92c0: 38 3a 20 43 6c 65 61 6e 75 70 20 61 6e 64 20 55 8: Cleanup and U 92d0: 6e 64 6f 20 41 63 74 69 6f 6e 73 3c 2f 68 31 3e ndo Actions</h1> 92e0: 0a 20 20 40 0a 20 20 69 66 28 20 21 67 2e 70 65 . @. if( !g.pe 92f0: 72 6d 2e 41 64 6d 69 6e 20 29 7b 0a 20 20 20 20 rm.Admin ){. 9300: 40 20 3c 70 3e 41 64 6d 69 6e 69 73 74 72 61 74 @ <p>Administrat 9310: 6f 72 73 20 63 61 6e 20 6f 70 74 69 6f 6e 61 6c ors can optional 9320: 6c 79 20 73 61 76 65 20 6f 72 20 72 65 73 74 6f ly save or resto 9330: 72 65 20 6c 65 67 61 63 79 20 73 6b 69 6e 73 2c re legacy skins, 9340: 20 61 6e 64 2f 6f 72 0a 20 20 20 20 40 20 75 6e and/or. @ un 9350: 64 6f 20 61 20 70 72 69 6f 72 20 70 75 62 6c 69 do a prior publi 9360: 73 68 2e 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 sh.. }else{. 9370: 20 40 20 3c 70 3e 56 69 73 69 74 20 74 68 65 20 @ <p>Visit the 9380: 3c 61 20 68 72 65 66 3d 27 25 52 2f 73 65 74 75 <a href='%R/setu 9390: 70 5f 73 6b 69 6e 5f 61 64 6d 69 6e 27 3e 53 6b p_skin_admin'>Sk 93a0: 69 6e 20 41 64 6d 69 6e 3c 2f 61 3e 20 70 61 67 in Admin</a> pag 93b0: 65 0a 20 20 20 20 40 20 66 6f 72 20 63 6c 65 61 e. @ for clea 93c0: 6e 75 70 20 61 6e 64 20 72 65 63 6f 76 65 72 79 nup and recovery 93d0: 20 61 63 74 69 6f 6e 73 2e 0a 20 20 7d 0a 20 20 actions.. }. 93e0: 62 75 69 6c 74 69 6e 5f 72 65 71 75 65 73 74 5f builtin_request_ 93f0: 6a 73 28 22 73 6b 69 6e 2e 6a 73 22 29 3b 0a 20 js("skin.js");. 9400: 20 73 74 79 6c 65 5f 66 69 6e 69 73 68 5f 70 61 style_finish_pa 9410: 67 65 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 ge();.}../*.** W 9420: 45 42 50 41 47 45 3a 20 73 6b 69 6e 73 0a 2a 2a EBPAGE: skins.** 9430: 0a 2a 2a 20 53 68 6f 77 20 61 20 6c 69 73 74 20 .** Show a list 9440: 6f 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 62 75 of all of the bu 9450: 69 6c 74 2d 69 6e 20 73 6b 69 6e 73 2c 20 70 6c ilt-in skins, pl 9460: 75 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 74 us the responsit 9470: 6f 72 79 20 73 6b 69 6e 2c 0a 2a 2a 20 61 6e 64 ory skin,.** and 9480: 20 70 72 6f 76 69 64 65 20 74 68 65 20 75 73 65 provide the use 9490: 72 20 77 69 74 68 20 61 6e 20 6f 70 70 6f 72 74 r with an opport 94a0: 75 6e 69 74 79 20 74 6f 20 63 68 61 6e 67 65 20 unity to change 94b0: 74 6f 20 61 6e 79 20 6f 66 20 74 68 65 6d 2e 0a to any of them.. 94c0: 2a 2f 0a 76 6f 69 64 20 73 6b 69 6e 73 5f 70 61 */.void skins_pa 94d0: 67 65 28 76 6f 69 64 29 7b 0a 20 20 69 6e 74 20 ge(void){. int 94e0: 69 3b 0a 20 20 63 68 61 72 20 2a 7a 42 61 73 65 i;. char *zBase 94f0: 20 3d 20 66 6f 73 73 69 6c 5f 73 74 72 64 75 70 = fossil_strdup 9500: 28 67 2e 7a 54 6f 70 29 3b 0a 20 20 73 69 7a 65 (g.zTop);. size 9510: 5f 74 20 6e 42 61 73 65 20 3d 20 73 74 72 6c 65 _t nBase = strle 9520: 6e 28 7a 42 61 73 65 29 3b 0a 20 20 69 66 28 20 n(zBase);. if( 9530: 69 44 72 61 66 74 53 6b 69 6e 20 26 26 20 73 71 iDraftSkin && sq 9540: 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62 28 22 2a lite3_strglob("* 9550: 2f 64 72 61 66 74 3f 22 2c 20 7a 42 61 73 65 29 /draft?", zBase) 9560: 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 42 61 73 65 ==0 ){. nBase 9570: 20 2d 3d 20 37 3b 0a 20 20 20 20 7a 42 61 73 65 -= 7;. zBase 9580: 5b 6e 42 61 73 65 5d 20 3d 20 30 3b 0a 20 20 7d [nBase] = 0;. } 9590: 65 6c 73 65 20 69 66 28 20 70 41 6c 74 53 6b 69 else if( pAltSki 95a0: 6e 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a n ){. char *z 95b0: 50 61 74 74 65 72 6e 20 3d 20 6d 70 72 69 6e 74 Pattern = mprint 95c0: 66 28 22 2a 2f 73 6b 6e 5f 25 73 22 2c 20 70 41 f("*/skn_%s", pA 95d0: 6c 74 53 6b 69 6e 2d 3e 7a 4c 61 62 65 6c 29 3b ltSkin->zLabel); 95e0: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 . if( sqlite3 95f0: 5f 73 74 72 67 6c 6f 62 28 7a 50 61 74 74 65 72 _strglob(zPatter 9600: 6e 2c 20 7a 42 61 73 65 29 3d 3d 30 20 29 7b 0a n, zBase)==0 ){. 9610: 20 20 20 20 20 20 6e 42 61 73 65 20 2d 3d 20 73 nBase -= s 9620: 74 72 6c 65 6e 28 7a 50 61 74 74 65 72 6e 29 2d trlen(zPattern)- 9630: 31 3b 0a 20 20 20 20 20 20 7a 42 61 73 65 5b 6e 1;. zBase[n 9640: 42 61 73 65 5d 20 3d 20 30 3b 0a 20 20 20 20 7d Base] = 0;. } 9650: 0a 20 20 20 20 66 6f 73 73 69 6c 5f 66 72 65 65 . fossil_free 9660: 28 7a 50 61 74 74 65 72 6e 29 3b 0a 20 20 7d 0a (zPattern);. }. 9670: 20 20 6c 6f 67 69 6e 5f 63 68 65 63 6b 5f 63 72 login_check_cr 9680: 65 64 65 6e 74 69 61 6c 73 28 29 3b 0a 20 20 73 edentials();. s 9690: 74 79 6c 65 5f 68 65 61 64 65 72 28 22 53 6b 69 tyle_header("Ski 96a0: 6e 73 22 29 3b 0a 20 20 69 66 28 20 69 44 72 61 ns");. if( iDra 96b0: 66 74 53 6b 69 6e 20 7c 7c 20 6e 53 6b 69 6e 52 ftSkin || nSkinR 96c0: 61 6e 6b 3c 3d 31 20 29 7b 0a 20 20 20 20 40 20 ank<=1 ){. @ 96d0: 3c 70 20 63 6c 61 73 73 3d 22 77 61 72 6e 69 6e <p class="warnin 96e0: 67 22 3e 57 61 72 6e 69 6e 67 3a 0a 20 20 20 20 g">Warning:. 96f0: 69 66 28 20 69 44 72 61 66 74 53 6b 69 6e 3e 30 if( iDraftSkin>0 9700: 20 29 7b 0a 20 20 20 20 20 20 40 20 79 6f 75 20 ){. @ you 9710: 61 72 65 20 75 73 69 6e 67 20 61 20 64 72 61 66 are using a draf 9720: 74 20 73 6b 69 6e 2c 0a 20 20 20 20 7d 65 6c 73 t skin,. }els 9730: 65 7b 0a 20 20 20 20 20 20 40 20 74 68 69 73 20 e{. @ this 9740: 66 6f 73 73 69 6c 20 69 6e 73 74 61 6e 63 65 20 fossil instance 9750: 77 61 73 20 73 74 61 72 74 65 64 20 77 69 74 68 was started with 9760: 20 61 20 68 61 72 64 2d 63 6f 64 65 64 20 73 6b a hard-coded sk 9770: 69 6e 0a 20 20 20 20 20 20 40 20 76 61 6c 75 65 in. @ value 9780: 2c 0a 20 20 20 20 7d 0a 20 20 20 20 40 20 77 68 ,. }. @ wh 9790: 69 63 68 20 74 72 75 6d 70 73 20 61 6e 79 20 6f ich trumps any o 97a0: 70 74 69 6f 6e 20 73 65 6c 65 63 74 65 64 20 62 ption selected b 97b0: 65 6c 6f 77 2e 20 41 20 73 6b 69 6e 20 73 65 6c elow. A skin sel 97c0: 65 63 74 65 64 0a 20 20 20 20 40 20 62 65 6c 6f ected. @ belo 97d0: 77 20 77 69 6c 6c 20 62 65 20 72 65 63 6f 72 64 w will be record 97e0: 65 64 20 69 6e 20 79 6f 75 72 20 70 72 65 66 65 ed in your prefe 97f0: 72 65 6e 63 65 20 63 6f 6f 6b 69 65 0a 20 20 20 rence cookie. 9800: 20 40 20 62 75 74 20 77 69 6c 6c 20 6e 6f 74 20 @ but will not 9810: 62 65 20 75 73 65 64 20 73 6f 20 6c 6f 6e 67 20 be used so long 9820: 61 73 20 74 68 65 20 73 69 74 65 20 68 61 73 20 as the site has 9830: 61 0a 20 20 20 20 40 20 68 69 67 68 65 72 2d 70 a. @ higher-p 9840: 72 69 6f 72 69 74 79 20 73 6b 69 6e 20 69 6e 20 riority skin in 9850: 70 6c 61 63 65 2e 0a 20 20 20 20 40 20 3c 2f 70 place.. @ </p 9860: 3e 0a 20 20 7d 0a 20 20 40 20 3c 70 3e 54 68 65 >. }. @ <p>The 9870: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 6b 69 6e 73 following skins 9880: 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20 66 are available f 9890: 6f 72 20 74 68 69 73 20 72 65 70 6f 73 69 74 6f or this reposito 98a0: 72 79 3a 3c 2f 70 3e 0a 20 20 40 20 3c 75 6c 3e ry:</p>. @ <ul> 98b0: 0a 20 20 69 66 28 20 70 41 6c 74 53 6b 69 6e 3d . if( pAltSkin= 98c0: 3d 30 20 26 26 20 7a 41 6c 74 53 6b 69 6e 44 69 =0 && zAltSkinDi 98d0: 72 3d 3d 30 20 26 26 20 69 44 72 61 66 74 53 6b r==0 && iDraftSk 98e0: 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 40 20 3c in==0 ){. @ < 98f0: 6c 69 3e 20 53 74 61 6e 64 61 72 64 20 73 6b 69 li> Standard ski 9900: 6e 20 66 6f 72 20 74 68 69 73 20 72 65 70 6f 73 n for this repos 9910: 69 74 6f 72 79 20 26 6c 61 72 72 3b 20 3c 69 3e itory ← <i> 9920: 43 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73 65 Currently in use 9930: 3c 2f 69 3e 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 </i>. }else{. 9940: 20 20 40 20 3c 6c 69 3e 20 25 7a 28 68 72 65 66 @ <li> %z(href 9950: 28 22 25 52 2f 73 6b 69 6e 73 3f 73 6b 69 6e 3d ("%R/skins?skin= 9960: 22 29 29 53 74 61 6e 64 61 72 64 20 73 6b 69 6e "))Standard skin 9970: 20 66 6f 72 20 74 68 69 73 20 72 65 70 6f 73 69 for this reposi 9980: 74 6f 72 79 3c 2f 61 3e 0a 20 20 7d 0a 20 20 66 tory</a>. }. f 9990: 6f 72 28 69 3d 30 3b 20 69 3c 63 6f 75 6e 74 28 or(i=0; i<count( 99a0: 61 42 75 69 6c 74 69 6e 53 6b 69 6e 29 3b 20 69 aBuiltinSkin); i 99b0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 41 6c ++){. if( pAl 99c0: 74 53 6b 69 6e 3d 3d 26 61 42 75 69 6c 74 69 6e tSkin==&aBuiltin 99d0: 53 6b 69 6e 5b 69 5d 20 29 7b 0a 20 20 20 20 20 Skin[i] ){. 99e0: 20 40 20 3c 6c 69 3e 20 25 68 28 61 42 75 69 6c @ <li> %h(aBuil 99f0: 74 69 6e 53 6b 69 6e 5b 69 5d 2e 7a 44 65 73 63 tinSkin[i].zDesc 9a00: 29 20 26 6c 61 72 72 3b 20 3c 69 3e 43 75 72 72 ) ← <i>Curr 9a10: 65 6e 74 6c 79 20 69 6e 20 75 73 65 3c 2f 69 3e ently in use</i> 9a20: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 . }else{. 9a30: 20 20 63 68 61 72 20 2a 7a 55 72 6c 20 3d 20 68 char *zUrl = h 9a40: 72 65 66 28 22 25 52 2f 73 6b 69 6e 73 3f 73 6b ref("%R/skins?sk 9a50: 69 6e 3d 25 54 22 2c 20 61 42 75 69 6c 74 69 6e in=%T", aBuiltin 9a60: 53 6b 69 6e 5b 69 5d 2e 7a 4c 61 62 65 6c 29 3b Skin[i].zLabel); 9a70: 0a 20 20 20 20 20 20 40 20 3c 6c 69 3e 20 25 7a . @ <li> %z 9a80: 28 7a 55 72 6c 29 25 68 28 61 42 75 69 6c 74 69 (zUrl)%h(aBuilti 9a90: 6e 53 6b 69 6e 5b 69 5d 2e 7a 44 65 73 63 29 3c nSkin[i].zDesc)< 9aa0: 2f 61 3e 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 /a>. }. }. 9ab0: 40 20 3c 2f 75 6c 3e 0a 20 20 73 74 79 6c 65 5f @ </ul>. style_ 9ac0: 66 69 6e 69 73 68 5f 70 61 67 65 28 29 3b 0a 20 finish_page();. 9ad0: 20 66 6f 73 73 69 6c 5f 66 72 65 65 28 7a 42 61 fossil_free(zBa 9ae0: 73 65 29 3b 0a 7d 0a se);.}.