Index: src/cgi.c ================================================================== --- src/cgi.c +++ src/cgi.c @@ -95,10 +95,18 @@ default: { cgi_panic("bad destination"); } } } + +/* +** Check to see if the header contains the zNeedle string. Return true +** if it does and false if it does not. +*/ +int cgi_header_contains(const char *zNeedle){ + return strstr(blob_str(&cgiContent[0]), zNeedle)!=0; +} /* ** Append reply content to what already exists. */ void cgi_append_content(const char *zData, int nAmt){ Index: src/doc.c ================================================================== --- src/doc.c +++ src/doc.c @@ -370,10 +370,11 @@ for(i=0; zName[i] && zName[i]!='/'; i++){} if( zName[i]==0 || i>UUID_SIZE ){ zName = "index.html"; goto doc_not_found; } + g.zPath = mprintf("%s/%s", g.zPath, zName); memcpy(zBaseline, zName, i); zBaseline[i] = 0; zName += i; while( zName[0]=='/' ){ zName++; } if( !file_is_simple_pathname(zName) ){ Index: src/main.mk ================================================================== --- src/main.mk +++ src/main.mk @@ -106,10 +106,11 @@ $(SRCDIR)/verify.c \ $(SRCDIR)/vfile.c \ $(SRCDIR)/wiki.c \ $(SRCDIR)/wikiformat.c \ $(SRCDIR)/winhttp.c \ + $(SRCDIR)/wysiwyg.c \ $(SRCDIR)/xfer.c \ $(SRCDIR)/xfersetup.c \ $(SRCDIR)/zip.c TRANS_SRC = \ @@ -205,10 +206,11 @@ $(OBJDIR)/verify_.c \ $(OBJDIR)/vfile_.c \ $(OBJDIR)/wiki_.c \ $(OBJDIR)/wikiformat_.c \ $(OBJDIR)/winhttp_.c \ + $(OBJDIR)/wysiwyg_.c \ $(OBJDIR)/xfer_.c \ $(OBJDIR)/xfersetup_.c \ $(OBJDIR)/zip_.c OBJ = \ @@ -304,10 +306,11 @@ $(OBJDIR)/verify.o \ $(OBJDIR)/vfile.o \ $(OBJDIR)/wiki.o \ $(OBJDIR)/wikiformat.o \ $(OBJDIR)/winhttp.o \ + $(OBJDIR)/wysiwyg.o \ $(OBJDIR)/xfer.o \ $(OBJDIR)/xfersetup.o \ $(OBJDIR)/zip.o APPNAME = fossil$(E) @@ -375,11 +378,11 @@ $(OBJDIR)/page_index.h: $(TRANS_SRC) $(OBJDIR)/mkindex $(OBJDIR)/mkindex $(TRANS_SRC) >$@ $(OBJDIR)/headers: $(OBJDIR)/page_index.h $(OBJDIR)/makeheaders $(OBJDIR)/VERSION.h - $(OBJDIR)/makeheaders $(OBJDIR)/add_.c:$(OBJDIR)/add.h $(OBJDIR)/allrepo_.c:$(OBJDIR)/allrepo.h $(OBJDIR)/attach_.c:$(OBJDIR)/attach.h $(OBJDIR)/bag_.c:$(OBJDIR)/bag.h $(OBJDIR)/bisect_.c:$(OBJDIR)/bisect.h $(OBJDIR)/blob_.c:$(OBJDIR)/blob.h $(OBJDIR)/branch_.c:$(OBJDIR)/branch.h $(OBJDIR)/browse_.c:$(OBJDIR)/browse.h $(OBJDIR)/captcha_.c:$(OBJDIR)/captcha.h $(OBJDIR)/cgi_.c:$(OBJDIR)/cgi.h $(OBJDIR)/checkin_.c:$(OBJDIR)/checkin.h $(OBJDIR)/checkout_.c:$(OBJDIR)/checkout.h $(OBJDIR)/clearsign_.c:$(OBJDIR)/clearsign.h $(OBJDIR)/clone_.c:$(OBJDIR)/clone.h $(OBJDIR)/comformat_.c:$(OBJDIR)/comformat.h $(OBJDIR)/configure_.c:$(OBJDIR)/configure.h $(OBJDIR)/content_.c:$(OBJDIR)/content.h $(OBJDIR)/db_.c:$(OBJDIR)/db.h $(OBJDIR)/delta_.c:$(OBJDIR)/delta.h $(OBJDIR)/deltacmd_.c:$(OBJDIR)/deltacmd.h $(OBJDIR)/descendants_.c:$(OBJDIR)/descendants.h $(OBJDIR)/diff_.c:$(OBJDIR)/diff.h $(OBJDIR)/diffcmd_.c:$(OBJDIR)/diffcmd.h $(OBJDIR)/doc_.c:$(OBJDIR)/doc.h $(OBJDIR)/encode_.c:$(OBJDIR)/encode.h $(OBJDIR)/event_.c:$(OBJDIR)/event.h $(OBJDIR)/export_.c:$(OBJDIR)/export.h $(OBJDIR)/file_.c:$(OBJDIR)/file.h $(OBJDIR)/finfo_.c:$(OBJDIR)/finfo.h $(OBJDIR)/glob_.c:$(OBJDIR)/glob.h $(OBJDIR)/graph_.c:$(OBJDIR)/graph.h $(OBJDIR)/gzip_.c:$(OBJDIR)/gzip.h $(OBJDIR)/http_.c:$(OBJDIR)/http.h $(OBJDIR)/http_socket_.c:$(OBJDIR)/http_socket.h $(OBJDIR)/http_ssl_.c:$(OBJDIR)/http_ssl.h $(OBJDIR)/http_transport_.c:$(OBJDIR)/http_transport.h $(OBJDIR)/import_.c:$(OBJDIR)/import.h $(OBJDIR)/info_.c:$(OBJDIR)/info.h $(OBJDIR)/json_.c:$(OBJDIR)/json.h $(OBJDIR)/json_artifact_.c:$(OBJDIR)/json_artifact.h $(OBJDIR)/json_branch_.c:$(OBJDIR)/json_branch.h $(OBJDIR)/json_config_.c:$(OBJDIR)/json_config.h $(OBJDIR)/json_diff_.c:$(OBJDIR)/json_diff.h $(OBJDIR)/json_dir_.c:$(OBJDIR)/json_dir.h $(OBJDIR)/json_finfo_.c:$(OBJDIR)/json_finfo.h $(OBJDIR)/json_login_.c:$(OBJDIR)/json_login.h $(OBJDIR)/json_query_.c:$(OBJDIR)/json_query.h $(OBJDIR)/json_report_.c:$(OBJDIR)/json_report.h $(OBJDIR)/json_tag_.c:$(OBJDIR)/json_tag.h $(OBJDIR)/json_timeline_.c:$(OBJDIR)/json_timeline.h $(OBJDIR)/json_user_.c:$(OBJDIR)/json_user.h $(OBJDIR)/json_wiki_.c:$(OBJDIR)/json_wiki.h $(OBJDIR)/leaf_.c:$(OBJDIR)/leaf.h $(OBJDIR)/login_.c:$(OBJDIR)/login.h $(OBJDIR)/main_.c:$(OBJDIR)/main.h $(OBJDIR)/manifest_.c:$(OBJDIR)/manifest.h $(OBJDIR)/md5_.c:$(OBJDIR)/md5.h $(OBJDIR)/merge_.c:$(OBJDIR)/merge.h $(OBJDIR)/merge3_.c:$(OBJDIR)/merge3.h $(OBJDIR)/name_.c:$(OBJDIR)/name.h $(OBJDIR)/path_.c:$(OBJDIR)/path.h $(OBJDIR)/pivot_.c:$(OBJDIR)/pivot.h $(OBJDIR)/popen_.c:$(OBJDIR)/popen.h $(OBJDIR)/pqueue_.c:$(OBJDIR)/pqueue.h $(OBJDIR)/printf_.c:$(OBJDIR)/printf.h $(OBJDIR)/rebuild_.c:$(OBJDIR)/rebuild.h $(OBJDIR)/report_.c:$(OBJDIR)/report.h $(OBJDIR)/rss_.c:$(OBJDIR)/rss.h $(OBJDIR)/schema_.c:$(OBJDIR)/schema.h $(OBJDIR)/search_.c:$(OBJDIR)/search.h $(OBJDIR)/setup_.c:$(OBJDIR)/setup.h $(OBJDIR)/sha1_.c:$(OBJDIR)/sha1.h $(OBJDIR)/shun_.c:$(OBJDIR)/shun.h $(OBJDIR)/skins_.c:$(OBJDIR)/skins.h $(OBJDIR)/sqlcmd_.c:$(OBJDIR)/sqlcmd.h $(OBJDIR)/stash_.c:$(OBJDIR)/stash.h $(OBJDIR)/stat_.c:$(OBJDIR)/stat.h $(OBJDIR)/style_.c:$(OBJDIR)/style.h $(OBJDIR)/sync_.c:$(OBJDIR)/sync.h $(OBJDIR)/tag_.c:$(OBJDIR)/tag.h $(OBJDIR)/tar_.c:$(OBJDIR)/tar.h $(OBJDIR)/th_main_.c:$(OBJDIR)/th_main.h $(OBJDIR)/timeline_.c:$(OBJDIR)/timeline.h $(OBJDIR)/tkt_.c:$(OBJDIR)/tkt.h $(OBJDIR)/tktsetup_.c:$(OBJDIR)/tktsetup.h $(OBJDIR)/undo_.c:$(OBJDIR)/undo.h $(OBJDIR)/update_.c:$(OBJDIR)/update.h $(OBJDIR)/url_.c:$(OBJDIR)/url.h $(OBJDIR)/user_.c:$(OBJDIR)/user.h $(OBJDIR)/verify_.c:$(OBJDIR)/verify.h $(OBJDIR)/vfile_.c:$(OBJDIR)/vfile.h $(OBJDIR)/wiki_.c:$(OBJDIR)/wiki.h $(OBJDIR)/wikiformat_.c:$(OBJDIR)/wikiformat.h $(OBJDIR)/winhttp_.c:$(OBJDIR)/winhttp.h $(OBJDIR)/xfer_.c:$(OBJDIR)/xfer.h $(OBJDIR)/xfersetup_.c:$(OBJDIR)/xfersetup.h $(OBJDIR)/zip_.c:$(OBJDIR)/zip.h $(SRCDIR)/sqlite3.h $(SRCDIR)/th.h $(OBJDIR)/VERSION.h + $(OBJDIR)/makeheaders $(OBJDIR)/add_.c:$(OBJDIR)/add.h $(OBJDIR)/allrepo_.c:$(OBJDIR)/allrepo.h $(OBJDIR)/attach_.c:$(OBJDIR)/attach.h $(OBJDIR)/bag_.c:$(OBJDIR)/bag.h $(OBJDIR)/bisect_.c:$(OBJDIR)/bisect.h $(OBJDIR)/blob_.c:$(OBJDIR)/blob.h $(OBJDIR)/branch_.c:$(OBJDIR)/branch.h $(OBJDIR)/browse_.c:$(OBJDIR)/browse.h $(OBJDIR)/captcha_.c:$(OBJDIR)/captcha.h $(OBJDIR)/cgi_.c:$(OBJDIR)/cgi.h $(OBJDIR)/checkin_.c:$(OBJDIR)/checkin.h $(OBJDIR)/checkout_.c:$(OBJDIR)/checkout.h $(OBJDIR)/clearsign_.c:$(OBJDIR)/clearsign.h $(OBJDIR)/clone_.c:$(OBJDIR)/clone.h $(OBJDIR)/comformat_.c:$(OBJDIR)/comformat.h $(OBJDIR)/configure_.c:$(OBJDIR)/configure.h $(OBJDIR)/content_.c:$(OBJDIR)/content.h $(OBJDIR)/db_.c:$(OBJDIR)/db.h $(OBJDIR)/delta_.c:$(OBJDIR)/delta.h $(OBJDIR)/deltacmd_.c:$(OBJDIR)/deltacmd.h $(OBJDIR)/descendants_.c:$(OBJDIR)/descendants.h $(OBJDIR)/diff_.c:$(OBJDIR)/diff.h $(OBJDIR)/diffcmd_.c:$(OBJDIR)/diffcmd.h $(OBJDIR)/doc_.c:$(OBJDIR)/doc.h $(OBJDIR)/encode_.c:$(OBJDIR)/encode.h $(OBJDIR)/event_.c:$(OBJDIR)/event.h $(OBJDIR)/export_.c:$(OBJDIR)/export.h $(OBJDIR)/file_.c:$(OBJDIR)/file.h $(OBJDIR)/finfo_.c:$(OBJDIR)/finfo.h $(OBJDIR)/glob_.c:$(OBJDIR)/glob.h $(OBJDIR)/graph_.c:$(OBJDIR)/graph.h $(OBJDIR)/gzip_.c:$(OBJDIR)/gzip.h $(OBJDIR)/http_.c:$(OBJDIR)/http.h $(OBJDIR)/http_socket_.c:$(OBJDIR)/http_socket.h $(OBJDIR)/http_ssl_.c:$(OBJDIR)/http_ssl.h $(OBJDIR)/http_transport_.c:$(OBJDIR)/http_transport.h $(OBJDIR)/import_.c:$(OBJDIR)/import.h $(OBJDIR)/info_.c:$(OBJDIR)/info.h $(OBJDIR)/json_.c:$(OBJDIR)/json.h $(OBJDIR)/json_artifact_.c:$(OBJDIR)/json_artifact.h $(OBJDIR)/json_branch_.c:$(OBJDIR)/json_branch.h $(OBJDIR)/json_config_.c:$(OBJDIR)/json_config.h $(OBJDIR)/json_diff_.c:$(OBJDIR)/json_diff.h $(OBJDIR)/json_dir_.c:$(OBJDIR)/json_dir.h $(OBJDIR)/json_finfo_.c:$(OBJDIR)/json_finfo.h $(OBJDIR)/json_login_.c:$(OBJDIR)/json_login.h $(OBJDIR)/json_query_.c:$(OBJDIR)/json_query.h $(OBJDIR)/json_report_.c:$(OBJDIR)/json_report.h $(OBJDIR)/json_tag_.c:$(OBJDIR)/json_tag.h $(OBJDIR)/json_timeline_.c:$(OBJDIR)/json_timeline.h $(OBJDIR)/json_user_.c:$(OBJDIR)/json_user.h $(OBJDIR)/json_wiki_.c:$(OBJDIR)/json_wiki.h $(OBJDIR)/leaf_.c:$(OBJDIR)/leaf.h $(OBJDIR)/login_.c:$(OBJDIR)/login.h $(OBJDIR)/main_.c:$(OBJDIR)/main.h $(OBJDIR)/manifest_.c:$(OBJDIR)/manifest.h $(OBJDIR)/md5_.c:$(OBJDIR)/md5.h $(OBJDIR)/merge_.c:$(OBJDIR)/merge.h $(OBJDIR)/merge3_.c:$(OBJDIR)/merge3.h $(OBJDIR)/name_.c:$(OBJDIR)/name.h $(OBJDIR)/path_.c:$(OBJDIR)/path.h $(OBJDIR)/pivot_.c:$(OBJDIR)/pivot.h $(OBJDIR)/popen_.c:$(OBJDIR)/popen.h $(OBJDIR)/pqueue_.c:$(OBJDIR)/pqueue.h $(OBJDIR)/printf_.c:$(OBJDIR)/printf.h $(OBJDIR)/rebuild_.c:$(OBJDIR)/rebuild.h $(OBJDIR)/report_.c:$(OBJDIR)/report.h $(OBJDIR)/rss_.c:$(OBJDIR)/rss.h $(OBJDIR)/schema_.c:$(OBJDIR)/schema.h $(OBJDIR)/search_.c:$(OBJDIR)/search.h $(OBJDIR)/setup_.c:$(OBJDIR)/setup.h $(OBJDIR)/sha1_.c:$(OBJDIR)/sha1.h $(OBJDIR)/shun_.c:$(OBJDIR)/shun.h $(OBJDIR)/skins_.c:$(OBJDIR)/skins.h $(OBJDIR)/sqlcmd_.c:$(OBJDIR)/sqlcmd.h $(OBJDIR)/stash_.c:$(OBJDIR)/stash.h $(OBJDIR)/stat_.c:$(OBJDIR)/stat.h $(OBJDIR)/style_.c:$(OBJDIR)/style.h $(OBJDIR)/sync_.c:$(OBJDIR)/sync.h $(OBJDIR)/tag_.c:$(OBJDIR)/tag.h $(OBJDIR)/tar_.c:$(OBJDIR)/tar.h $(OBJDIR)/th_main_.c:$(OBJDIR)/th_main.h $(OBJDIR)/timeline_.c:$(OBJDIR)/timeline.h $(OBJDIR)/tkt_.c:$(OBJDIR)/tkt.h $(OBJDIR)/tktsetup_.c:$(OBJDIR)/tktsetup.h $(OBJDIR)/undo_.c:$(OBJDIR)/undo.h $(OBJDIR)/update_.c:$(OBJDIR)/update.h $(OBJDIR)/url_.c:$(OBJDIR)/url.h $(OBJDIR)/user_.c:$(OBJDIR)/user.h $(OBJDIR)/verify_.c:$(OBJDIR)/verify.h $(OBJDIR)/vfile_.c:$(OBJDIR)/vfile.h $(OBJDIR)/wiki_.c:$(OBJDIR)/wiki.h $(OBJDIR)/wikiformat_.c:$(OBJDIR)/wikiformat.h $(OBJDIR)/winhttp_.c:$(OBJDIR)/winhttp.h $(OBJDIR)/wysiwyg_.c:$(OBJDIR)/wysiwyg.h $(OBJDIR)/xfer_.c:$(OBJDIR)/xfer.h $(OBJDIR)/xfersetup_.c:$(OBJDIR)/xfersetup.h $(OBJDIR)/zip_.c:$(OBJDIR)/zip.h $(SRCDIR)/sqlite3.h $(SRCDIR)/th.h $(OBJDIR)/VERSION.h touch $(OBJDIR)/headers $(OBJDIR)/headers: Makefile $(OBJDIR)/json.o $(OBJDIR)/json_artifact.o $(OBJDIR)/json_branch.o $(OBJDIR)/json_config.o $(OBJDIR)/json_diff.o $(OBJDIR)/json_dir.o $(OBJDIR)/json_finfo.o $(OBJDIR)/json_login.o $(OBJDIR)/json_query.o $(OBJDIR)/json_report.o $(OBJDIR)/json_tag.o $(OBJDIR)/json_timeline.o $(OBJDIR)/json_user.o $(OBJDIR)/json_wiki.o : $(SRCDIR)/json_detail.h Makefile: $(OBJDIR)/add_.c: $(SRCDIR)/add.c $(OBJDIR)/translate @@ -1038,10 +1041,17 @@ $(OBJDIR)/winhttp.o: $(OBJDIR)/winhttp_.c $(OBJDIR)/winhttp.h $(SRCDIR)/config.h $(XTCC) -o $(OBJDIR)/winhttp.o -c $(OBJDIR)/winhttp_.c $(OBJDIR)/winhttp.h: $(OBJDIR)/headers +$(OBJDIR)/wysiwyg_.c: $(SRCDIR)/wysiwyg.c $(OBJDIR)/translate + $(OBJDIR)/translate $(SRCDIR)/wysiwyg.c >$(OBJDIR)/wysiwyg_.c + +$(OBJDIR)/wysiwyg.o: $(OBJDIR)/wysiwyg_.c $(OBJDIR)/wysiwyg.h $(SRCDIR)/config.h + $(XTCC) -o $(OBJDIR)/wysiwyg.o -c $(OBJDIR)/wysiwyg_.c + +$(OBJDIR)/wysiwyg.h: $(OBJDIR)/headers $(OBJDIR)/xfer_.c: $(SRCDIR)/xfer.c $(OBJDIR)/translate $(OBJDIR)/translate $(SRCDIR)/xfer.c >$(OBJDIR)/xfer_.c $(OBJDIR)/xfer.o: $(OBJDIR)/xfer_.c $(OBJDIR)/xfer.h $(SRCDIR)/config.h $(XTCC) -o $(OBJDIR)/xfer.o -c $(OBJDIR)/xfer_.c Index: src/makemake.tcl ================================================================== --- src/makemake.tcl +++ src/makemake.tcl @@ -109,10 +109,11 @@ verify vfile wiki wikiformat winhttp + wysiwyg xfer xfersetup zip http_ssl } Index: src/setup.c ================================================================== --- src/setup.c +++ src/setup.c @@ -57,10 +57,19 @@ if( !g.perm.Setup ){ login_needed(); } style_header("Server Administration"); + + /* Make sure the header contains . Issue a warning + ** if it does not. */ + if( !cgi_header_contains("Configuration Error: Please add + @ <base href="$baseurl/$current_page"> after + @ <head> in the HTML header!

+ } + @ setup_menu_entry("Users", "setup_ulist", "Grant privileges to individual users."); setup_menu_entry("Access", "setup_access", "Control access settings."); @@ -869,13 +878,15 @@ login_verify_csrf_secret(); db_set(zVar, zQ, 0); z = zQ; } if( rows>0 && cols>0 ){ - @ - if (zLabel && *zLabel) + @ + if (zLabel && *zLabel){ @ %s(zLabel) + } } } /* @@ -1237,15 +1248,21 @@ @
entry_attribute("Project Name", 60, "project-name", "pn", ""); @

Give your project a name so visitors know what this site is about. @ The project name will also be used as the RSS feed title.

@
- textarea_attribute("Project Description", 5, 60, + textarea_attribute("Project Description", 3, 80, "project-description", "pd", ""); @

Describe your project. This will be used in page headers for search @ engines as well as a short RSS description.

@
+ onoff_attribute("Enable WYSIWYG Wiki Editing", + "wysiwyg-wiki", "wysiwyg-wiki", 0); + @

Enable what-you-see-is-what-you-get (WYSIWYG) editing of wiki pages. + @ The WYSIWYG editor generates HTML instead of markup, which makes + @ subsequent manual editing more difficult.

+ @
entry_attribute("Index Page", 60, "index-page", "idxpg", "/home"); @

Enter the pathname of the page to display when the "Home" menu @ option is selected and when no pathname is @ specified in the URL. For example, if you visit the url:

@ @@ -1297,22 +1314,21 @@ if( P("clear")!=0 ){ db_multi_exec("DELETE FROM config WHERE name='css'"); cgi_replace_parameter("css", zDefaultCSS); db_end_transaction(0); cgi_redirect("setup_editcss"); - }else{ - textarea_attribute(0, 0, 0, "css", "css", zDefaultCSS); } if( P("submit")!=0 ){ + textarea_attribute(0, 0, 0, "css", "css", zDefaultCSS); db_end_transaction(0); cgi_redirect("setup_editcss"); } style_header("Edit CSS"); @
login_insert_csrf_secret(); @ Edit the CSS below:
- textarea_attribute("", 40, 80, "css", "css", zDefaultCSS); + textarea_attribute("", 35, 80, "css", "css", zDefaultCSS); @
@ @ @
@

Note: Press your browser Reload button after @@ -1339,20 +1355,43 @@ } db_begin_transaction(); if( P("clear")!=0 ){ db_multi_exec("DELETE FROM config WHERE name='header'"); cgi_replace_parameter("header", zDefaultHeader); - }else{ + }else if( P("submit")!=0 ){ textarea_attribute(0, 0, 0, "header", "header", zDefaultHeader); + }else if( P("fixbase")!=0 ){ + const char *z = db_get("header", (char*)zDefaultHeader); + char *zHead = strstr(z, ""); + if( strstr(z, "\n%s", + zHead+6-z, z, zTail); + cgi_replace_parameter("header", zNew); + db_set("header", zNew, 0); + } } + style_header("Edit Page Header"); - @

+ @
+ + /* Make sure the header contains . Issue a warning + ** if it does not. */ + if( !cgi_header_contains("Please add + @ <base href="$baseurl/$current_page"> after + @ <head> in the header! + @

+ } + login_insert_csrf_secret(); @

Edit HTML text with embedded TH1 (a TCL dialect) that will be used to @ generate the beginning of every page through start of the main @ menu.

- textarea_attribute("", 40, 80, "header", "header", zDefaultHeader); + textarea_attribute("", 35, 80, "header", "header", zDefaultHeader); @
@ @ @
@
@@ -1377,13 +1416,12 @@ } db_begin_transaction(); if( P("clear")!=0 ){ db_multi_exec("DELETE FROM config WHERE name='footer'"); cgi_replace_parameter("footer", zDefaultFooter); - }else{ - textarea_attribute(0, 0, 0, "footer", "footer", zDefaultFooter); } + style_header("Edit Page Footer"); @
login_insert_csrf_secret(); @

