Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
| Comment: | Rework the /sitemap customization settings. There is now just a single setting "sitemap-extra" that is a TCL list of triples, where each triple defines a new entry in the /sitemap. Legacy entries are ignored. Administrators that have a custom /sitemap configuration will need to update the "Custom Sitemap Entries" setting on the /Admin/Configuration page after updating to this version of Fossil or later. |
|---|---|
| Timelines: | family | ancestors | descendants | both | trunk |
| Files: | files | file ages | folders |
| SHA3-256: |
aa5beb8c297faf1fbd215337908d3d26 |
| User & Date: | drh 2021-01-26 19:37:39.269 |
Context
|
2021-01-26
| ||
| 23:58 | In the default skins, the main menu on web pages is now mostly determined by the "mainmenu" setting rather than by the "header.txt" file of the skin. This allows a project to more easily change skins without disrupting the customized menu. It also means that the built-in skins are morely likely to be usable without any modification. This change ... check-in: 5f2271292a user: drh tags: trunk | |
| 21:53 | The main menu for web display is now derived from the "mainmenu" setting, for the built-in skins. Customized skins that ignore the mainmenu setting continue to operate as before. Added the "string match" TH1 command to help. check-in: 923841b709 user: drh tags: new-main-menu | |
| 19:37 | Rework the /sitemap customization settings. There is now just a single setting "sitemap-extra" that is a TCL list of triples, where each triple defines a new entry in the /sitemap. Legacy entries are ignored. Administrators that have a custom /sitemap configuration will need to update the "Custom Sitemap Entries" setting on the /Admin/Configurati... check-in: aa5beb8c29 user: drh tags: trunk | |
| 17:53 | th1 docs: added new capexpr and marked (anycap, hascap, anoncap) as deprecated. check-in: 828821463a user: stephan tags: trunk | |
Changes
Changes to skins/default/css.txt.
| ︙ | ︙ | |||
270 271 272 273 274 275 276 |
.status {padding-top: 0px;}
.mainmenu a {
padding: 10px 10px;
}
.mainmenu {
padding: 10px;
}
| | | 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 |
.status {padding-top: 0px;}
.mainmenu a {
padding: 10px 10px;
}
.mainmenu {
padding: 10px;
}
.not-mobile {
display: none;
}
}
@media screen and (min-width: 600px) {
/* Spacing for desktop */
body {
padding-left: 20px;
|
| ︙ | ︙ | |||
294 295 296 297 298 299 300 |
}
.mainmenu {
padding: 10px;
}
}
@media screen and (max-width: 1200px) {
/* Special declarations for narrow desktop or wide mobile */
| | | 294 295 296 297 298 299 300 301 302 303 304 |
}
.mainmenu {
padding: 10px;
}
}
@media screen and (max-width: 1200px) {
/* Special declarations for narrow desktop or wide mobile */
.wide-screen {
display: none;
}
}
|
Changes to src/configure.c.
| ︙ | ︙ | |||
110 111 112 113 114 115 116 |
{ "timeline-truncate-at-blank", CONFIGSET_SKIN },
{ "timeline-tslink-info", CONFIGSET_SKIN },
{ "timeline-utc", CONFIGSET_SKIN },
{ "adunit", CONFIGSET_SKIN },
{ "adunit-omit-if-admin", CONFIGSET_SKIN },
{ "adunit-omit-if-user", CONFIGSET_SKIN },
{ "default-csp", CONFIGSET_SKIN },
| | < < < | 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 |
{ "timeline-truncate-at-blank", CONFIGSET_SKIN },
{ "timeline-tslink-info", CONFIGSET_SKIN },
{ "timeline-utc", CONFIGSET_SKIN },
{ "adunit", CONFIGSET_SKIN },
{ "adunit-omit-if-admin", CONFIGSET_SKIN },
{ "adunit-omit-if-user", CONFIGSET_SKIN },
{ "default-csp", CONFIGSET_SKIN },
{ "sitemap-extra", CONFIGSET_SKIN },
{ "safe-html", CONFIGSET_SKIN },
#ifdef FOSSIL_ENABLE_TH1_DOCS
{ "th1-docs", CONFIGSET_TH1 },
#endif
#ifdef FOSSIL_ENABLE_TH1_HOOKS
{ "th1-hooks", CONFIGSET_TH1 },
|
| ︙ | ︙ |
Changes to src/setup.c.
| ︙ | ︙ | |||
1015 1016 1017 1018 1019 1020 1021 | @ @ <p>Note: To avoid a redirect loop or other problems, this entry must @ begin with "/" and it must specify a valid page. For example, @ "<b>/home</b>" will work but "<b>home</b>" will not, since it omits the @ leading "/".</p> @ <p>(Property: "index-page") @ <hr> | | | < | > > > > | < | < < | | | | | > > | > > | > | | < | 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 |
@
@ <p>Note: To avoid a redirect loop or other problems, this entry must
@ begin with "/" and it must specify a valid page. For example,
@ "<b>/home</b>" will work but "<b>home</b>" will not, since it omits the
@ leading "/".</p>
@ <p>(Property: "index-page")
@ <hr>
@ <p>Extra links to appear on the <a href="%R/sitemap">/sitemap</a> page,
@ as sub-items of the "Home Page" entry, appearing before the
@ "Documentation Search" entry (if any). In skins that use the /sitemap
@ page to construct a hamburger menu dropdown, new entries added here
@ will appear on the hamburger menu.
@
@ <p>This setting should be a TCL list divided into triples. Each
@ triple defines a new entry:
@ <ol>
@ <li> The first term is the display name of the /sitemap entry
@ <li> The second term is a hyperlink to take when a user clicks on the
@ entry. Hyperlinks that start with "/" are relative to the
@ repository root.
@ <li> The third term is an argument to the TH1 "capexpr" command.
@ If capexpr evalutes to true, then the entry is shown. If not,
@ the entry is omitted. "*" is always true.
@ </ol>
@
@ <p>The default value is blank, meaning no added entries.
@ (Property: sitemap-extra)
@ <p>
textarea_attribute("Custom Sitemap Entries", 8, 80,
"sitemap-extra", "smextra", "", 0);
@ <hr />
@ <p><input type="submit" name="submit" value="Apply Changes" /></p>
@ </div></form>
db_end_transaction(0);
style_finish_page();
}
|
| ︙ | ︙ |
Changes to src/sitemap.c.
| ︙ | ︙ | |||
30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 |
** the main menu due to lack of space.
*/
void sitemap_page(void){
int srchFlags;
int inSublist = 0;
int i;
int isPopup = 0; /* This is an XMLHttpRequest() for /sitemap */
const struct {
const char *zTitle;
const char *zProperty;
} aExtra[] = {
{ "Documentation", "sitemap-docidx" },
{ "Download", "sitemap-download" },
{ "License", "sitemap-license" },
{ "Contact", "sitemap-contact" },
};
login_check_credentials();
if( P("popup")!=0 && cgi_csrf_safe(0) ){
/* If this is a POST from the same origin with the popup=1 parameter,
** then disable anti-robot defenses */
isPopup = 1;
g.perm.Hyperlink = 1;
g.javascriptHyperlink = 0;
}
srchFlags = search_restrict(SRCH_ALL);
if( !isPopup ){
style_header("Site Map");
style_adunit_config(ADUNIT_RIGHT_OK);
}
@ <ul id="sitemap" class="columns" style="column-width:20em">
@ <li>%z(href("%R/home"))Home Page</a>
for(i=0; i<sizeof(aExtra)/sizeof(aExtra[0]); i++){
char *z = db_get(aExtra[i].zProperty,0);
if( z==0 || z[0]==0 ) continue;
if( !inSublist ){
@ <ul>
inSublist = 1;
}
if( z[0]=='/' ){
@ <li>%z(href("%R%s",z))%s(aExtra[i].zTitle)</a></li>
}else{
@ <li>%z(href("%s",z))%s(aExtra[i].zTitle)</a></li>
}
}
if( srchFlags & SRCH_DOC ){
if( !inSublist ){
@ <ul>
inSublist = 1;
}
@ <li>%z(href("%R/docsrch"))Documentation Search</a></li>
}
| > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 |
** the main menu due to lack of space.
*/
void sitemap_page(void){
int srchFlags;
int inSublist = 0;
int i;
int isPopup = 0; /* This is an XMLHttpRequest() for /sitemap */
const char *zExtra;
#if 0 /* Removed 2021-01-26 */
const struct {
const char *zTitle;
const char *zProperty;
} aExtra[] = {
{ "Documentation", "sitemap-docidx" },
{ "Download", "sitemap-download" },
{ "License", "sitemap-license" },
{ "Contact", "sitemap-contact" },
};
#endif
login_check_credentials();
if( P("popup")!=0 && cgi_csrf_safe(0) ){
/* If this is a POST from the same origin with the popup=1 parameter,
** then disable anti-robot defenses */
isPopup = 1;
g.perm.Hyperlink = 1;
g.javascriptHyperlink = 0;
}
srchFlags = search_restrict(SRCH_ALL);
if( !isPopup ){
style_header("Site Map");
style_adunit_config(ADUNIT_RIGHT_OK);
}
@ <ul id="sitemap" class="columns" style="column-width:20em">
@ <li>%z(href("%R/home"))Home Page</a>
#if 0 /* Removed 2021-01-26 */
for(i=0; i<sizeof(aExtra)/sizeof(aExtra[0]); i++){
char *z = db_get(aExtra[i].zProperty,0);
if( z==0 || z[0]==0 ) continue;
if( !inSublist ){
@ <ul>
inSublist = 1;
}
if( z[0]=='/' ){
@ <li>%z(href("%R%s",z))%s(aExtra[i].zTitle)</a></li>
}else{
@ <li>%z(href("%s",z))%s(aExtra[i].zTitle)</a></li>
}
}
#endif
zExtra = db_get("sitemap-extra",0);
if( zExtra ){
int rc;
char **azExtra = 0;
int *anExtra;
int nExtra = 0;
if( isPopup ) Th_FossilInit(0);
rc = Th_SplitList(g.interp, zExtra, (int)strlen(zExtra),
&azExtra, &anExtra, &nExtra);
if( rc==TH_OK && nExtra ){
for(i=0; i+2<nExtra; i+=3){
int nResult = 0;
const char *zResult;
int iCond = 0;
rc = capexprCmd(g.interp, 0, 2,
(const char**)&azExtra[i+1], (int*)&anExtra[i+1]);
if( rc!=TH_OK ) continue;
zResult = Th_GetResult(g.interp, &nResult);
Th_ToInt(g.interp, zResult, nResult, &iCond);
if( iCond==0 ) continue;
if( !inSublist ){
@ <ul>
inSublist = 1;
}
if( azExtra[i+1][0]=='/' ){
@ <li>%z(href("%R%s",azExtra[i+1]))%h(azExtra[i])</a></li>
}else{
@ <li>%z(href("%s",azExtra[i+1]))%s(azExtra[i])</a></li>
}
}
}
Th_Free(g.interp, azExtra);
}
if( srchFlags & SRCH_DOC ){
if( !inSublist ){
@ <ul>
inSublist = 1;
}
@ <li>%z(href("%R/docsrch"))Documentation Search</a></li>
}
|
| ︙ | ︙ |
Changes to src/th_main.c.
| ︙ | ︙ | |||
810 811 812 813 814 815 816 |
** Examples:
**
** capexpr {j o r} True if any one of j, o, or r are available
** capexpr {oh} True if both o and h are available
** capexpr {@2 @3 4 5 6} 2 or 3 available for anonymous or one of
** 4, 5 or 6 is available for the user
*/
| | | 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 |
** Examples:
**
** capexpr {j o r} True if any one of j, o, or r are available
** capexpr {oh} True if both o and h are available
** capexpr {@2 @3 4 5 6} 2 or 3 available for anonymous or one of
** 4, 5 or 6 is available for the user
*/
int capexprCmd(
Th_Interp *interp,
void *p,
int argc,
const char **argv,
int *argl
){
char **azCap;
|
| ︙ | ︙ |