dbda8d6ce9 2007-07-21 drh: /* 5cd9597428 2007-09-24 jnc: ** Copyright (c) 2006,2007 D. Richard Hipp dbda8d6ce9 2007-07-21 drh: ** dbda8d6ce9 2007-07-21 drh: ** This program is free software; you can redistribute it and/or dbda8d6ce9 2007-07-21 drh: ** modify it under the terms of the GNU General Public dbda8d6ce9 2007-07-21 drh: ** License version 2 as published by the Free Software Foundation. dbda8d6ce9 2007-07-21 drh: ** dbda8d6ce9 2007-07-21 drh: ** This program is distributed in the hope that it will be useful, dbda8d6ce9 2007-07-21 drh: ** but WITHOUT ANY WARRANTY; without even the implied warranty of dbda8d6ce9 2007-07-21 drh: ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU dbda8d6ce9 2007-07-21 drh: ** General Public License for more details. dbda8d6ce9 2007-07-21 drh: ** dbda8d6ce9 2007-07-21 drh: ** You should have received a copy of the GNU General Public dbda8d6ce9 2007-07-21 drh: ** License along with this library; if not, write to the dbda8d6ce9 2007-07-21 drh: ** Free Software Foundation, Inc., 59 Temple Place - Suite 330, dbda8d6ce9 2007-07-21 drh: ** Boston, MA 02111-1307, USA. dbda8d6ce9 2007-07-21 drh: ** dbda8d6ce9 2007-07-21 drh: ** Author contact information: dbda8d6ce9 2007-07-21 drh: ** drh@hwaci.com dbda8d6ce9 2007-07-21 drh: ** http://www.hwaci.com/drh/ dbda8d6ce9 2007-07-21 drh: ** dbda8d6ce9 2007-07-21 drh: ******************************************************************************* dbda8d6ce9 2007-07-21 drh: ** dbda8d6ce9 2007-07-21 drh: ** This file contains code to implement the basic web page look and feel. dbda8d6ce9 2007-07-21 drh: ** dbda8d6ce9 2007-07-21 drh: */ dbda8d6ce9 2007-07-21 drh: #include "config.h" dbda8d6ce9 2007-07-21 drh: #include "style.h" dbda8d6ce9 2007-07-21 drh: dbda8d6ce9 2007-07-21 drh: dbda8d6ce9 2007-07-21 drh: /* dbda8d6ce9 2007-07-21 drh: ** Elements of the submenu are collected into the following dbda8d6ce9 2007-07-21 drh: ** structure and displayed below the main menu by style_header(). dbda8d6ce9 2007-07-21 drh: ** dbda8d6ce9 2007-07-21 drh: ** Populate this structure with calls to style_submenu_element() dbda8d6ce9 2007-07-21 drh: ** prior to calling style_header(). dbda8d6ce9 2007-07-21 drh: */ dbda8d6ce9 2007-07-21 drh: static struct Submenu { dbda8d6ce9 2007-07-21 drh: const char *zLabel; dbda8d6ce9 2007-07-21 drh: const char *zTitle; dbda8d6ce9 2007-07-21 drh: const char *zLink; dbda8d6ce9 2007-07-21 drh: } aSubmenu[30]; dbda8d6ce9 2007-07-21 drh: static int nSubmenu = 0; dbda8d6ce9 2007-07-21 drh: dbda8d6ce9 2007-07-21 drh: /* dbda8d6ce9 2007-07-21 drh: ** Add a new element to the submenu dbda8d6ce9 2007-07-21 drh: */ dbda8d6ce9 2007-07-21 drh: void style_submenu_element( dbda8d6ce9 2007-07-21 drh: const char *zLabel, dbda8d6ce9 2007-07-21 drh: const char *zTitle, 5f3ddcc1b8 2007-11-25 drh: const char *zLink, 5f3ddcc1b8 2007-11-25 drh: ... dbda8d6ce9 2007-07-21 drh: ){ 5f3ddcc1b8 2007-11-25 drh: va_list ap; dbda8d6ce9 2007-07-21 drh: assert( nSubmenu < sizeof(aSubmenu)/sizeof(aSubmenu[0]) ); dbda8d6ce9 2007-07-21 drh: aSubmenu[nSubmenu].zLabel = zLabel; dbda8d6ce9 2007-07-21 drh: aSubmenu[nSubmenu].zTitle = zTitle; 5f3ddcc1b8 2007-11-25 drh: va_start(ap, zLink); 5f3ddcc1b8 2007-11-25 drh: aSubmenu[nSubmenu].zLink = vmprintf(zLink, ap); 5f3ddcc1b8 2007-11-25 drh: va_end(ap); dbda8d6ce9 2007-07-21 drh: nSubmenu++; dbda8d6ce9 2007-07-21 drh: } dbda8d6ce9 2007-07-21 drh: dbda8d6ce9 2007-07-21 drh: /* dbda8d6ce9 2007-07-21 drh: ** Compare two submenu items for sorting purposes dbda8d6ce9 2007-07-21 drh: */ dbda8d6ce9 2007-07-21 drh: static int submenuCompare(const void *a, const void *b){ dbda8d6ce9 2007-07-21 drh: const struct Submenu *A = (const struct Submenu*)a; 50a58adb76 2007-10-10 drh: const struct Submenu *B = (const struct Submenu*)b; dbda8d6ce9 2007-07-21 drh: return strcmp(A->zLabel, B->zLabel); dbda8d6ce9 2007-07-21 drh: } dbda8d6ce9 2007-07-21 drh: dbda8d6ce9 2007-07-21 drh: /* 34af72801d 2007-11-23 drh: ** The Subscript interpreter used to render header and footer. 34af72801d 2007-11-23 drh: */ 34af72801d 2007-11-23 drh: static struct Subscript *pInterp; 66f4caa379 2007-07-23 drh: 66f4caa379 2007-07-23 drh: /* dbda8d6ce9 2007-07-21 drh: ** Draw the header. dbda8d6ce9 2007-07-21 drh: */ 66f4caa379 2007-07-23 drh: void style_header(const char *zTitle){ f0a9e3b523 2007-11-21 drh: const char *zLogInOut = "Login"; 68a202e101 2007-11-21 drh: const char *zHeader = db_get("header", (char*)zDefaultHeader); 916b6e4b3b 2007-07-21 drh: login_check_credentials(); 34af72801d 2007-11-23 drh: f394d84560 2007-11-25 drh: if( pInterp ) return; 555911dff5 2007-11-21 drh: 555911dff5 2007-11-21 drh: /* Generate the header up through the main menu */ 34af72801d 2007-11-23 drh: pInterp = SbS_Create(); 34af72801d 2007-11-23 drh: SbS_Store(pInterp, "project_name", 34af72801d 2007-11-23 drh: db_get("project-name","Unnamed Fossil Project"), 0); 34af72801d 2007-11-23 drh: SbS_Store(pInterp, "title", zTitle, 0); 34af72801d 2007-11-23 drh: SbS_Store(pInterp, "baseurl", g.zBaseURL, 0); 34af72801d 2007-11-23 drh: SbS_Store(pInterp, "manifest_version", MANIFEST_VERSION, 0); 34af72801d 2007-11-23 drh: SbS_Store(pInterp, "manifest_date", MANIFEST_DATE, 0); 555911dff5 2007-11-21 drh: if( g.zLogin ){ 34af72801d 2007-11-23 drh: SbS_Store(pInterp, "login", g.zLogin, 0); f0a9e3b523 2007-11-21 drh: zLogInOut = "Logout"; 5ebcedc33e 2007-07-31 dan: } 34af72801d 2007-11-23 drh: SbS_Render(pInterp, zHeader); 555911dff5 2007-11-21 drh: 555911dff5 2007-11-21 drh: /* Generate the main menu and the submenu (if any) */ 34af72801d 2007-11-23 drh: @ <div class="mainmenu"> 50a58adb76 2007-10-10 drh: @ <a href="%s(g.zBaseURL)/home">Home</a> fd36718ad9 2007-07-31 drh: if( g.okRead ){ 555911dff5 2007-11-21 drh: @ <a href="%s(g.zBaseURL)/leaves">Leaves</a> 555911dff5 2007-11-21 drh: @ <a href="%s(g.zBaseURL)/timeline">Timeline</a> 02d1ed6ad2 2008-02-02 stephan: @ <a href="%s(g.zBaseURL)/tagview">Tags</a> 66f4caa379 2007-07-23 drh: } 66f4caa379 2007-07-23 drh: if( g.okRdWiki ){ 555911dff5 2007-11-21 drh: @ <a href="%s(g.zBaseURL)/wiki">Wiki</a> dbda8d6ce9 2007-07-21 drh: } 66f4caa379 2007-07-23 drh: #if 0 555911dff5 2007-11-21 drh: @ <font color="#888888">Search</font> 555911dff5 2007-11-21 drh: @ <font color="#888888">Ticket</font> 555911dff5 2007-11-21 drh: @ <font color="#888888">Reports</font> 66f4caa379 2007-07-23 drh: #endif dbda8d6ce9 2007-07-21 drh: if( g.okSetup ){ 555911dff5 2007-11-21 drh: @ <a href="%s(g.zBaseURL)/setup">Setup</a> dbda8d6ce9 2007-07-21 drh: } dbda8d6ce9 2007-07-21 drh: if( !g.noPswd ){ 555911dff5 2007-11-21 drh: @ <a href="%s(g.zBaseURL)/login">%s(zLogInOut)</a> dbda8d6ce9 2007-07-21 drh: } 5cd9597428 2007-09-24 jnc: @ </div> dbda8d6ce9 2007-07-21 drh: if( nSubmenu>0 ){ dbda8d6ce9 2007-07-21 drh: int i; 34af72801d 2007-11-23 drh: @ <div class="submenu"> dbda8d6ce9 2007-07-21 drh: qsort(aSubmenu, nSubmenu, sizeof(aSubmenu[0]), submenuCompare); dbda8d6ce9 2007-07-21 drh: for(i=0; i<nSubmenu; i++){ dbda8d6ce9 2007-07-21 drh: struct Submenu *p = &aSubmenu[i]; dbda8d6ce9 2007-07-21 drh: if( p->zLink==0 ){ 5cd9597428 2007-09-24 jnc: @ <span class="label">%h(p->zLabel)</span> dbda8d6ce9 2007-07-21 drh: }else{ 677aa71bca 2007-10-12 drh: @ <a class="label" href="%s(p->zLink)">%h(p->zLabel)</a> dbda8d6ce9 2007-07-21 drh: } dbda8d6ce9 2007-07-21 drh: } 01ce2cf3dc 2007-09-24 jnc: @ </div> dbda8d6ce9 2007-07-21 drh: } 34af72801d 2007-11-23 drh: @ <div class="content"> dbda8d6ce9 2007-07-21 drh: g.cgiPanic = 1; dbda8d6ce9 2007-07-21 drh: } dbda8d6ce9 2007-07-21 drh: dbda8d6ce9 2007-07-21 drh: /* dbda8d6ce9 2007-07-21 drh: ** Draw the footer at the bottom of the page. dbda8d6ce9 2007-07-21 drh: */ dbda8d6ce9 2007-07-21 drh: void style_footer(void){ f394d84560 2007-11-25 drh: const char *zFooter; f394d84560 2007-11-25 drh: f394d84560 2007-11-25 drh: if( pInterp==0 ) return; f394d84560 2007-11-25 drh: zFooter = db_get("footer", (char*)zDefaultFooter); 5cd9597428 2007-09-24 jnc: @ </div> 34af72801d 2007-11-23 drh: SbS_Render(pInterp, zFooter); 34af72801d 2007-11-23 drh: SbS_Destroy(pInterp); f394d84560 2007-11-25 drh: pInterp = 0; dbda8d6ce9 2007-07-21 drh: } dbda8d6ce9 2007-07-21 drh: 34af72801d 2007-11-23 drh: /* @-comment: // */ 5cd9597428 2007-09-24 jnc: /* 555911dff5 2007-11-21 drh: ** The default page header. 5cd9597428 2007-09-24 jnc: */ 555911dff5 2007-11-21 drh: const char zDefaultHeader[] = 555911dff5 2007-11-21 drh: @ <html> 555911dff5 2007-11-21 drh: @ <head> 34af72801d 2007-11-23 drh: @ <title>[project_name html]: [title html]</title> 555911dff5 2007-11-21 drh: @ <link rel="alternate" type="application/rss+xml" title="RSS Feed" 555911dff5 2007-11-21 drh: @ href="[baseurl puts]/timeline.rss"> 555911dff5 2007-11-21 drh: @ <link rel="stylesheet" href="[baseurl puts]/style.css" type="text/css" 555911dff5 2007-11-21 drh: @ media="screen"> 555911dff5 2007-11-21 drh: @ </head> 555911dff5 2007-11-21 drh: @ <body> 34af72801d 2007-11-23 drh: @ <div class="header"> 34af72801d 2007-11-23 drh: @ <div class="logo"> 34af72801d 2007-11-23 drh: @ <!-- <img src="logo.gif" alt="logo"><br></br> --> 34af72801d 2007-11-23 drh: @ <nobr>[project_name html]</nobr> 34af72801d 2007-11-23 drh: @ </div> 34af72801d 2007-11-23 drh: @ <div class="title">[title html]</div> 34af72801d 2007-11-23 drh: @ <div class="status"><nobr> 13732d495d 2007-11-23 drh: @ [/login exists enable_output] Logged in as [0 /login get html] 13732d495d 2007-11-23 drh: @ [/login exists not enable_output] Not logged in 34af72801d 2007-11-23 drh: @ [1 enable_output] 34af72801d 2007-11-23 drh: @ </nobr></div> 34af72801d 2007-11-23 drh: @ </div> 34af72801d 2007-11-23 drh: ; 34af72801d 2007-11-23 drh: 5cd9597428 2007-09-24 jnc: /* 34af72801d 2007-11-23 drh: ** The default page footer 5cd9597428 2007-09-24 jnc: */ 34af72801d 2007-11-23 drh: const char zDefaultFooter[] = 34af72801d 2007-11-23 drh: @ <div class="footer"> 34af72801d 2007-11-23 drh: @ Fossil version [manifest_version puts] [manifest_date puts] 555911dff5 2007-11-21 drh: @ </div> 34af72801d 2007-11-23 drh: @ </body></html> 555911dff5 2007-11-21 drh: ; 5cd9597428 2007-09-24 jnc: 8ffd32c2b7 2007-10-28 drh: /* 8ffd32c2b7 2007-10-28 drh: ** The default Cascading Style Sheet. 8ffd32c2b7 2007-10-28 drh: */ 8ffd32c2b7 2007-10-28 drh: const char zDefaultCSS[] = 34af72801d 2007-11-23 drh: @ /* General settings for the entire page */ 8ffd32c2b7 2007-10-28 drh: @ body { 34af72801d 2007-11-23 drh: @ margin: 0ex 1ex; 8ffd32c2b7 2007-10-28 drh: @ padding: 0px; 8ffd32c2b7 2007-10-28 drh: @ background-color: white; 34af72801d 2007-11-23 drh: @ font-family: "sans serif"; 34af72801d 2007-11-23 drh: @ } 34af72801d 2007-11-23 drh: @ 34af72801d 2007-11-23 drh: @ /* The project logo in the upper left-hand corner of each page */ 34af72801d 2007-11-23 drh: @ div.logo { 34af72801d 2007-11-23 drh: @ display: table-cell; 34af72801d 2007-11-23 drh: @ text-align: center; 34af72801d 2007-11-23 drh: @ vertical-align: bottom; 34af72801d 2007-11-23 drh: @ font-weight: bold; 34af72801d 2007-11-23 drh: @ color: #558195; 34af72801d 2007-11-23 drh: @ } 34af72801d 2007-11-23 drh: @ 34af72801d 2007-11-23 drh: @ /* The page title centered at the top of each page */ 34af72801d 2007-11-23 drh: @ div.title { 34af72801d 2007-11-23 drh: @ display: table-cell; 34af72801d 2007-11-23 drh: @ font-size: 2em; 8ffd32c2b7 2007-10-28 drh: @ font-weight: bold; 34af72801d 2007-11-23 drh: @ text-align: center; 34af72801d 2007-11-23 drh: @ color: #558195; 34af72801d 2007-11-23 drh: @ vertical-align: bottom; 34af72801d 2007-11-23 drh: @ width: 100%; 34af72801d 2007-11-23 drh: @ } 34af72801d 2007-11-23 drh: @ 34af72801d 2007-11-23 drh: @ /* The login status message in the top right-hand corner */ 34af72801d 2007-11-23 drh: @ div.status { 34af72801d 2007-11-23 drh: @ display: table-cell; 8ffd32c2b7 2007-10-28 drh: @ text-align: right; 34af72801d 2007-11-23 drh: @ vertical-align: bottom; 34af72801d 2007-11-23 drh: @ color: #558195; 34af72801d 2007-11-23 drh: @ font-size: 0.8em; 34af72801d 2007-11-23 drh: @ font-weight: bold; 34af72801d 2007-11-23 drh: @ } 34af72801d 2007-11-23 drh: @ 34af72801d 2007-11-23 drh: @ /* The header across the top of the page */ 34af72801d 2007-11-23 drh: @ div.header { 34af72801d 2007-11-23 drh: @ display: table; 34af72801d 2007-11-23 drh: @ width: 100%; 8ffd32c2b7 2007-10-28 drh: @ } 34af72801d 2007-11-23 drh: @ 34af72801d 2007-11-23 drh: @ /* The main menu bar that appears at the top of the page beneath 34af72801d 2007-11-23 drh: @ ** the header */ 34af72801d 2007-11-23 drh: @ div.mainmenu { 8ffd32c2b7 2007-10-28 drh: @ padding: 5px 10px 5px 10px; 8ffd32c2b7 2007-10-28 drh: @ font-size: 0.9em; 8ffd32c2b7 2007-10-28 drh: @ font-weight: bold; 8ffd32c2b7 2007-10-28 drh: @ text-align: center; 8ffd32c2b7 2007-10-28 drh: @ letter-spacing: 1px; 34af72801d 2007-11-23 drh: @ background-color: #558195; 8ffd32c2b7 2007-10-28 drh: @ color: white; 8ffd32c2b7 2007-10-28 drh: @ } 34af72801d 2007-11-23 drh: @ 34af72801d 2007-11-23 drh: @ /* The submenu bar that *sometimes* appears below the main menu */ 34af72801d 2007-11-23 drh: @ div.submenu { 8ffd32c2b7 2007-10-28 drh: @ padding: 3px 10px 3px 0px; 8ffd32c2b7 2007-10-28 drh: @ font-size: 0.9em; 8ffd32c2b7 2007-10-28 drh: @ text-align: center; 34af72801d 2007-11-23 drh: @ background-color: #456878; 8ffd32c2b7 2007-10-28 drh: @ color: white; 8ffd32c2b7 2007-10-28 drh: @ } 34af72801d 2007-11-23 drh: @ div.mainmenu a, div.mainmenu a:visited, div.submenu a, div.submenu a:visited { 8ffd32c2b7 2007-10-28 drh: @ padding: 3px 10px 3px 10px; 8ffd32c2b7 2007-10-28 drh: @ color: white; 34af72801d 2007-11-23 drh: @ text-decoration: none; 8ffd32c2b7 2007-10-28 drh: @ } 34af72801d 2007-11-23 drh: @ div.mainmenu a:hover, div.submenu a:hover { 34af72801d 2007-11-23 drh: @ color: #558195; 8ffd32c2b7 2007-10-28 drh: @ background-color: white; 8ffd32c2b7 2007-10-28 drh: @ } 34af72801d 2007-11-23 drh: @ 34af72801d 2007-11-23 drh: @ /* All page content from the bottom of the menu or submenu down to 34af72801d 2007-11-23 drh: @ ** the footer */ 34af72801d 2007-11-23 drh: @ div.content { 34af72801d 2007-11-23 drh: @ padding: 0ex 1ex 0ex 2ex; 34af72801d 2007-11-23 drh: @ } 34af72801d 2007-11-23 drh: @ 34af72801d 2007-11-23 drh: @ /* Some pages have section dividers */ 34af72801d 2007-11-23 drh: @ div.section { 34af72801d 2007-11-23 drh: @ margin-bottom: 0px; 34af72801d 2007-11-23 drh: @ margin-top: 1em; 34af72801d 2007-11-23 drh: @ padding: 1px 1px 1px 1px; 34af72801d 2007-11-23 drh: @ font-size: 1.2em; 34af72801d 2007-11-23 drh: @ font-weight: bold; 34af72801d 2007-11-23 drh: @ background-color: #558195; 34af72801d 2007-11-23 drh: @ color: white; 34af72801d 2007-11-23 drh: @ } 34af72801d 2007-11-23 drh: @ 34af72801d 2007-11-23 drh: @ /* The "Date" that occurs on the left hand side of timelines */ 34af72801d 2007-11-23 drh: @ div.divider { 34af72801d 2007-11-23 drh: @ background: #a1c4d4; 34af72801d 2007-11-23 drh: @ border: 2px #558195 solid; 34af72801d 2007-11-23 drh: @ font-size: 1em; font-weight: normal; 34af72801d 2007-11-23 drh: @ padding: .25em; 34af72801d 2007-11-23 drh: @ margin: .2em 0 .2em 0; 34af72801d 2007-11-23 drh: @ float: left; 34af72801d 2007-11-23 drh: @ clear: left; 8ffd32c2b7 2007-10-28 drh: @ } 34af72801d 2007-11-23 drh: @ 34af72801d 2007-11-23 drh: @ /* The footer at the very bottom of the page */ 34af72801d 2007-11-23 drh: @ div.footer { 8ffd32c2b7 2007-10-28 drh: @ font-size: 0.8em; 8ffd32c2b7 2007-10-28 drh: @ margin-top: 12px; 8ffd32c2b7 2007-10-28 drh: @ padding: 5px 10px 5px 10px; 8ffd32c2b7 2007-10-28 drh: @ text-align: right; 34af72801d 2007-11-23 drh: @ background-color: #558195; 8ffd32c2b7 2007-10-28 drh: @ color: white; 8ffd32c2b7 2007-10-28 drh: @ } dff17229ff 2007-12-02 drh: @ dff17229ff 2007-12-02 drh: @ /* The label/value pairs on (for example) the vinfo page */ dff17229ff 2007-12-02 drh: @ table.label-value th { 8ffd32c2b7 2007-10-28 drh: @ vertical-align: top; dff17229ff 2007-12-02 drh: @ text-align: right; dff17229ff 2007-12-02 drh: @ padding: 0.2ex 2ex; 8ffd32c2b7 2007-10-28 drh: @ } 8ffd32c2b7 2007-10-28 drh: ; 5cd9597428 2007-09-24 jnc: dbda8d6ce9 2007-07-21 drh: /* 5cd9597428 2007-09-24 jnc: ** WEBPAGE: style.css dbda8d6ce9 2007-07-21 drh: */ 5cd9597428 2007-09-24 jnc: void page_style_css(void){ 50a58adb76 2007-10-10 drh: char *zCSS = 0; 5cd9597428 2007-09-24 jnc: 5cd9597428 2007-09-24 jnc: cgi_set_content_type("text/css"); 34af72801d 2007-11-23 drh: zCSS = db_get("css",(char*)zDefaultCSS); 34af72801d 2007-11-23 drh: cgi_append_content(zCSS, -1); dbda8d6ce9 2007-07-21 drh: } dbda8d6ce9 2007-07-21 drh: dbda8d6ce9 2007-07-21 drh: /* dbda8d6ce9 2007-07-21 drh: ** WEBPAGE: test_env dbda8d6ce9 2007-07-21 drh: */ dbda8d6ce9 2007-07-21 drh: void page_test_env(void){ 66f4caa379 2007-07-23 drh: style_header("Environment Test"); 218577e3af 2007-10-11 drh: @ g.zBaseURL = %h(g.zBaseURL)<br> 1ce716b2ec 2007-10-11 drh: @ g.zTop = %h(g.zTop)<br> dbda8d6ce9 2007-07-21 drh: cgi_print_all(); dbda8d6ce9 2007-07-21 drh: style_footer(); dbda8d6ce9 2007-07-21 drh: }