Edit HTML text with embedded TH1 (a TCL dialect) that will be used to @ generate the end of every page.

@@ -1414,13 +1452,12 @@ } db_begin_transaction(); if( P("clear")!=0 ){ db_multi_exec("DELETE FROM config WHERE name GLOB 'adunit*'"); cgi_replace_parameter("adunit",""); - }else{ - textarea_attribute(0, 0, 0, "adunit", "adunit", ""); } + style_header("Edit Ad Unit"); @
login_insert_csrf_secret(); @

Edit HTML text for an ad unit that will be inserted after the @ menu bar and above the content of every page.

Index: src/skins.c ================================================================== --- src/skins.c +++ src/skins.c @@ -156,10 +156,11 @@ @ text-align: right; @ padding: 0.2ex 2ex; @ }'); @ REPLACE INTO config(name,mtime,value) VALUES('header',now(),' @ +@ @ $<project_name>: $<title> @ @ @@ -358,10 +359,11 @@ @ text-align: right; @ padding: 0.2ex 2ex; @ }'); @ REPLACE INTO config(name,mtime,value) VALUES('header',now(),' @ +@ @ $<project_name>: $<title> @ @ @@ -594,10 +596,11 @@ @ text-align: right; @ padding: 0.2ex 2ex; @ }'); @ REPLACE INTO config(name,mtime,value) VALUES('header',now(),' @ +@ @ $<project_name>: $<title> @ @ @@ -892,10 +895,11 @@ @ textarea { @ font-size: 1em; @ }'); @ REPLACE INTO config(name,mtime,value) VALUES('header',now(),' @ +@ @ $<project_name>: $<title> @ @ Index: src/style.c ================================================================== --- src/style.c +++ src/style.c @@ -203,11 +203,12 @@ g.cgiOutput = 1; headerHasBeenGenerated = 1; sideboxUsed = 0; /* Make the gebi(x) function available as an almost-alias for - ** document.getElementById(x) (except that it throws if the element is not found). + ** document.getElementById(x) (except that it throws an error + ** if the element is not found). ** ** Maintenance note: this function must of course be available ** before it is called. It "should" go in the HEAD so that client ** HEAD code can make use of it, but because the client can replace ** the HEAD, and some fossil pages rely on gebi(), we put it here. @@ -316,10 +317,11 @@ ** The default page header. */ const char zDefaultHeader[] = @ @ +@ @ $<project_name>: $<title> @ @ @@ -340,34 +342,34 @@ @
@ ; /* Index: src/wiki.c ================================================================== --- src/wiki.c +++ src/wiki.c @@ -185,12 +185,19 @@ zBody = pWiki->zWiki; } } if( !g.isHome ){ if( (rid && g.perm.WrWiki) || (!rid && g.perm.NewWiki) ){ - style_submenu_element("Edit", "Edit Wiki Page", "%s/wikiedit?name=%T", - g.zTop, zPageName); + if( db_get_boolean("wysiwyg-wiki", 0) ){ + style_submenu_element("Edit", "Edit Wiki Page", + "%s/wikiedit?name=%T&wysiwyg=1", + g.zTop, zPageName); + }else{ + style_submenu_element("Edit", "Edit Wiki Page", + "%s/wikiedit?name=%T", + g.zTop, zPageName); + } } if( rid && g.perm.ApndWiki && g.perm.Attach ){ style_submenu_element("Attach", "Add An Attachment", "%s/attachadd?page=%T&from=%s/wiki%%3fname=%T", g.zTop, zPageName, g.zTop, zPageName); @@ -260,13 +267,23 @@ const char *zPageName; char *zHtmlPageName; int n; const char *z; char *zBody = (char*)P("w"); + int isWysiwyg = P("wysiwyg")!=0; + if( P("edit-wysiwyg")!=0 ){ isWysiwyg = 1; zBody = 0; } + if( P("edit-markup")!=0 ){ isWysiwyg = 0; zBody = 0; } if( zBody ){ - zBody = mprintf("%s", zBody); + if( isWysiwyg ){ + Blob body; + blob_zero(&body); + htmlTidy(zBody, &body); + zBody = blob_str(&body); + }else{ + zBody = mprintf("%s", zBody); + } } login_check_credentials(); zPageName = PD("name",""); if( check_name(zPageName) ) return; isSandbox = is_sandbox(zPageName); @@ -336,34 +353,59 @@ if( zBody==0 ){ zBody = mprintf("Empty Page"); } zHtmlPageName = mprintf("Edit: %s", zPageName); style_header(zHtmlPageName); + blob_zero(&wiki); + blob_append(&wiki, zBody, -1); if( P("preview")!=0 ){ - blob_zero(&wiki); - blob_append(&wiki, zBody, -1); @ Preview:
wiki_convert(&wiki, 0, 0); @
blob_reset(&wiki); } for(n=2, z=zBody; z[0]; z++){ if( z[0]=='\n' ) n++; } if( n<20 ) n = 20; - if( n>40 ) n = 40; - @
+ if( n>30 ) n = 30; + if( !isWysiwyg ){ + /* Traditional markup-only editing */ + @
+ @ + @
+ if( db_get_boolean("wysiwyg-wiki", 0) ){ + @ + } + @ + }else{ + /* Wysiwyg editing */ + Blob html, temp; + @
+ @ + blob_zero(&temp); + wiki_convert(&wiki, &temp, 0); + blob_zero(&html); + htmlTidy(blob_str(&temp), &html); + blob_reset(&temp); + wysiwygEditor("w", blob_str(&html), 60, n); + blob_reset(&html); + @
+ @ + } + @ login_insert_csrf_secret(); @ - @ - @
- @ - @ - @ + @ @
manifest_destroy(pWiki); + blob_reset(&wiki); style_footer(); } /* ** WEBPAGE: wikinew @@ -379,11 +421,15 @@ login_needed(); return; } zName = PD("name",""); if( zName[0] && wiki_name_is_wellformed((const unsigned char *)zName) ){ - cgi_redirectf("wikiedit?name=%T", zName); + if( db_get_boolean("wysiwyg-wiki", 0) ){ + cgi_redirectf("wikiedit?name=%T&wysiwyg=1", zName); + }else{ + cgi_redirectf("wikiedit?name=%T", zName); + } } style_header("Create A New Wiki Page"); @

Rules for wiki page names:

well_formed_wiki_name_rules(); @
Index: src/wikiformat.c ================================================================== --- src/wikiformat.c +++ src/wikiformat.c @@ -1079,20 +1079,20 @@ */ if( isClosed ){ if( g.perm.Hyperlink ){ blob_appendf(p->pOut, "%z[", - href("%R/info/%s",zTarget) + href("info/%s",zTarget) ); zTerm = "]"; }else{ blob_appendf(p->pOut,"["); zTerm = "]"; } }else{ if( g.perm.Hyperlink ){ - blob_appendf(p->pOut,"%z[", href("%R/info/%s", zTarget)); + blob_appendf(p->pOut,"%z[", href("info/%s", zTarget)); zTerm = "]"; }else{ blob_appendf(p->pOut, "["); zTerm = "]"; } @@ -1099,22 +1099,22 @@ } }else if( !in_this_repo(zTarget) ){ blob_appendf(p->pOut, "[", zTarget); zTerm = "]"; }else if( g.perm.Hyperlink ){ - blob_appendf(p->pOut, "%z[",href("%R/info/%s", zTarget)); + blob_appendf(p->pOut, "%z[",href("info/%s", zTarget)); zTerm = "]"; } }else if( strlen(zTarget)>=10 && fossil_isdigit(zTarget[0]) && zTarget[4]=='-' && db_int(0, "SELECT datetime(%Q) NOT NULL", zTarget) ){ - blob_appendf(p->pOut, "", g.zTop, zTarget); + blob_appendf(p->pOut, "", zTarget); }else if( strncmp(zTarget, "wiki:", 5)==0 && wiki_name_is_wellformed((const unsigned char*)zTarget) ){ zTarget += 5; - blob_appendf(p->pOut, "", g.zTop, zTarget); + blob_appendf(p->pOut, "", zTarget); }else if( wiki_name_is_wellformed((const unsigned char *)zTarget) ){ - blob_appendf(p->pOut, "", g.zTop, zTarget); + blob_appendf(p->pOut, "", zTarget); }else{ blob_appendf(p->pOut, "[%h]", zTarget); zTerm = ""; } assert( strlen(zTerm)

+** * Put a newline after
and
+** * Start each of the following elements on a new line: +**
    1. +**