Changes On Branch wysiwyg
Not logged in

Many hyperlinks are disabled.
Use anonymous login to enable hyperlinks.

Changes In Branch wysiwyg Excluding Merge-Ins

This is equivalent to a diff from 717cd2782c to e5ad103777

2012-08-14
17:30
Merge in the WYSIWYG editor branch, making WYSIWYG an option for trunk users. WYSIWYG is still off by default. check-in: 65870e8736 user: drh tags: trunk
2012-08-13
12:54
Disable the cut/copy/paste buttons on the WYSIWYG editor, since doing cut/copy/paste under javascript control is normally disallowed for security reasons. Leaf check-in: e5ad103777 user: drh tags: wysiwyg
12:39
Adjust the $current_page for the doc webpage so that it includes the embedded document being rendered. check-in: 22e2051111 user: drh tags: trunk
12:30
Fixes to the <base> addition to the HTML header so that it works correctly with the "doc" webpage. Href is now $baseurl/$current_page. check-in: fd10cdbaf8 user: drh tags: wysiwyg
2012-08-10
19:59
Add experimental support for WYSIWYG editing of wiki pages. check-in: 6cd9847f54 user: drh tags: wysiwyg
12:59
Allow the style= attribute in wiki markup. check-in: 717cd2782c user: drh tags: trunk
2012-08-09
19:16
Fix the "Delete Ad-Unit" button so that it really does delete the ad-unit. check-in: 869e27e739 user: drh tags: trunk

Changes to src/cgi.c.

    93     93         break;
    94     94       }
    95     95       default: {
    96     96         cgi_panic("bad destination");
    97     97       }
    98     98     }
    99     99   }
          100  +
          101  +/*
          102  +** Check to see if the header contains the zNeedle string.  Return true
          103  +** if it does and false if it does not.
          104  +*/
          105  +int cgi_header_contains(const char *zNeedle){
          106  +  return strstr(blob_str(&cgiContent[0]), zNeedle)!=0;
          107  +}
   100    108   
   101    109   /*
   102    110   ** Append reply content to what already exists.
   103    111   */
   104    112   void cgi_append_content(const char *zData, int nAmt){
   105    113     blob_append(pContent, zData, nAmt);
   106    114   }

Changes to src/doc.c.

   368    368     if( !g.perm.Read ){ login_needed(); return; }
   369    369     zName = PD("name", "tip/index.wiki");
   370    370     for(i=0; zName[i] && zName[i]!='/'; i++){}
   371    371     if( zName[i]==0 || i>UUID_SIZE ){
   372    372       zName = "index.html";
   373    373       goto doc_not_found;
   374    374     }
          375  +  g.zPath = mprintf("%s/%s", g.zPath, zName);
   375    376     memcpy(zBaseline, zName, i);
   376    377     zBaseline[i] = 0;
   377    378     zName += i;
   378    379     while( zName[0]=='/' ){ zName++; }
   379    380     if( !file_is_simple_pathname(zName) ){
   380    381       int n = strlen(zName);
   381    382       if( n>0 && zName[n-1]=='/' ){

Changes to src/main.mk.

   104    104     $(SRCDIR)/url.c \
   105    105     $(SRCDIR)/user.c \
   106    106     $(SRCDIR)/verify.c \
   107    107     $(SRCDIR)/vfile.c \
   108    108     $(SRCDIR)/wiki.c \
   109    109     $(SRCDIR)/wikiformat.c \
   110    110     $(SRCDIR)/winhttp.c \
          111  +  $(SRCDIR)/wysiwyg.c \
   111    112     $(SRCDIR)/xfer.c \
   112    113     $(SRCDIR)/xfersetup.c \
   113    114     $(SRCDIR)/zip.c
   114    115   
   115    116   TRANS_SRC = \
   116    117     $(OBJDIR)/add_.c \
   117    118     $(OBJDIR)/allrepo_.c \
................................................................................
   203    204     $(OBJDIR)/url_.c \
   204    205     $(OBJDIR)/user_.c \
   205    206     $(OBJDIR)/verify_.c \
   206    207     $(OBJDIR)/vfile_.c \
   207    208     $(OBJDIR)/wiki_.c \
   208    209     $(OBJDIR)/wikiformat_.c \
   209    210     $(OBJDIR)/winhttp_.c \
          211  +  $(OBJDIR)/wysiwyg_.c \
   210    212     $(OBJDIR)/xfer_.c \
   211    213     $(OBJDIR)/xfersetup_.c \
   212    214     $(OBJDIR)/zip_.c
   213    215   
   214    216   OBJ = \
   215    217    $(OBJDIR)/add.o \
   216    218    $(OBJDIR)/allrepo.o \
................................................................................
   302    304    $(OBJDIR)/url.o \
   303    305    $(OBJDIR)/user.o \
   304    306    $(OBJDIR)/verify.o \
   305    307    $(OBJDIR)/vfile.o \
   306    308    $(OBJDIR)/wiki.o \
   307    309    $(OBJDIR)/wikiformat.o \
   308    310    $(OBJDIR)/winhttp.o \
          311  + $(OBJDIR)/wysiwyg.o \
   309    312    $(OBJDIR)/xfer.o \
   310    313    $(OBJDIR)/xfersetup.o \
   311    314    $(OBJDIR)/zip.o
   312    315   
   313    316   APPNAME = fossil$(E)
   314    317   
   315    318   
................................................................................
   373    376   clean:	
   374    377   	rm -rf $(OBJDIR)/* $(APPNAME)
   375    378   
   376    379   
   377    380   $(OBJDIR)/page_index.h: $(TRANS_SRC) $(OBJDIR)/mkindex
   378    381   	$(OBJDIR)/mkindex $(TRANS_SRC) >$@
   379    382   $(OBJDIR)/headers:	$(OBJDIR)/page_index.h $(OBJDIR)/makeheaders $(OBJDIR)/VERSION.h
   380         -	$(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
          383  +	$(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
   381    384   	touch $(OBJDIR)/headers
   382    385   $(OBJDIR)/headers: Makefile
   383    386   $(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
   384    387   Makefile:
   385    388   $(OBJDIR)/add_.c:	$(SRCDIR)/add.c $(OBJDIR)/translate
   386    389   	$(OBJDIR)/translate $(SRCDIR)/add.c >$(OBJDIR)/add_.c
   387    390   
................................................................................
  1036   1039   $(OBJDIR)/winhttp_.c:	$(SRCDIR)/winhttp.c $(OBJDIR)/translate
  1037   1040   	$(OBJDIR)/translate $(SRCDIR)/winhttp.c >$(OBJDIR)/winhttp_.c
  1038   1041   
  1039   1042   $(OBJDIR)/winhttp.o:	$(OBJDIR)/winhttp_.c $(OBJDIR)/winhttp.h  $(SRCDIR)/config.h
  1040   1043   	$(XTCC) -o $(OBJDIR)/winhttp.o -c $(OBJDIR)/winhttp_.c
  1041   1044   
  1042   1045   $(OBJDIR)/winhttp.h:	$(OBJDIR)/headers
         1046  +$(OBJDIR)/wysiwyg_.c:	$(SRCDIR)/wysiwyg.c $(OBJDIR)/translate
         1047  +	$(OBJDIR)/translate $(SRCDIR)/wysiwyg.c >$(OBJDIR)/wysiwyg_.c
         1048  +
         1049  +$(OBJDIR)/wysiwyg.o:	$(OBJDIR)/wysiwyg_.c $(OBJDIR)/wysiwyg.h  $(SRCDIR)/config.h
         1050  +	$(XTCC) -o $(OBJDIR)/wysiwyg.o -c $(OBJDIR)/wysiwyg_.c
         1051  +
         1052  +$(OBJDIR)/wysiwyg.h:	$(OBJDIR)/headers
  1043   1053   $(OBJDIR)/xfer_.c:	$(SRCDIR)/xfer.c $(OBJDIR)/translate
  1044   1054   	$(OBJDIR)/translate $(SRCDIR)/xfer.c >$(OBJDIR)/xfer_.c
  1045   1055   
  1046   1056   $(OBJDIR)/xfer.o:	$(OBJDIR)/xfer_.c $(OBJDIR)/xfer.h  $(SRCDIR)/config.h
  1047   1057   	$(XTCC) -o $(OBJDIR)/xfer.o -c $(OBJDIR)/xfer_.c
  1048   1058   
  1049   1059   $(OBJDIR)/xfer.h:	$(OBJDIR)/headers

Changes to src/makemake.tcl.

   107    107     url
   108    108     user
   109    109     verify
   110    110     vfile
   111    111     wiki
   112    112     wikiformat
   113    113     winhttp
          114  +  wysiwyg
   114    115     xfer
   115    116     xfersetup
   116    117     zip
   117    118     http_ssl
   118    119   }
   119    120   
   120    121   # Name of the final application

Changes to src/setup.c.

    55     55   void setup_page(void){
    56     56     login_check_credentials();
    57     57     if( !g.perm.Setup ){
    58     58       login_needed();
    59     59     }
    60     60   
    61     61     style_header("Server Administration");
           62  +
           63  +  /* Make sure the header contains <base href="...">.   Issue a warning
           64  +  ** if it does not. */
           65  +  if( !cgi_header_contains("<base href=") ){
           66  +    @ <p class="generalError"><b>Configuration Error:</b> Please add
           67  +    @ <tt>&lt;base href="$baseurl/$current_page"&gt</tt> after
           68  +    @ <tt>&lt;head&gt;</tt> in the <a href="setup_header">HTML header</a>!</p>
           69  +  }
           70  +
    62     71     @ <table border="0" cellspacing="7">
    63     72     setup_menu_entry("Users", "setup_ulist",
    64     73       "Grant privileges to individual users.");
    65     74     setup_menu_entry("Access", "setup_access",
    66     75       "Control access settings.");
    67     76     setup_menu_entry("Configuration", "setup_config",
    68     77       "Configure the WWW components of the repository");
................................................................................
   867    876     const char *zQ = P(zQP);
   868    877     if( zQ && fossil_strcmp(zQ,z)!=0 ){
   869    878       login_verify_csrf_secret();
   870    879       db_set(zVar, zQ, 0);
   871    880       z = zQ;
   872    881     }
   873    882     if( rows>0 && cols>0 ){
   874         -    @ <textarea name="%s(zQP)" rows="%d(rows)" cols="%d(cols)">%h(z)</textarea>
   875         -    if (zLabel && *zLabel)
          883  +    @ <textarea id="id%s(zQP)" name="%s(zQP)" rows="%d(rows)"
          884  +    @ cols="%d(cols)">%h(z)</textarea>
          885  +    if (zLabel && *zLabel){
   876    886         @ <span class="textareaLabel">%s(zLabel)</span>
          887  +    }
   877    888     }
   878    889   }
   879    890   
   880    891   
   881    892   /*
   882    893   ** WEBPAGE: setup_access
   883    894   */
................................................................................
  1235   1246     @ <form action="%s(g.zTop)/setup_config" method="post"><div>
  1236   1247     login_insert_csrf_secret();
  1237   1248     @ <hr />
  1238   1249     entry_attribute("Project Name", 60, "project-name", "pn", "");
  1239   1250     @ <p>Give your project a name so visitors know what this site is about.
  1240   1251     @ The project name will also be used as the RSS feed title.</p>
  1241   1252     @ <hr />
  1242         -  textarea_attribute("Project Description", 5, 60,
         1253  +  textarea_attribute("Project Description", 3, 80,
  1243   1254                        "project-description", "pd", "");
  1244   1255     @ <p>Describe your project. This will be used in page headers for search
  1245   1256     @ engines as well as a short RSS description.</p>
  1246   1257     @ <hr />
         1258  +  onoff_attribute("Enable WYSIWYG Wiki Editing",
         1259  +                  "wysiwyg-wiki", "wysiwyg-wiki", 0);
         1260  +  @ <p>Enable what-you-see-is-what-you-get (WYSIWYG) editing of wiki pages.
         1261  +  @ The WYSIWYG editor generates HTML instead of markup, which makes
         1262  +  @ subsequent manual editing more difficult.</p>
         1263  +  @ <hr />
  1247   1264     entry_attribute("Index Page", 60, "index-page", "idxpg", "/home");
  1248   1265     @ <p>Enter the pathname of the page to display when the "Home" menu
  1249   1266     @ option is selected and when no pathname is
  1250   1267     @ specified in the URL.  For example, if you visit the url:</p>
  1251   1268     @
  1252   1269     @ <blockquote><p>%h(g.zBaseURL)</p></blockquote>
  1253   1270     @
................................................................................
  1295   1312     }
  1296   1313     db_begin_transaction();
  1297   1314     if( P("clear")!=0 ){
  1298   1315       db_multi_exec("DELETE FROM config WHERE name='css'");
  1299   1316       cgi_replace_parameter("css", zDefaultCSS);
  1300   1317       db_end_transaction(0);
  1301   1318       cgi_redirect("setup_editcss");
  1302         -  }else{
  1303         -    textarea_attribute(0, 0, 0, "css", "css", zDefaultCSS);
  1304   1319     }
  1305   1320     if( P("submit")!=0 ){
         1321  +    textarea_attribute(0, 0, 0, "css", "css", zDefaultCSS);
  1306   1322       db_end_transaction(0);
  1307   1323       cgi_redirect("setup_editcss");
  1308   1324     }
  1309   1325     style_header("Edit CSS");
  1310   1326     @ <form action="%s(g.zTop)/setup_editcss" method="post"><div>
  1311   1327     login_insert_csrf_secret();
  1312   1328     @ Edit the CSS below:<br />
  1313         -  textarea_attribute("", 40, 80, "css", "css", zDefaultCSS);
         1329  +  textarea_attribute("", 35, 80, "css", "css", zDefaultCSS);
  1314   1330     @ <br />
  1315   1331     @ <input type="submit" name="submit" value="Apply Changes" />
  1316   1332     @ <input type="submit" name="clear" value="Revert To Default" />
  1317   1333     @ </div></form>
  1318   1334     @ <p><span class="note">Note:</span> Press your browser Reload button after
  1319   1335     @ modifying the CSS in order to pull in the modified CSS file.</p>
  1320   1336     @ <hr />
................................................................................
  1337   1353     if( !g.perm.Setup ){
  1338   1354       login_needed();
  1339   1355     }
  1340   1356     db_begin_transaction();
  1341   1357     if( P("clear")!=0 ){
  1342   1358       db_multi_exec("DELETE FROM config WHERE name='header'");
  1343   1359       cgi_replace_parameter("header", zDefaultHeader);
  1344         -  }else{
         1360  +  }else if( P("submit")!=0 ){
  1345   1361       textarea_attribute(0, 0, 0, "header", "header", zDefaultHeader);
         1362  +  }else if( P("fixbase")!=0 ){
         1363  +    const char *z = db_get("header", (char*)zDefaultHeader);
         1364  +    char *zHead = strstr(z, "<head>");
         1365  +    if( strstr(z, "<base href=")==0 && zHead!=0 ){
         1366  +      char *zNew;
         1367  +      char *zTail = &zHead[6];
         1368  +      while( fossil_isspace(zTail[0]) ) zTail++;
         1369  +      zNew = mprintf("%.*s\n<base href=\"$baseurl/$current_page\" />\n%s",
         1370  +                     zHead+6-z, z, zTail);
         1371  +      cgi_replace_parameter("header", zNew);
         1372  +      db_set("header", zNew, 0);
         1373  +    }
  1346   1374     }
         1375  +
  1347   1376     style_header("Edit Page Header");
  1348         -  @ <form action="%s(g.zTop)/setup_header" method="post"><div>
         1377  +  @ <form action="%R/setup_header" method="post"><div>
         1378  +
         1379  +  /* Make sure the header contains <base href="...">.   Issue a warning
         1380  +  ** if it does not. */
         1381  +  if( !cgi_header_contains("<base href=") ){
         1382  +    @ <p class="generalError">Please add
         1383  +    @ <tt>&lt;base href="$baseurl/$current_page"&gt</tt> after
         1384  +    @ <tt>&lt;head&gt;</tt> in the header!
         1385  +    @ <input type="submit" name="fixbase" value="Add &lt;base&gt; Now"></p>
         1386  +  }
         1387  +
  1349   1388     login_insert_csrf_secret();
  1350   1389     @ <p>Edit HTML text with embedded TH1 (a TCL dialect) that will be used to
  1351   1390     @ generate the beginning of every page through start of the main
  1352   1391     @ menu.</p>
  1353         -  textarea_attribute("", 40, 80, "header", "header", zDefaultHeader);
         1392  +  textarea_attribute("", 35, 80, "header", "header", zDefaultHeader);
  1354   1393     @ <br />
  1355   1394     @ <input type="submit" name="submit" value="Apply Changes" />
  1356   1395     @ <input type="submit" name="clear" value="Revert To Default" />
  1357   1396     @ </div></form>
  1358   1397     @ <hr />
  1359   1398     @ The default header is shown below for reference.  Other examples
  1360   1399     @ of headers can be seen on the <a href="setup_skin">skins page</a>.
................................................................................
  1375   1414     if( !g.perm.Setup ){
  1376   1415       login_needed();
  1377   1416     }
  1378   1417     db_begin_transaction();
  1379   1418     if( P("clear")!=0 ){
  1380   1419       db_multi_exec("DELETE FROM config WHERE name='footer'");
  1381   1420       cgi_replace_parameter("footer", zDefaultFooter);
  1382         -  }else{
  1383         -    textarea_attribute(0, 0, 0, "footer", "footer", zDefaultFooter);
  1384   1421     }
         1422  +
  1385   1423     style_header("Edit Page Footer");
  1386   1424     @ <form action="%s(g.zTop)/setup_footer" method="post"><div>
  1387   1425     login_insert_csrf_secret();
  1388   1426     @ <p>Edit HTML text with embedded TH1 (a TCL dialect) that will be used to
  1389   1427     @ generate the end of every page.</p>
  1390   1428     textarea_attribute("", 20, 80, "footer", "footer", zDefaultFooter);
  1391   1429     @ <br />
................................................................................
  1412   1450     if( !g.perm.Setup ){
  1413   1451       login_needed();
  1414   1452     }
  1415   1453     db_begin_transaction();
  1416   1454     if( P("clear")!=0 ){
  1417   1455       db_multi_exec("DELETE FROM config WHERE name GLOB 'adunit*'");
  1418   1456       cgi_replace_parameter("adunit","");
  1419         -  }else{
  1420         -    textarea_attribute(0, 0, 0, "adunit", "adunit", "");
  1421   1457     }
         1458  +
  1422   1459     style_header("Edit Ad Unit");
  1423   1460     @ <form action="%s(g.zTop)/setup_adunit" method="post"><div>
  1424   1461     login_insert_csrf_secret();
  1425   1462     @ <p>Edit HTML text for an ad unit that will be inserted after the
  1426   1463     @ menu bar and above the content of every page.</p>
  1427   1464     textarea_attribute("", 20, 80, "adunit", "adunit", "");
  1428   1465     @ <br />

Changes to src/skins.c.

   154    154   @ table.label-value th {
   155    155   @   vertical-align: top;
   156    156   @   text-align: right;
   157    157   @   padding: 0.2ex 2ex;
   158    158   @ }');
   159    159   @ REPLACE INTO config(name,mtime,value) VALUES('header',now(),'<html>
   160    160   @ <head>
          161  +@ <base href="$baseurl/$current_page" />
   161    162   @ <title>$<project_name>: $<title></title>
   162    163   @ <link rel="alternate" type="application/rss+xml" title="RSS Feed"
   163    164   @       href="$home/timeline.rss">
   164    165   @ <link rel="stylesheet" href="$home/style.css?blackwhite" type="text/css"
   165    166   @       media="screen">
   166    167   @ </head>
   167    168   @ <body>
................................................................................
   356    357   @ table.label-value th {
   357    358   @   vertical-align: top;
   358    359   @   text-align: right;
   359    360   @   padding: 0.2ex 2ex;
   360    361   @ }');
   361    362   @ REPLACE INTO config(name,mtime,value) VALUES('header',now(),'<html>
   362    363   @ <head>
          364  +@ <base href="$baseurl/$current_page" />
   363    365   @ <title>$<project_name>: $<title></title>
   364    366   @ <link rel="alternate" type="application/rss+xml" title="RSS Feed"
   365    367   @       href="$home/timeline.rss">
   366    368   @ <link rel="stylesheet" href="$home/style.css?tan" type="text/css"
   367    369   @       media="screen">
   368    370   @ </head>
   369    371   @ <body>
................................................................................
   592    594   @ table.label-value th {
   593    595   @   vertical-align: top;
   594    596   @   text-align: right;
   595    597   @   padding: 0.2ex 2ex;
   596    598   @ }');
   597    599   @ REPLACE INTO config(name,mtime,value) VALUES('header',now(),'<html>
   598    600   @ <head>
          601  +@ <base href="$baseurl/$current_page" />
   599    602   @ <title>$<project_name>: $<title></title>
   600    603   @ <link rel="alternate" type="application/rss+xml" title="RSS Feed"
   601    604   @       href="$home/timeline.rss">
   602    605   @ <link rel="stylesheet" href="$home/style.css?black2" type="text/css"
   603    606   @       media="screen">
   604    607   @ </head>
   605    608   @ <body>
................................................................................
   890    893   @ }
   891    894   @ 
   892    895   @ textarea {
   893    896   @   font-size: 1em;
   894    897   @ }');
   895    898   @ REPLACE INTO config(name,mtime,value) VALUES('header',now(),'<html>
   896    899   @ <head>
          900  +@ <base href="$baseurl/$current_page" />
   897    901   @ <title>$<project_name>: $<title></title>
   898    902   @ <link rel="alternate" type="application/rss+xml" title="RSS Feed"
   899    903   @       href="$home/timeline.rss">
   900    904   @ <link rel="stylesheet" href="$home/style.css?black2" type="text/css"
   901    905   @       media="screen">
   902    906   @ </head>
   903    907   @ <body>

Changes to src/style.c.

   201    201     Th_Unstore("title");   /* Avoid collisions with ticket field names */
   202    202     cgi_destination(CGI_BODY);
   203    203     g.cgiOutput = 1;
   204    204     headerHasBeenGenerated = 1;
   205    205     sideboxUsed = 0;
   206    206   
   207    207     /* Make the gebi(x) function available as an almost-alias for
   208         -  ** document.getElementById(x) (except that it throws if the element is not found).
          208  +  ** document.getElementById(x) (except that it throws an error
          209  +  ** if the element is not found).
   209    210     **
   210    211     ** Maintenance note: this function must of course be available
   211    212     ** before it is called. It "should" go in the HEAD so that client
   212    213     ** HEAD code can make use of it, but because the client can replace
   213    214     ** the HEAD, and some fossil pages rely on gebi(), we put it here.
   214    215     */
   215    216     @ <script>
................................................................................
   314    315   /* @-comment: // */
   315    316   /*
   316    317   ** The default page header.
   317    318   */
   318    319   const char zDefaultHeader[] = 
   319    320   @ <html>
   320    321   @ <head>
          322  +@ <base href="$baseurl/">
   321    323   @ <title>$<project_name>: $<title></title>
   322    324   @ <link rel="alternate" type="application/rss+xml" title="RSS Feed"
   323    325   @       href="$home/timeline.rss" />
   324    326   @ <link rel="stylesheet" href="$home/style.css?default" type="text/css"
   325    327   @       media="screen" />
   326    328   @ </head>
   327    329   @ <body>
................................................................................
   338    340   @      }
   339    341   @   </th1></div>
   340    342   @ </div>
   341    343   @ <div class="mainmenu">
   342    344   @ <th1>
   343    345   @ html "<a href='$home$index_page'>Home</a>\n"
   344    346   @ if {[anycap jor]} {
   345         -@   html "<a href='$home/timeline'>Timeline</a>\n"
          347  +@   html "<a href='timeline'>Timeline</a>\n"
   346    348   @ }
   347    349   @ if {[hascap oh]} {
   348         -@   html "<a href='$home/dir?ci=tip'>Files</a>\n"
          350  +@   html "<a href='dir?ci=tip'>Files</a>\n"
   349    351   @ }
   350    352   @ if {[hascap o]} {
   351         -@   html "<a href='$home/brlist'>Branches</a>\n"
   352         -@   html "<a href='$home/taglist'>Tags</a>\n"
          353  +@   html "<a href='brlist'>Branches</a>\n"
          354  +@   html "<a href='taglist'>Tags</a>\n"
   353    355   @ }
   354    356   @ if {[hascap r]} {
   355         -@   html "<a href='$home/reportlist'>Tickets</a>\n"
          357  +@   html "<a href='reportlist'>Tickets</a>\n"
   356    358   @ }
   357    359   @ if {[hascap j]} {
   358         -@   html "<a href='$home/wiki'>Wiki</a>\n"
          360  +@   html "<a href='wiki'>Wiki</a>\n"
   359    361   @ }
   360    362   @ if {[hascap s]} {
   361         -@   html "<a href='$home/setup'>Admin</a>\n"
          363  +@   html "<a href='setup'>Admin</a>\n"
   362    364   @ } elseif {[hascap a]} {
   363         -@   html "<a href='$home/setup_ulist'>Users</a>\n"
          365  +@   html "<a href='setup_ulist'>Users</a>\n"
   364    366   @ }
   365    367   @ if {[info exists login]} {
   366         -@   html "<a href='$home/login'>Logout</a>\n"
          368  +@   html "<a href='login'>Logout</a>\n"
   367    369   @ } else {
   368         -@   html "<a href='$home/login'>Login</a>\n"
          370  +@   html "<a href='login'>Login</a>\n"
   369    371   @ }
   370    372   @ </th1></div>
   371    373   ;
   372    374   
   373    375   /*
   374    376   ** The default page footer
   375    377   */

Changes to src/wiki.c.

   183    183       pWiki = manifest_get(rid, CFTYPE_WIKI);
   184    184       if( pWiki ){
   185    185         zBody = pWiki->zWiki;
   186    186       }
   187    187     }
   188    188     if( !g.isHome ){
   189    189       if( (rid && g.perm.WrWiki) || (!rid && g.perm.NewWiki) ){
   190         -      style_submenu_element("Edit", "Edit Wiki Page", "%s/wikiedit?name=%T",
   191         -           g.zTop, zPageName);
          190  +      if( db_get_boolean("wysiwyg-wiki", 0) ){
          191  +        style_submenu_element("Edit", "Edit Wiki Page",
          192  +             "%s/wikiedit?name=%T&wysiwyg=1",
          193  +             g.zTop, zPageName);
          194  +      }else{
          195  +        style_submenu_element("Edit", "Edit Wiki Page",
          196  +             "%s/wikiedit?name=%T",
          197  +             g.zTop, zPageName);
          198  +      }
   192    199       }
   193    200       if( rid && g.perm.ApndWiki && g.perm.Attach ){
   194    201         style_submenu_element("Attach", "Add An Attachment",
   195    202              "%s/attachadd?page=%T&from=%s/wiki%%3fname=%T",
   196    203              g.zTop, zPageName, g.zTop, zPageName);
   197    204       }
   198    205       if( rid && g.perm.ApndWiki ){
................................................................................
   258    265     Blob wiki;
   259    266     Manifest *pWiki = 0;
   260    267     const char *zPageName;
   261    268     char *zHtmlPageName;
   262    269     int n;
   263    270     const char *z;
   264    271     char *zBody = (char*)P("w");
          272  +  int isWysiwyg = P("wysiwyg")!=0;
   265    273   
          274  +  if( P("edit-wysiwyg")!=0 ){ isWysiwyg = 1; zBody = 0; }
          275  +  if( P("edit-markup")!=0 ){ isWysiwyg = 0; zBody = 0; }
   266    276     if( zBody ){
   267         -    zBody = mprintf("%s", zBody);
          277  +    if( isWysiwyg ){
          278  +      Blob body;
          279  +      blob_zero(&body);
          280  +      htmlTidy(zBody, &body);
          281  +      zBody = blob_str(&body);
          282  +    }else{
          283  +      zBody = mprintf("%s", zBody);
          284  +    }
   268    285     }
   269    286     login_check_credentials();
   270    287     zPageName = PD("name","");
   271    288     if( check_name(zPageName) ) return;
   272    289     isSandbox = is_sandbox(zPageName);
   273    290     if( isSandbox ){
   274    291       if( !g.perm.WrWiki ){
................................................................................
   334    351       return;
   335    352     }
   336    353     if( zBody==0 ){
   337    354       zBody = mprintf("<i>Empty Page</i>");
   338    355     }
   339    356     zHtmlPageName = mprintf("Edit: %s", zPageName);
   340    357     style_header(zHtmlPageName);
          358  +  blob_zero(&wiki);
          359  +  blob_append(&wiki, zBody, -1);
   341    360     if( P("preview")!=0 ){
   342         -    blob_zero(&wiki);
   343         -    blob_append(&wiki, zBody, -1);
   344    361       @ Preview:<hr />
   345    362       wiki_convert(&wiki, 0, 0);
   346    363       @ <hr />
   347    364       blob_reset(&wiki);
   348    365     }
   349    366     for(n=2, z=zBody; z[0]; z++){
   350    367       if( z[0]=='\n' ) n++;
   351    368     }
   352    369     if( n<20 ) n = 20;
   353         -  if( n>40 ) n = 40;
   354         -  @ <form method="post" action="%s(g.zTop)/wikiedit"><div>
          370  +  if( n>30 ) n = 30;
          371  +  if( !isWysiwyg ){
          372  +    /* Traditional markup-only editing */
          373  +    @ <form method="post" action="%s(g.zTop)/wikiedit"><div>
          374  +    @ <textarea name="w" class="wikiedit" cols="80" 
          375  +    @  rows="%d(n)" wrap="virtual">%h(zBody)</textarea>
          376  +    @ <br />
          377  +    if( db_get_boolean("wysiwyg-wiki", 0) ){
          378  +      @ <input type="submit" name="edit-wysiwyg" value="Wysiwyg Editor"
          379  +      @  onclick='return confirm("Switching to WYSIWYG-mode\nwill erase your markup\nedits. Continue?")' />
          380  +    }
          381  +    @ <input type="submit" name="preview" value="Preview Your Changes" />
          382  +  }else{
          383  +    /* Wysiwyg editing */
          384  +    Blob html, temp;
          385  +    @ <form method="post" action="%s(g.zTop)/wikiedit"
          386  +    @  onsubmit="wysiwygSubmit()"><div>
          387  +    @ <input type="hidden" name="wysiwyg" value="1" />
          388  +    blob_zero(&temp);
          389  +    wiki_convert(&wiki, &temp, 0);
          390  +    blob_zero(&html);
          391  +    htmlTidy(blob_str(&temp), &html);
          392  +    blob_reset(&temp);
          393  +    wysiwygEditor("w", blob_str(&html), 60, n);
          394  +    blob_reset(&html);
          395  +    @ <br />
          396  +    @ <input type="submit" name="edit-markup" value="Markup Editor"
          397  +    @  onclick='return confirm("Switching to markup-mode\nwill erase your WYSIWYG\nedits. Continue?")' />
          398  +  }
          399  +  @ <input type="submit" name="submit" value="Apply These Changes" />
   355    400     login_insert_csrf_secret();
   356    401     @ <input type="hidden" name="name" value="%h(zPageName)" />
   357         -  @ <textarea name="w" class="wikiedit" cols="80" 
   358         -  @  rows="%d(n)" wrap="virtual">%h(zBody)</textarea>
   359         -  @ <br />
   360         -  @ <input type="submit" name="preview" value="Preview Your Changes" />
   361         -  @ <input type="submit" name="submit" value="Apply These Changes" />
   362         -  @ <input type="submit" name="cancel" value="Cancel" />
          402  +  @ <input type="submit" name="cancel" value="Cancel"
          403  +  @  onclick='confirm("Abandon your changes?")' />
   363    404     @ </div></form>
   364    405     manifest_destroy(pWiki);
          406  +  blob_reset(&wiki);
   365    407     style_footer();
   366    408   }
   367    409   
   368    410   /*
   369    411   ** WEBPAGE: wikinew
   370    412   ** URL /wikinew
   371    413   **
................................................................................
   377    419     login_check_credentials();
   378    420     if( !g.perm.NewWiki ){
   379    421       login_needed();
   380    422       return;
   381    423     }  
   382    424     zName = PD("name","");
   383    425     if( zName[0] && wiki_name_is_wellformed((const unsigned char *)zName) ){
   384         -    cgi_redirectf("wikiedit?name=%T", zName);
          426  +    if( db_get_boolean("wysiwyg-wiki", 0) ){
          427  +      cgi_redirectf("wikiedit?name=%T&wysiwyg=1", zName);
          428  +    }else{
          429  +      cgi_redirectf("wikiedit?name=%T", zName);
          430  +    }
   385    431     }
   386    432     style_header("Create A New Wiki Page");
   387    433     @ <p>Rules for wiki page names:</p>
   388    434     well_formed_wiki_name_rules();
   389    435     @ <form method="post" action="%s(g.zTop)/wikinew">
   390    436     @ <p>Name of new wiki page:
   391    437     @ <input style="width: 35;" type="text" name="name" value="%h(zName)" />

Changes to src/wikiformat.c.

  1077   1077         /* Special display processing for tickets.  Display the hyperlink
  1078   1078         ** as crossed out if the ticket is closed.
  1079   1079         */
  1080   1080         if( isClosed ){
  1081   1081           if( g.perm.Hyperlink ){
  1082   1082             blob_appendf(p->pOut,
  1083   1083                "%z<span class=\"wikiTagCancelled\">[",
  1084         -             href("%R/info/%s",zTarget)
         1084  +             href("info/%s",zTarget)
  1085   1085             );
  1086   1086             zTerm = "]</span></a>";
  1087   1087           }else{
  1088   1088             blob_appendf(p->pOut,"<span class=\"wikiTagCancelled\">[");
  1089   1089             zTerm = "]</span>";
  1090   1090           }
  1091   1091         }else{
  1092   1092           if( g.perm.Hyperlink ){
  1093         -          blob_appendf(p->pOut,"%z[", href("%R/info/%s", zTarget));
         1093  +          blob_appendf(p->pOut,"%z[", href("info/%s", zTarget));
  1094   1094             zTerm = "]</a>";
  1095   1095           }else{
  1096   1096             blob_appendf(p->pOut, "[");
  1097   1097             zTerm = "]";
  1098   1098           }
  1099   1099         }
  1100   1100       }else if( !in_this_repo(zTarget) ){
  1101   1101         blob_appendf(p->pOut, "<span class=\"brokenlink\">[", zTarget);
  1102   1102         zTerm = "]</span>";
  1103   1103       }else if( g.perm.Hyperlink ){
  1104         -      blob_appendf(p->pOut, "%z[",href("%R/info/%s", zTarget));
         1104  +      blob_appendf(p->pOut, "%z[",href("info/%s", zTarget));
  1105   1105         zTerm = "]</a>";
  1106   1106       }
  1107   1107     }else if( strlen(zTarget)>=10 && fossil_isdigit(zTarget[0]) && zTarget[4]=='-'
  1108   1108               && db_int(0, "SELECT datetime(%Q) NOT NULL", zTarget) ){
  1109         -    blob_appendf(p->pOut, "<a href=\"%s/timeline?c=%T\">", g.zTop, zTarget);
         1109  +    blob_appendf(p->pOut, "<a href=\"timeline?c=%T\">", zTarget);
  1110   1110     }else if( strncmp(zTarget, "wiki:", 5)==0 
  1111   1111           && wiki_name_is_wellformed((const unsigned char*)zTarget) ){
  1112   1112       zTarget += 5;
  1113         -    blob_appendf(p->pOut, "<a href=\"%s/wiki?name=%T\">", g.zTop, zTarget);
         1113  +    blob_appendf(p->pOut, "<a href=\"wiki?name=%T\">", zTarget);
  1114   1114     }else if( wiki_name_is_wellformed((const unsigned char *)zTarget) ){
  1115         -    blob_appendf(p->pOut, "<a href=\"%s/wiki?name=%T\">", g.zTop, zTarget);
         1115  +    blob_appendf(p->pOut, "<a href=\"wiki?name=%T\">", zTarget);
  1116   1116     }else{
  1117   1117       blob_appendf(p->pOut, "<span class=\"brokenlink\">[%h]</span>", zTarget);
  1118   1118       zTerm = "";
  1119   1119     }
  1120   1120     assert( strlen(zTerm)<nClose );
  1121   1121     sqlite3_snprintf(nClose, zClose, "%s", zTerm);
  1122   1122   }
................................................................................
  1745   1745           break;
  1746   1746         }
  1747   1747       }
  1748   1748       z += n;
  1749   1749     }
  1750   1750     free(renderer.aStack);
  1751   1751   }
         1752  +
         1753  +/*
         1754  +** Get the next HTML token.
         1755  +**
         1756  +** z points to the start of a token.  Return the number of
         1757  +** characters in that token.
         1758  +*/
         1759  +static int nextHtmlToken(const char *z){
         1760  +  int n;
         1761  +  if( z[0]=='<' ){
         1762  +    n = markupLength(z);
         1763  +    if( n<=0 ) n = 1;
         1764  +  }else if( fossil_isspace(z[0]) ){
         1765  +    for(n=1; z[n] && fossil_isspace(z[n]); n++){}
         1766  +  }else{
         1767  +    for(n=1; z[n] && z[n]!='<' && !fossil_isspace(z[n]); n++){}
         1768  +  }
         1769  +  return n;
         1770  +}
         1771  +
         1772  +/*
         1773  +** Return true if z[] is the word zWord in any case.
         1774  +*/
         1775  +static int isWord(const char *z, const char *zWord, int nWord){
         1776  +  return fossil_strnicmp(z, zWord, nWord)==0 && !fossil_isalpha(z[nWord]);
         1777  +}
         1778  +
         1779  +/*
         1780  +** Attempt to reformat messy HTML to be easily readable by humans.
         1781  +**
         1782  +**    *  Try to keep lines less than 80 characters in length
         1783  +**    *  Collapse white space into a single space
         1784  +**    *  Put a blank line before:
         1785  +**          <blockquote><center><code><hN><p><pre><table>
         1786  +**    *  Put a newline after <br> and <hr>
         1787  +**    *  Start each of the following elements on a new line:
         1788  +**          <address><cite><dd><div><dl><dt><li><ol><samp>
         1789  +**          <tbody><td><tfoot><th><thead><tr><ul>
         1790  +**
         1791  +** Except, do not do any reformatting inside of <pre>...</pre>
         1792  +*/
         1793  +void htmlTidy(const char *zIn, Blob *pOut){
         1794  +  int n;
         1795  +  int nPre = 0;
         1796  +  int iCur = 0;
         1797  +  int wantSpace = 0;
         1798  +  int omitSpace = 1;
         1799  +  while( zIn[0] ){
         1800  +    n = nextHtmlToken(zIn);
         1801  +    if( zIn[0]=='<' && n>1 ){
         1802  +      int i, j;
         1803  +      int isCloseTag;
         1804  +      int eTag;
         1805  +      int eType;
         1806  +      char zTag[32];
         1807  +      isCloseTag = zIn[1]=='/';
         1808  +      for(i=0, j=1+isCloseTag; i<30 && fossil_isalnum(zIn[j]); i++, j++){
         1809  +         zTag[i] = fossil_tolower(zIn[j]);
         1810  +      }
         1811  +      zTag[i] = 0;
         1812  +      eTag = findTag(zTag);
         1813  +      eType = aMarkup[eTag].iType;
         1814  +      if( eTag==MARKUP_PRE ){
         1815  +        if( isCloseTag ){
         1816  +          nPre--;
         1817  +          blob_append(pOut, zIn, n);
         1818  +          zIn += n;
         1819  +          if( nPre==0 ){ blob_append(pOut, "\n", 1); iCur = 0; }
         1820  +          continue;
         1821  +        }else{
         1822  +          if( iCur && nPre==0 ){ blob_append(pOut, "\n", 1); iCur = 0; }
         1823  +          nPre++;
         1824  +        }
         1825  +      }else if( eType & (MUTYPE_BLOCK|MUTYPE_TABLE) ){
         1826  +        if( !isCloseTag && nPre==0 && blob_size(pOut)>0 ){
         1827  +          blob_append(pOut, "\n\n", 1 + (iCur>0));
         1828  +          iCur = 0;
         1829  +        }
         1830  +        wantSpace = 0;
         1831  +        omitSpace = 1;
         1832  +      }else if( (eType & (MUTYPE_LIST|MUTYPE_LI|MUTYPE_TR|MUTYPE_TD))!=0
         1833  +             || eTag==MARKUP_HR
         1834  +      ){
         1835  +        if( nPre==0 && (!isCloseTag || (eType&MUTYPE_LIST)!=0) && iCur>0 ){
         1836  +          blob_append(pOut, "\n", 1);
         1837  +          iCur = 0;
         1838  +        }
         1839  +        wantSpace = 0;
         1840  +        omitSpace = 1;
         1841  +      }
         1842  +      if( wantSpace && nPre==0 ){
         1843  +        if( iCur+n+1>=80 ){
         1844  +          blob_append(pOut, "\n", 1);
         1845  +          iCur = 0;
         1846  +        }else{
         1847  +          blob_append(pOut, " ", 1);
         1848  +          iCur++;
         1849  +        }
         1850  +      }
         1851  +      blob_append(pOut, zIn, n);
         1852  +      iCur += n;
         1853  +      wantSpace = 0;
         1854  +      if( eTag==MARKUP_BR || eTag==MARKUP_HR ){
         1855  +        blob_append(pOut, "\n", 1);
         1856  +        iCur = 0;
         1857  +      }
         1858  +    }else if( fossil_isspace(zIn[0]) ){
         1859  +      if( nPre ){
         1860  +        blob_append(pOut, zIn, n);
         1861  +      }else{
         1862  +        wantSpace = !omitSpace;
         1863  +      }
         1864  +    }else{
         1865  +      if( wantSpace && nPre==0 ){
         1866  +        if( iCur+n+1>=80 ){
         1867  +          blob_append(pOut, "\n", 1);
         1868  +          iCur = 0;
         1869  +        }else{
         1870  +          blob_append(pOut, " ", 1);
         1871  +          iCur++;
         1872  +        }
         1873  +      }
         1874  +      blob_append(pOut, zIn, n);
         1875  +      iCur += n;
         1876  +      wantSpace = omitSpace = 0;
         1877  +    }
         1878  +    zIn += n;
         1879  +  }
         1880  +  if( iCur ) blob_append(pOut, "\n", 1);
         1881  +}
         1882  +
         1883  +/*
         1884  +** COMMAND: test-html-tidy
         1885  +*/
         1886  +void test_html_tidy(void){
         1887  +  Blob in, out;
         1888  +  int i;
         1889  +
         1890  +  for(i=2; i<g.argc; i++){
         1891  +    blob_read_from_file(&in, g.argv[i]);
         1892  +    blob_zero(&out);
         1893  +    htmlTidy(blob_str(&in), &out);
         1894  +    blob_reset(&in);
         1895  +    fossil_puts(blob_str(&out), 0);
         1896  +    blob_reset(&out);
         1897  +  }
         1898  +}

Added src/wysiwyg.c.

            1  +/*
            2  +** Copyright (c) 2012 D. Richard Hipp
            3  +**
            4  +** This program is free software; you can redistribute it and/or
            5  +** modify it under the terms of the Simplified BSD License (also
            6  +** known as the "2-Clause License" or "FreeBSD License".)
            7  +**
            8  +** This program is distributed in the hope that it will be useful,
            9  +** but without any warranty; without even the implied warranty of
           10  +** merchantability or fitness for a particular purpose.
           11  +**
           12  +** Author contact information:
           13  +**   drh@hwaci.com
           14  +**   http://www.hwaci.com/drh/
           15  +**
           16  +*******************************************************************************
           17  +**
           18  +** This file contains code that generates WYSIWYG text editors on
           19  +** web pages.
           20  +*/
           21  +#include <assert.h>
           22  +#include <ctype.h>
           23  +#include "config.h"
           24  +#include "wysiwyg.h"
           25  +
           26  +
           27  +/*
           28  +** Output code for a WYSIWYG editor.  The caller must have already generated
           29  +** the <form> that will contain the editor, and the call must generate the
           30  +** corresponding </form> after this routine returns.  The caller must include
           31  +** an onsubmit= attribute on the <form> element that invokes the
           32  +** wysiwygSubmit() function.
           33  +**
           34  +** There can only be a single WYSIWYG editor per frame.
           35  +*/
           36  +void wysiwygEditor(
           37  +  const char *zId,        /* ID for this editor */
           38  +  const char *zContent,   /* Initial content (HTML) */
           39  +  int w, int h            /* Initial width and height */
           40  +){
           41  +
           42  +  @ <style type="text/css">
           43  +  @ .intLink { cursor: pointer; }
           44  +  @ img.intLink { border: 0; }
           45  +  @ #wysiwygBox {
           46  +  @   border: 1px #000000 solid;
           47  +  @   padding: 12px;
           48  +  @ }
           49  +  @ #editMode label { cursor: pointer; }
           50  +  @ </style>
           51  +
           52  +  @ <input id="wysiwygValue" type="hidden" name="%s(zId)">
           53  +  @ <div id="editModeDiv">Edit mode:
           54  +  @   <select id="editMode" size=1 onchange="setDocMode(this.selectedIndex)">
           55  +  @ <option value="0">WYSIWYG</option>
           56  +  @ <option value="1">Raw HTML</option>
           57  +  @ </select></div>
           58  +  @ <div id="toolBar1">
           59  +  @ <select onchange="formatDoc('formatblock',this[this.selectedIndex].value);
           60  +  @                   this.selectedIndex=0;">
           61  +  @ <option selected>- formatting -</option>
           62  +  @ <option value="h1">Title 1 &lt;h1&gt;</option>
           63  +  @ <option value="h2">Title 2 &lt;h2&gt;</option>
           64  +  @ <option value="h3">Title 3 &lt;h3&gt;</option>
           65  +  @ <option value="h4">Title 4 &lt;h4&gt;</option>
           66  +  @ <option value="h5">Title 5 &lt;h5&gt;</option>
           67  +  @ <option value="h6">Subtitle &lt;h6&gt;</option>
           68  +  @ <option value="p">Paragraph &lt;p&gt;</option>
           69  +  @ <option value="pre">Preformatted &lt;pre&gt;</option>
           70  +  @ </select>
           71  +  @ <select onchange="formatDoc('fontname',this[this.selectedIndex].value);
           72  +  @                   this.selectedIndex=0;">
           73  +  @ <option class="heading" selected>- font -</option>
           74  +  @ <option>Arial</option>
           75  +  @ <option>Arial Black</option>
           76  +  @ <option>Courier New</option>
           77  +  @ <option>Times New Roman</option>
           78  +  @ </select>
           79  +  @ <select onchange="formatDoc('fontsize',this[this.selectedIndex].value);
           80  +  @                   this.selectedIndex=0;">
           81  +  @ <option class="heading" selected>- size -</option>
           82  +  @ <option value="1">Very small</option>
           83  +  @ <option value="2">A bit small</option>
           84  +  @ <option value="3">Normal</option>
           85  +  @ <option value="4">Medium-large</option>
           86  +  @ <option value="5">Big</option>
           87  +  @ <option value="6">Very big</option>
           88  +  @ <option value="7">Maximum</option>
           89  +  @ </select>
           90  +  @ <select onchange="formatDoc('forecolor',this[this.selectedIndex].value);
           91  +  @                   this.selectedIndex=0;">
           92  +  @ <option class="heading" selected>- color -</option>
           93  +  @ <option value="red">Red</option>
           94  +  @ <option value="blue">Blue</option>
           95  +  @ <option value="green">Green</option>
           96  +  @ <option value="black">Black</option>
           97  +  @ </select>
           98  +  @ </div>
           99  +  @ <div id="toolBar2">
          100  +  @ <img class="intLink" title="Undo" onclick="formatDoc('undo');"
          101  +  @ src="data:image/gif;base64,R0lGODlhFgAWAOMKADljwliE33mOrpGjuYKl8aezxqPD+7
          102  +  @ /I19DV3NHa7P///////////////////////yH5BAEKAA8ALAAAAAAWABYAAARR8MlJq704680
          103  +  @ 7TkaYeJJBnES4EeUJvIGapWYAC0CsocQ7SDlWJkAkCA6ToMYWIARGQF3mRQVIEjkkSVLIbSfE
          104  +  @ whdRIH4fh/DZMICe3/C4nBQBADs=">
          105  +
          106  +  @ <img class="intLink" title="Redo" onclick="formatDoc('redo');"
          107  +  @ src="data:image/gif;base64,R0lGODlhFgAWAMIHAB1ChDljwl9vj1iE34Kl8aPD+7/I1/
          108  +  @ ///yH5BAEKAAcALAAAAAAWABYAAANKeLrc/jDKSesyphi7SiEgsVXZEATDICqBVJjpqWZt9Na
          109  +  @ EDNbQK1wCQsxlYnxMAImhyDoFAElJasRRvAZVRqqQXUy7Cgx4TC6bswkAOw==">
          110  +
          111  +  @ <img class="intLink" title="Remove formatting"
          112  +  @ onclick="formatDoc('removeFormat')"
          113  +  @ src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AA
          114  +  @ AABGdBTUEAALGPC/xhBQAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAAOxAAADsQBlSsOGwA
          115  +  @ AAAd0SU1FB9oECQMCKPI8CIIAAAAIdEVYdENvbW1lbnQA9syWvwAAAuhJREFUOMtjYBgFxAB5
          116  +  @ 01ZWBvVaL2nHnlmk6mXCJbF69zU+Hz/9fB5O1lx+bg45qhl8/fYr5it3XrP/YWTUvvvk3VeqG
          117  +  @ Xz70TvbJy8+Wv39+2/Hz19/mGwjZzuTYjALuoBv9jImaXHeyD3H7kU8fPj2ICML8z92dlbtMz
          118  +  @ deiG3fco7J08foH1kurkm3E9iw54YvKwuTuom+LPt/BgbWf3//sf37/1/c02cCG1lB8f//f95
          119  +  @ DZx74MTMzshhoSm6szrQ/a6Ir/Z2RkfEjBxuLYFpDiDi6Af///2ckaHBp7+7wmavP5n76+P2C
          120  +  @ lrLIYl8H9W36auJCbCxM4szMTJac7Kza////R3H1w2cfWAgafPbqs5g7D95++/P1B4+ECK8tA
          121  +  @ wMDw/1H7159+/7r7ZcvPz4fOHbzEwMDwx8GBgaGnNatfHZx8zqrJ+4VJBh5CQEGOySEua/v3n
          122  +  @ 7hXmqI8WUGBgYGL3vVG7fuPK3i5GD9/fja7ZsMDAzMG/Ze52mZeSj4yu1XEq/ff7W5dvfVAS1
          123  +  @ lsXc4Db7z8C3r8p7Qjf///2dnZGxlqJuyr3rPqQd/Hhyu7oSpYWScylDQsd3kzvnH738wMDzj
          124  +  @ 5GBN1VIWW4c3KDon7VOvm7S3paB9u5qsU5/x5KUnlY+eexQbkLNsErK61+++VnAJcfkyMTIwf
          125  +  @ fj0QwZbJDKjcETs1Y8evyd48toz8y/ffzv//vPP4veffxpX77z6l5JewHPu8MqTDAwMDLzyrj
          126  +  @ b/mZm0JcT5Lj+89+Ybm6zz95oMh7s4XbygN3Sluq4Mj5K8iKMgP4f0////fv77//8nLy+7MCc
          127  +  @ XmyYDAwODS9jM9tcvPypd35pne3ljdjvj26+H2dhYpuENikgfvQeXNmSl3tqepxXsqhXPyc66
          128  +  @ 6s+fv1fMdKR3TK72zpix8nTc7bdfhfkEeVbC9KhbK/9iYWHiErbu6MWbY/7//8/4//9/pgOnH
          129  +  @ 6jGVazvFDRtq2VgiBIZrUTIBgCk+ivHvuEKwAAAAABJRU5ErkJggg==">
          130  +
          131  +  @ <img class="intLink" title="Bold" onclick="formatDoc('bold');"
          132  +  @ src="data:image/gif;base64,R0lGODlhFgAWAID/AMDAwAAAACH5BAEAAAAALAAAAAAWAB
          133  +  @ YAQAInhI+pa+H9mJy0LhdgtrxzDG5WGFVk6aXqyk6Y9kXvKKNuLbb6zgMFADs=" />
          134  +
          135  +  @ <img class="intLink" title="Italic" onclick="formatDoc('italic');"
          136  +  @ src="data:image/gif;base64,R0lGODlhFgAWAKEDAAAAAF9vj5WIbf///yH5BAEAAAMALA
          137  +  @ AAAAAWABYAAAIjnI+py+0Po5x0gXvruEKHrF2BB1YiCWgbMFIYpsbyTNd2UwAAOw==" />
          138  +
          139  +  @ <img class="intLink" title="Underline" onclick="formatDoc('underline');"
          140  +  @ src="data:image/gif;base64,R0lGODlhFgAWAKECAAAAAF9vj////////yH5BAEAAAIALA
          141  +  @ AAAAAWABYAAAIrlI+py+0Po5zUgAsEzvEeL4Ea15EiJJ5PSqJmuwKBEKgxVuXWtun+DwxCCgA
          142  +  @ 7" />
          143  +
          144  +  @ <img class="intLink" title="Left align"
          145  +  @ onclick="formatDoc('justifyleft');"
          146  +  @ src="data:image/gif;base64,R0lGODlhFgAWAID/AMDAwAAAACH5BAEAAAAALAAAAAAWAB
          147  +  @ YAQAIghI+py+0Po5y02ouz3jL4D4JMGELkGYxo+qzl4nKyXAAAOw==" />
          148  +
          149  +  @ <img class="intLink" title="Center align"
          150  +  @ onclick="formatDoc('justifycenter');"
          151  +  @ src="data:image/gif;base64,R0lGODlhFgAWAID/AMDAwAAAACH5BAEAAAAALAAAAAAWAB
          152  +  @ YAQAIfhI+py+0Po5y02ouz3jL4D4JOGI7kaZ5Bqn4sycVbAQA7" />
          153  +
          154  +  @ <img class="intLink" title="Right align"
          155  +  @ onclick="formatDoc('justifyright');"
          156  +  @ src="data:image/gif;base64,R0lGODlhFgAWAID/AMDAwAAAACH5BAEAAAAALAAAAAAWAB
          157  +  @ YAQAIghI+py+0Po5y02ouz3jL4D4JQGDLkGYxouqzl43JyVgAAOw==" />
          158  +  @ <img class="intLink" title="Numbered list"
          159  +  @ onclick="formatDoc('insertorderedlist');"
          160  +  @ src="data:image/gif;base64,R0lGODlhFgAWAMIGAAAAADljwliE35GjuaezxtHa7P////
          161  +  @ ///yH5BAEAAAcALAAAAAAWABYAAAM2eLrc/jDKSespwjoRFvggCBUBoTFBeq6QIAysQnRHaEO
          162  +  @ zyaZ07Lu9lUBnC0UGQU1K52s6n5oEADs=" />
          163  +
          164  +  @ <img class="intLink" title="Dotted list"
          165  +  @ onclick="formatDoc('insertunorderedlist');"
          166  +  @ src="data:image/gif;base64,R0lGODlhFgAWAMIGAAAAAB1ChF9vj1iE33mOrqezxv////
          167  +  @ ///yH5BAEAAAcALAAAAAAWABYAAAMyeLrc/jDKSesppNhGRlBAKIZRERBbqm6YtnbfMY7lud6
          168  +  @ 4UwiuKnigGQliQuWOyKQykgAAOw==" />
          169  +
          170  +  @ <img class="intLink" title="Quote"
          171  +  @ onclick="formatDoc('formatblock','blockquote');"
          172  +  @ src="data:image/gif;base64,R0lGODlhFgAWAIQXAC1NqjFRjkBgmT9nqUJnsk9xrFJ7u2
          173  +  @ R9qmKBt1iGzHmOrm6Sz4OXw3Odz4Cl2ZSnw6KxyqO306K63bG70bTB0rDI3bvI4P/////////
          174  +  @ //////////////////////////yH5BAEKAB8ALAAAAAAWABYAAAVP4CeOZGmeaKqubEs2Cekk
          175  +  @ ErvEI1zZuOgYFlakECEZFi0GgTGKEBATFmJAVXweVOoKEQgABB9IQDCmrLpjETrQQlhHjINrT
          176  +  @ q/b7/i8fp8PAQA7" />
          177  +
          178  +  @ <img class="intLink" title="Add indentation"
          179  +  @ onclick="formatDoc('outdent');"
          180  +  @ src="data:image/gif;base64,R0lGODlhFgAWAMIHAAAAADljwliE35GjuaezxtDV3NHa7P
          181  +  @ ///yH5BAEAAAcALAAAAAAWABYAAAM2eLrc/jDKCQG9F2i7u8agQgyK1z2EIBil+TWqEMxhMcz
          182  +  @ sYVJ3e4ahk+sFnAgtxSQDqWw6n5cEADs=" />
          183  +
          184  +  @ <img class="intLink" title="Delete indentation"
          185  +  @ onclick="formatDoc('indent');"
          186  +  @ src="data:image/gif;base64,R0lGODlhFgAWAOMIAAAAADljwl9vj1iE35GjuaezxtDV3N
          187  +  @ Ha7P///////////////////////////////yH5BAEAAAgALAAAAAAWABYAAAQ7EMlJq704650
          188  +  @ B/x8gemMpgugwHJNZXodKsO5oqUOgo5KhBwWESyMQsCRDHu9VOyk5TM9zSpFSr9gsJwIAOw==">
          189  +
          190  +  @ <img class="intLink" title="Hyperlink"
          191  +  @ onclick="var sLnk=prompt('Target URL:','');
          192  +  @          if(sLnk&&sLnk!=''){formatDoc('createlink',sLnk)}"
          193  +  @ src="data:image/gif;base64,R0lGODlhFgAWAOMKAB1ChDRLY19vj3mOrpGjuaezxrCztb
          194  +  @ /I19Ha7Pv8/f///////////////////////yH5BAEKAA8ALAAAAAAWABYAAARY8MlJq704682
          195  +  @ 7/2BYIQVhHg9pEgVGIklyDEUBy/RlE4FQF4dCj2AQXAiJQDCWQCAEBwIioEMQBgSAFhDAGghG
          196  +  @ i9XgHAhMNoSZgJkJei33UESv2+/4vD4TAQA7" />
          197  +
          198  +#if 0  /* Cut/Copy/Paste requires special browser permissions for security
          199  +       ** reasons.  So omit these buttons */
          200  +  @ <img class="intLink" title="Cut"
          201  +  @ onclick="formatDoc('cut');"
          202  +  @ src="data:image/gif;base64,R0lGODlhFgAWAIQSAB1ChBFNsRJTySJYwjljwkxwl19vj1
          203  +  @ dusYODhl6MnHmOrpqbmpGjuaezxrCztcDCxL/I18rL1P/////////////////////////////
          204  +  @ //////////////////////////yH5BAEAAB8ALAAAAAAWABYAAAVu4CeOZGmeaKqubDs6TNnE
          205  +  @ bGNApNG0kbGMi5trwcA9GArXh+FAfBAw5UexUDAQESkRsfhJPwaH4YsEGAAJGisRGAQY7UCC9
          206  +  @ ZAXBB+74LGCRxIEHwAHdWooDgGJcwpxDisQBQRjIgkDCVlfmZqbmiEAOw==" />
          207  +
          208  +  @ <img class="intLink" title="Copy"
          209  +  @ onclick="formatDoc('copy');"
          210  +  @ src="data:image/gif;base64,R0lGODlhFgAWAIQcAB1ChBFNsTRLYyJYwjljwl9vj1iE31
          211  +  @ iGzF6MnHWX9HOdz5GjuYCl2YKl8ZOt4qezxqK63aK/9KPD+7DI3b/I17LM/MrL1MLY9NHa7OP
          212  +  @ s++bx/Pv8/f///////////////yH5BAEAAB8ALAAAAAAWABYAAAWG4CeOZGmeaKqubOum1SQ/
          213  +  @ kPVOW749BeVSus2CgrCxHptLBbOQxCSNCCaF1GUqwQbBd0JGJAyGJJiobE+LnCaDcXAaEoxhQ
          214  +  @ ACgNw0FQx9kP+wmaRgYFBQNeAoGihCAJQsCkJAKOhgXEw8BLQYciooHf5o7EA+kC40qBKkAAA
          215  +  @ Grpy+wsbKzIiEAOw==" />
          216  +
          217  +  @ <img class="intLink" title="Paste"
          218  +  @ onclick="formatDoc('paste');"
          219  +  @ src="data:image/gif;base64,R0lGODlhFgAWAIQUAD04KTRLY2tXQF9vj414WZWIbXmOrp
          220  +  @ qbmpGjudClFaezxsa0cb/I1+3YitHa7PrkIPHvbuPs+/fvrvv8/f/////////////////////
          221  +  @ //////////////////////////yH5BAEAAB8ALAAAAAAWABYAAAWN4CeOZGmeaKqubGsusPvB
          222  +  @ SyFJjVDs6nJLB0khR4AkBCmfsCGBQAoCwjF5gwquVykSFbwZE+AwIBV0GhFog2EwIDchjwRiQ
          223  +  @ o9E2Fx4XD5R+B0DDAEnBXBhBhN2DgwDAQFjJYVhCQYRfgoIDGiQJAWTCQMRiwwMfgicnVcAAA
          224  +  @ MOaK+bLAOrtLUyt7i5uiUhADs=" />
          225  +#endif
          226  +
          227  +  @ </div>
          228  +  @ <div id="wysiwygBox"
          229  +  @  style="resize:both; overflow:auto; width: %d(w)em; height: %d(h)em;"
          230  +  @  contenteditable="true">%s(zContent)</div>
          231  +  @ <script>
          232  +  @ var oDoc;
          233  +  @ 
          234  +  @ /* Initialize the document editor */
          235  +  @ function initDoc() {
          236  +  @   oDoc = document.getElementById("wysiwygBox");
          237  +  @   if (!isWysiwyg()) { setDocMode(true); }
          238  +  @ }
          239  +  @ 
          240  +  @ /* Return true if the document editor is in WYSIWYG mode.  Return 
          241  +  @ ** false if it is in Markup mode */
          242  +  @ function isWysiwyg() {
          243  +  @   return document.getElementById("editMode").selectedIndex==0;
          244  +  @ }
          245  +  @
          246  +  @ /* Invoke this routine prior to submitting the HTML content back
          247  +  @ ** to the server */
          248  +  @ function wysiwygSubmit() {
          249  +  @   if(oDoc.style.whiteSpace=="pre-wrap"){setDocMode(0);}
          250  +  @   document.getElementById("wysiwygValue").value=oDoc.innerHTML;
          251  +  @ }
          252  +  @ 
          253  +  @ /* Run the editing command if in WYSIWYG mode */ 
          254  +  @ function formatDoc(sCmd, sValue) {
          255  +  @   if (isWysiwyg()){
          256  +  @     document.execCommand("styleWithCSS", false, false);
          257  +  @     document.execCommand(sCmd, false, sValue);
          258  +  @     oDoc.focus();
          259  +  @   }
          260  +  @ }
          261  +  @ 
          262  +  @ /* Change the editing mode.  Convert to markup if the argument
          263  +  @ ** is true and wysiwyg if the argument is false. */ 
          264  +  @ function setDocMode(bToMarkup) {
          265  +  @   var oContent;
          266  +  @   if (bToMarkup) {
          267  +  @     /* WYSIWYG -> Markup */
          268  +  @     var linebreak = new RegExp("</p><p>","ig");
          269  +  @     oContent = document.createTextNode(
          270  +  @                  oDoc.innerHTML.replace(linebreak,"</p>\n\n<p>"));
          271  +  @     oDoc.innerHTML = "";
          272  +  @     oDoc.style.whiteSpace = "pre-wrap";
          273  +  @     oDoc.appendChild(oContent);
          274  +  @     document.getElementById("toolBar1").style.visibility="hidden";
          275  +  @     document.getElementById("toolBar2").style.visibility="hidden";
          276  +  @   } else {
          277  +  @     /* Markup -> WYSIWYG */
          278  +  @     if (document.all) {
          279  +  @       oDoc.innerHTML = oDoc.innerText;
          280  +  @     } else {
          281  +  @       oContent = document.createRange();
          282  +  @       oContent.selectNodeContents(oDoc.firstChild);
          283  +  @       oDoc.innerHTML = oContent.toString();
          284  +  @     }
          285  +  @     oDoc.style.whiteSpace = "normal";
          286  +  @     document.getElementById("toolBar1").style.visibility="visible";
          287  +  @     document.getElementById("toolBar2").style.visibility="visible";
          288  +  @   }
          289  +  @   oDoc.focus();
          290  +  @ }
          291  +  @ initDoc();
          292  +  @ </script>
          293  +
          294  +}

Changes to win/Makefile.dmc.

    24     24   CFLAGS = -o
    25     25   BCC    = $(DMDIR)\bin\dmc $(CFLAGS)
    26     26   TCC    = $(DMDIR)\bin\dmc $(CFLAGS) $(DMCDEF) $(SSL) $(INCL)
    27     27   LIBS   = $(DMDIR)\extra\lib\ zlib wsock32 advapi32
    28     28   
    29     29   SQLITE_OPTIONS = -DSQLITE_OMIT_LOAD_EXTENSION=1 -DSQLITE_THREADSAFE=0 -DSQLITE_DEFAULT_FILE_FORMAT=4 -DSQLITE_ENABLE_STAT3 -Dlocaltime=fossil_localtime -DSQLITE_ENABLE_LOCKING_STYLE=0
    30     30   
    31         -SRC   = add_.c allrepo_.c attach_.c bag_.c bisect_.c blob_.c branch_.c browse_.c captcha_.c cgi_.c checkin_.c checkout_.c clearsign_.c clone_.c comformat_.c configure_.c content_.c db_.c delta_.c deltacmd_.c descendants_.c diff_.c diffcmd_.c doc_.c encode_.c event_.c export_.c file_.c finfo_.c glob_.c graph_.c gzip_.c http_.c http_socket_.c http_ssl_.c http_transport_.c import_.c info_.c json_.c json_artifact_.c json_branch_.c json_config_.c json_diff_.c json_dir_.c json_finfo_.c json_login_.c json_query_.c json_report_.c json_tag_.c json_timeline_.c json_user_.c json_wiki_.c leaf_.c login_.c main_.c manifest_.c md5_.c merge_.c merge3_.c name_.c path_.c pivot_.c popen_.c pqueue_.c printf_.c rebuild_.c report_.c rss_.c schema_.c search_.c setup_.c sha1_.c shun_.c skins_.c sqlcmd_.c stash_.c stat_.c style_.c sync_.c tag_.c tar_.c th_main_.c timeline_.c tkt_.c tktsetup_.c undo_.c update_.c url_.c user_.c verify_.c vfile_.c wiki_.c wikiformat_.c winhttp_.c xfer_.c xfersetup_.c zip_.c 
           31  +SRC   = add_.c allrepo_.c attach_.c bag_.c bisect_.c blob_.c branch_.c browse_.c captcha_.c cgi_.c checkin_.c checkout_.c clearsign_.c clone_.c comformat_.c configure_.c content_.c db_.c delta_.c deltacmd_.c descendants_.c diff_.c diffcmd_.c doc_.c encode_.c event_.c export_.c file_.c finfo_.c glob_.c graph_.c gzip_.c http_.c http_socket_.c http_ssl_.c http_transport_.c import_.c info_.c json_.c json_artifact_.c json_branch_.c json_config_.c json_diff_.c json_dir_.c json_finfo_.c json_login_.c json_query_.c json_report_.c json_tag_.c json_timeline_.c json_user_.c json_wiki_.c leaf_.c login_.c main_.c manifest_.c md5_.c merge_.c merge3_.c name_.c path_.c pivot_.c popen_.c pqueue_.c printf_.c rebuild_.c report_.c rss_.c schema_.c search_.c setup_.c sha1_.c shun_.c skins_.c sqlcmd_.c stash_.c stat_.c style_.c sync_.c tag_.c tar_.c th_main_.c timeline_.c tkt_.c tktsetup_.c undo_.c update_.c url_.c user_.c verify_.c vfile_.c wiki_.c wikiformat_.c winhttp_.c wysiwyg_.c xfer_.c xfersetup_.c zip_.c 
    32     32   
    33         -OBJ   = $(OBJDIR)\add$O $(OBJDIR)\allrepo$O $(OBJDIR)\attach$O $(OBJDIR)\bag$O $(OBJDIR)\bisect$O $(OBJDIR)\blob$O $(OBJDIR)\branch$O $(OBJDIR)\browse$O $(OBJDIR)\captcha$O $(OBJDIR)\cgi$O $(OBJDIR)\checkin$O $(OBJDIR)\checkout$O $(OBJDIR)\clearsign$O $(OBJDIR)\clone$O $(OBJDIR)\comformat$O $(OBJDIR)\configure$O $(OBJDIR)\content$O $(OBJDIR)\db$O $(OBJDIR)\delta$O $(OBJDIR)\deltacmd$O $(OBJDIR)\descendants$O $(OBJDIR)\diff$O $(OBJDIR)\diffcmd$O $(OBJDIR)\doc$O $(OBJDIR)\encode$O $(OBJDIR)\event$O $(OBJDIR)\export$O $(OBJDIR)\file$O $(OBJDIR)\finfo$O $(OBJDIR)\glob$O $(OBJDIR)\graph$O $(OBJDIR)\gzip$O $(OBJDIR)\http$O $(OBJDIR)\http_socket$O $(OBJDIR)\http_ssl$O $(OBJDIR)\http_transport$O $(OBJDIR)\import$O $(OBJDIR)\info$O $(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 $(OBJDIR)\leaf$O $(OBJDIR)\login$O $(OBJDIR)\main$O $(OBJDIR)\manifest$O $(OBJDIR)\md5$O $(OBJDIR)\merge$O $(OBJDIR)\merge3$O $(OBJDIR)\name$O $(OBJDIR)\path$O $(OBJDIR)\pivot$O $(OBJDIR)\popen$O $(OBJDIR)\pqueue$O $(OBJDIR)\printf$O $(OBJDIR)\rebuild$O $(OBJDIR)\report$O $(OBJDIR)\rss$O $(OBJDIR)\schema$O $(OBJDIR)\search$O $(OBJDIR)\setup$O $(OBJDIR)\sha1$O $(OBJDIR)\shun$O $(OBJDIR)\skins$O $(OBJDIR)\sqlcmd$O $(OBJDIR)\stash$O $(OBJDIR)\stat$O $(OBJDIR)\style$O $(OBJDIR)\sync$O $(OBJDIR)\tag$O $(OBJDIR)\tar$O $(OBJDIR)\th_main$O $(OBJDIR)\timeline$O $(OBJDIR)\tkt$O $(OBJDIR)\tktsetup$O $(OBJDIR)\undo$O $(OBJDIR)\update$O $(OBJDIR)\url$O $(OBJDIR)\user$O $(OBJDIR)\verify$O $(OBJDIR)\vfile$O $(OBJDIR)\wiki$O $(OBJDIR)\wikiformat$O $(OBJDIR)\winhttp$O $(OBJDIR)\xfer$O $(OBJDIR)\xfersetup$O $(OBJDIR)\zip$O $(OBJDIR)\shell$O $(OBJDIR)\sqlite3$O $(OBJDIR)\th$O $(OBJDIR)\th_lang$O 
           33  +OBJ   = $(OBJDIR)\add$O $(OBJDIR)\allrepo$O $(OBJDIR)\attach$O $(OBJDIR)\bag$O $(OBJDIR)\bisect$O $(OBJDIR)\blob$O $(OBJDIR)\branch$O $(OBJDIR)\browse$O $(OBJDIR)\captcha$O $(OBJDIR)\cgi$O $(OBJDIR)\checkin$O $(OBJDIR)\checkout$O $(OBJDIR)\clearsign$O $(OBJDIR)\clone$O $(OBJDIR)\comformat$O $(OBJDIR)\configure$O $(OBJDIR)\content$O $(OBJDIR)\db$O $(OBJDIR)\delta$O $(OBJDIR)\deltacmd$O $(OBJDIR)\descendants$O $(OBJDIR)\diff$O $(OBJDIR)\diffcmd$O $(OBJDIR)\doc$O $(OBJDIR)\encode$O $(OBJDIR)\event$O $(OBJDIR)\export$O $(OBJDIR)\file$O $(OBJDIR)\finfo$O $(OBJDIR)\glob$O $(OBJDIR)\graph$O $(OBJDIR)\gzip$O $(OBJDIR)\http$O $(OBJDIR)\http_socket$O $(OBJDIR)\http_ssl$O $(OBJDIR)\http_transport$O $(OBJDIR)\import$O $(OBJDIR)\info$O $(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 $(OBJDIR)\leaf$O $(OBJDIR)\login$O $(OBJDIR)\main$O $(OBJDIR)\manifest$O $(OBJDIR)\md5$O $(OBJDIR)\merge$O $(OBJDIR)\merge3$O $(OBJDIR)\name$O $(OBJDIR)\path$O $(OBJDIR)\pivot$O $(OBJDIR)\popen$O $(OBJDIR)\pqueue$O $(OBJDIR)\printf$O $(OBJDIR)\rebuild$O $(OBJDIR)\report$O $(OBJDIR)\rss$O $(OBJDIR)\schema$O $(OBJDIR)\search$O $(OBJDIR)\setup$O $(OBJDIR)\sha1$O $(OBJDIR)\shun$O $(OBJDIR)\skins$O $(OBJDIR)\sqlcmd$O $(OBJDIR)\stash$O $(OBJDIR)\stat$O $(OBJDIR)\style$O $(OBJDIR)\sync$O $(OBJDIR)\tag$O $(OBJDIR)\tar$O $(OBJDIR)\th_main$O $(OBJDIR)\timeline$O $(OBJDIR)\tkt$O $(OBJDIR)\tktsetup$O $(OBJDIR)\undo$O $(OBJDIR)\update$O $(OBJDIR)\url$O $(OBJDIR)\user$O $(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 $(OBJDIR)\shell$O $(OBJDIR)\sqlite3$O $(OBJDIR)\th$O $(OBJDIR)\th_lang$O 
    34     34   
    35     35   
    36     36   RC=$(DMDIR)\bin\rcc
    37     37   RCFLAGS=-32 -w1 -I$(SRCDIR) /D__DMC__
    38     38   
    39     39   APPNAME = $(OBJDIR)\fossil$(E)
    40     40   
................................................................................
    44     44   	cd $(OBJDIR) 
    45     45   	$(DMDIR)\bin\link @link
    46     46   
    47     47   $(OBJDIR)\fossil.res:	$B\win\fossil.rc
    48     48   	$(RC) $(RCFLAGS) -o$@ $**
    49     49   
    50     50   $(OBJDIR)\link: $B\win\Makefile.dmc $(OBJDIR)\fossil.res
    51         -	+echo add allrepo attach bag bisect blob branch browse captcha cgi checkin checkout clearsign clone comformat configure content db delta deltacmd descendants diff diffcmd doc encode event export file finfo glob graph gzip http http_socket http_ssl http_transport import info json json_artifact json_branch json_config json_diff json_dir json_finfo json_login json_query json_report json_tag json_timeline json_user json_wiki leaf login main manifest md5 merge merge3 name path pivot popen pqueue printf rebuild report rss schema search setup sha1 shun skins sqlcmd stash stat style sync tag tar th_main timeline tkt tktsetup undo update url user verify vfile wiki wikiformat winhttp xfer xfersetup zip shell sqlite3 th th_lang > $@
           51  +	+echo add allrepo attach bag bisect blob branch browse captcha cgi checkin checkout clearsign clone comformat configure content db delta deltacmd descendants diff diffcmd doc encode event export file finfo glob graph gzip http http_socket http_ssl http_transport import info json json_artifact json_branch json_config json_diff json_dir json_finfo json_login json_query json_report json_tag json_timeline json_user json_wiki leaf login main manifest md5 merge merge3 name path pivot popen pqueue printf rebuild report rss schema search setup sha1 shun skins sqlcmd stash stat style sync tag tar th_main timeline tkt tktsetup undo update url user verify vfile wiki wikiformat winhttp wysiwyg xfer xfersetup zip shell sqlite3 th th_lang > $@
    52     52   	+echo fossil >> $@
    53     53   	+echo fossil >> $@
    54     54   	+echo $(LIBS) >> $@
    55     55   	+echo. >> $@
    56     56   	+echo fossil >> $@
    57     57   
    58     58   translate$E: $(SRCDIR)\translate.c
................................................................................
   671    671   	+translate$E $** > $@
   672    672   
   673    673   $(OBJDIR)\winhttp$O : winhttp_.c winhttp.h
   674    674   	$(TCC) -o$@ -c winhttp_.c
   675    675   
   676    676   winhttp_.c : $(SRCDIR)\winhttp.c
   677    677   	+translate$E $** > $@
          678  +
          679  +$(OBJDIR)\wysiwyg$O : wysiwyg_.c wysiwyg.h
          680  +	$(TCC) -o$@ -c wysiwyg_.c
          681  +
          682  +wysiwyg_.c : $(SRCDIR)\wysiwyg.c
          683  +	+translate$E $** > $@
   678    684   
   679    685   $(OBJDIR)\xfer$O : xfer_.c xfer.h
   680    686   	$(TCC) -o$@ -c xfer_.c
   681    687   
   682    688   xfer_.c : $(SRCDIR)\xfer.c
   683    689   	+translate$E $** > $@
   684    690   
................................................................................
   691    697   $(OBJDIR)\zip$O : zip_.c zip.h
   692    698   	$(TCC) -o$@ -c zip_.c
   693    699   
   694    700   zip_.c : $(SRCDIR)\zip.c
   695    701   	+translate$E $** > $@
   696    702   
   697    703   headers: makeheaders$E page_index.h VERSION.h
   698         -	 +makeheaders$E add_.c:add.h allrepo_.c:allrepo.h attach_.c:attach.h bag_.c:bag.h bisect_.c:bisect.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h captcha_.c:captcha.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h configure_.c:configure.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendants_.c:descendants.h diff_.c:diff.h diffcmd_.c:diffcmd.h doc_.c:doc.h encode_.c:encode.h event_.c:event.h export_.c:export.h file_.c:file.h finfo_.c:finfo.h glob_.c:glob.h graph_.c:graph.h gzip_.c:gzip.h http_.c:http.h http_socket_.c:http_socket.h http_ssl_.c:http_ssl.h http_transport_.c:http_transport.h import_.c:import.h info_.c:info.h json_.c:json.h json_artifact_.c:json_artifact.h json_branch_.c:json_branch.h json_config_.c:json_config.h json_diff_.c:json_diff.h json_dir_.c:json_dir.h json_finfo_.c:json_finfo.h json_login_.c:json_login.h json_query_.c:json_query.h json_report_.c:json_report.h json_tag_.c:json_tag.h json_timeline_.c:json_timeline.h json_user_.c:json_user.h json_wiki_.c:json_wiki.h leaf_.c:leaf.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h path_.c:path.h pivot_.c:pivot.h popen_.c:popen.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h report_.c:report.h rss_.c:rss.h schema_.c:schema.h search_.c:search.h setup_.c:setup.h sha1_.c:sha1.h shun_.c:shun.h skins_.c:skins.h sqlcmd_.c:sqlcmd.h stash_.c:stash.h stat_.c:stat.h style_.c:style.h sync_.c:sync.h tag_.c:tag.h tar_.c:tar.h th_main_.c:th_main.h timeline_.c:timeline.h tkt_.c:tkt.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h winhttp_.c:winhttp.h xfer_.c:xfer.h xfersetup_.c:xfersetup.h zip_.c:zip.h $(SRCDIR)\sqlite3.h $(SRCDIR)\th.h VERSION.h $(SRCDIR)\cson_amalgamation.h
          704  +	 +makeheaders$E add_.c:add.h allrepo_.c:allrepo.h attach_.c:attach.h bag_.c:bag.h bisect_.c:bisect.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h captcha_.c:captcha.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h configure_.c:configure.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendants_.c:descendants.h diff_.c:diff.h diffcmd_.c:diffcmd.h doc_.c:doc.h encode_.c:encode.h event_.c:event.h export_.c:export.h file_.c:file.h finfo_.c:finfo.h glob_.c:glob.h graph_.c:graph.h gzip_.c:gzip.h http_.c:http.h http_socket_.c:http_socket.h http_ssl_.c:http_ssl.h http_transport_.c:http_transport.h import_.c:import.h info_.c:info.h json_.c:json.h json_artifact_.c:json_artifact.h json_branch_.c:json_branch.h json_config_.c:json_config.h json_diff_.c:json_diff.h json_dir_.c:json_dir.h json_finfo_.c:json_finfo.h json_login_.c:json_login.h json_query_.c:json_query.h json_report_.c:json_report.h json_tag_.c:json_tag.h json_timeline_.c:json_timeline.h json_user_.c:json_user.h json_wiki_.c:json_wiki.h leaf_.c:leaf.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h path_.c:path.h pivot_.c:pivot.h popen_.c:popen.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h report_.c:report.h rss_.c:rss.h schema_.c:schema.h search_.c:search.h setup_.c:setup.h sha1_.c:sha1.h shun_.c:shun.h skins_.c:skins.h sqlcmd_.c:sqlcmd.h stash_.c:stash.h stat_.c:stat.h style_.c:style.h sync_.c:sync.h tag_.c:tag.h tar_.c:tar.h th_main_.c:th_main.h timeline_.c:timeline.h tkt_.c:tkt.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h winhttp_.c:winhttp.h wysiwyg_.c:wysiwyg.h xfer_.c:xfer.h xfersetup_.c:xfersetup.h zip_.c:zip.h $(SRCDIR)\sqlite3.h $(SRCDIR)\th.h VERSION.h $(SRCDIR)\cson_amalgamation.h
   699    705   	@copy /Y nul: headers

Changes to win/Makefile.mingw.

   263    263     $(SRCDIR)/url.c \
   264    264     $(SRCDIR)/user.c \
   265    265     $(SRCDIR)/verify.c \
   266    266     $(SRCDIR)/vfile.c \
   267    267     $(SRCDIR)/wiki.c \
   268    268     $(SRCDIR)/wikiformat.c \
   269    269     $(SRCDIR)/winhttp.c \
          270  +  $(SRCDIR)/wysiwyg.c \
   270    271     $(SRCDIR)/xfer.c \
   271    272     $(SRCDIR)/xfersetup.c \
   272    273     $(SRCDIR)/zip.c
   273    274   
   274    275   TRANS_SRC = \
   275    276     $(OBJDIR)/add_.c \
   276    277     $(OBJDIR)/allrepo_.c \
................................................................................
   362    363     $(OBJDIR)/url_.c \
   363    364     $(OBJDIR)/user_.c \
   364    365     $(OBJDIR)/verify_.c \
   365    366     $(OBJDIR)/vfile_.c \
   366    367     $(OBJDIR)/wiki_.c \
   367    368     $(OBJDIR)/wikiformat_.c \
   368    369     $(OBJDIR)/winhttp_.c \
          370  +  $(OBJDIR)/wysiwyg_.c \
   369    371     $(OBJDIR)/xfer_.c \
   370    372     $(OBJDIR)/xfersetup_.c \
   371    373     $(OBJDIR)/zip_.c
   372    374   
   373    375   OBJ = \
   374    376    $(OBJDIR)/add.o \
   375    377    $(OBJDIR)/allrepo.o \
................................................................................
   461    463    $(OBJDIR)/url.o \
   462    464    $(OBJDIR)/user.o \
   463    465    $(OBJDIR)/verify.o \
   464    466    $(OBJDIR)/vfile.o \
   465    467    $(OBJDIR)/wiki.o \
   466    468    $(OBJDIR)/wikiformat.o \
   467    469    $(OBJDIR)/winhttp.o \
          470  + $(OBJDIR)/wysiwyg.o \
   468    471    $(OBJDIR)/xfer.o \
   469    472    $(OBJDIR)/xfersetup.o \
   470    473    $(OBJDIR)/zip.o
   471    474   
   472    475   APPNAME = fossil.exe
   473    476   TRANSLATE   = $(OBJDIR)/translate.exe
   474    477   MAKEHEADERS = $(OBJDIR)/makeheaders.exe
................................................................................
   535    538   setup: $(OBJDIR) $(APPNAME)
   536    539   	$(MAKENSIS) ./fossil.nsi
   537    540   
   538    541   
   539    542   $(OBJDIR)/page_index.h: $(TRANS_SRC) $(OBJDIR)/mkindex
   540    543   	$(MKINDEX) $(TRANS_SRC) >$@
   541    544   $(OBJDIR)/headers:	$(OBJDIR)/page_index.h $(OBJDIR)/makeheaders $(OBJDIR)/VERSION.h
   542         -	$(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
          545  +	$(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
   543    546   	echo Done >$(OBJDIR)/headers
   544    547   
   545    548   $(OBJDIR)/headers: Makefile
   546    549   Makefile:
   547    550   $(OBJDIR)/add_.c:	$(SRCDIR)/add.c $(OBJDIR)/translate
   548    551   	$(TRANSLATE) $(SRCDIR)/add.c >$(OBJDIR)/add_.c
   549    552   
................................................................................
  1198   1201   $(OBJDIR)/winhttp_.c:	$(SRCDIR)/winhttp.c $(OBJDIR)/translate
  1199   1202   	$(TRANSLATE) $(SRCDIR)/winhttp.c >$(OBJDIR)/winhttp_.c
  1200   1203   
  1201   1204   $(OBJDIR)/winhttp.o:	$(OBJDIR)/winhttp_.c $(OBJDIR)/winhttp.h  $(SRCDIR)/config.h
  1202   1205   	$(XTCC) -o $(OBJDIR)/winhttp.o -c $(OBJDIR)/winhttp_.c
  1203   1206   
  1204   1207   winhttp.h:	$(OBJDIR)/headers
         1208  +$(OBJDIR)/wysiwyg_.c:	$(SRCDIR)/wysiwyg.c $(OBJDIR)/translate
         1209  +	$(TRANSLATE) $(SRCDIR)/wysiwyg.c >$(OBJDIR)/wysiwyg_.c
         1210  +
         1211  +$(OBJDIR)/wysiwyg.o:	$(OBJDIR)/wysiwyg_.c $(OBJDIR)/wysiwyg.h  $(SRCDIR)/config.h
         1212  +	$(XTCC) -o $(OBJDIR)/wysiwyg.o -c $(OBJDIR)/wysiwyg_.c
         1213  +
         1214  +wysiwyg.h:	$(OBJDIR)/headers
  1205   1215   $(OBJDIR)/xfer_.c:	$(SRCDIR)/xfer.c $(OBJDIR)/translate
  1206   1216   	$(TRANSLATE) $(SRCDIR)/xfer.c >$(OBJDIR)/xfer_.c
  1207   1217   
  1208   1218   $(OBJDIR)/xfer.o:	$(OBJDIR)/xfer_.c $(OBJDIR)/xfer.h  $(SRCDIR)/config.h
  1209   1219   	$(XTCC) -o $(OBJDIR)/xfer.o -c $(OBJDIR)/xfer_.c
  1210   1220   
  1211   1221   xfer.h:	$(OBJDIR)/headers

Changes to win/Makefile.msc.

    38     38   BCC    = $(CC) $(CFLAGS)
    39     39   TCC    = $(CC) -c $(CFLAGS) $(MSCDEF) $(SSL) $(INCL)
    40     40   LIBS   = $(ZLIB) ws2_32.lib advapi32.lib $(SSLLIB)
    41     41   LIBDIR = -LIBPATH:$(MSCDIR)\extra\lib -LIBPATH:$(ZLIBDIR)
    42     42   
    43     43   SQLITE_OPTIONS = /DSQLITE_OMIT_LOAD_EXTENSION=1 /DSQLITE_THREADSAFE=0 /DSQLITE_DEFAULT_FILE_FORMAT=4 /DSQLITE_ENABLE_STAT3 /Dlocaltime=fossil_localtime /DSQLITE_ENABLE_LOCKING_STYLE=0
    44     44   
    45         -SRC   = add_.c allrepo_.c attach_.c bag_.c bisect_.c blob_.c branch_.c browse_.c captcha_.c cgi_.c checkin_.c checkout_.c clearsign_.c clone_.c comformat_.c configure_.c content_.c db_.c delta_.c deltacmd_.c descendants_.c diff_.c diffcmd_.c doc_.c encode_.c event_.c export_.c file_.c finfo_.c glob_.c graph_.c gzip_.c http_.c http_socket_.c http_ssl_.c http_transport_.c import_.c info_.c json_.c json_artifact_.c json_branch_.c json_config_.c json_diff_.c json_dir_.c json_finfo_.c json_login_.c json_query_.c json_report_.c json_tag_.c json_timeline_.c json_user_.c json_wiki_.c leaf_.c login_.c main_.c manifest_.c md5_.c merge_.c merge3_.c name_.c path_.c pivot_.c popen_.c pqueue_.c printf_.c rebuild_.c report_.c rss_.c schema_.c search_.c setup_.c sha1_.c shun_.c skins_.c sqlcmd_.c stash_.c stat_.c style_.c sync_.c tag_.c tar_.c th_main_.c timeline_.c tkt_.c tktsetup_.c undo_.c update_.c url_.c user_.c verify_.c vfile_.c wiki_.c wikiformat_.c winhttp_.c xfer_.c xfersetup_.c zip_.c 
           45  +SRC   = add_.c allrepo_.c attach_.c bag_.c bisect_.c blob_.c branch_.c browse_.c captcha_.c cgi_.c checkin_.c checkout_.c clearsign_.c clone_.c comformat_.c configure_.c content_.c db_.c delta_.c deltacmd_.c descendants_.c diff_.c diffcmd_.c doc_.c encode_.c event_.c export_.c file_.c finfo_.c glob_.c graph_.c gzip_.c http_.c http_socket_.c http_ssl_.c http_transport_.c import_.c info_.c json_.c json_artifact_.c json_branch_.c json_config_.c json_diff_.c json_dir_.c json_finfo_.c json_login_.c json_query_.c json_report_.c json_tag_.c json_timeline_.c json_user_.c json_wiki_.c leaf_.c login_.c main_.c manifest_.c md5_.c merge_.c merge3_.c name_.c path_.c pivot_.c popen_.c pqueue_.c printf_.c rebuild_.c report_.c rss_.c schema_.c search_.c setup_.c sha1_.c shun_.c skins_.c sqlcmd_.c stash_.c stat_.c style_.c sync_.c tag_.c tar_.c th_main_.c timeline_.c tkt_.c tktsetup_.c undo_.c update_.c url_.c user_.c verify_.c vfile_.c wiki_.c wikiformat_.c winhttp_.c wysiwyg_.c xfer_.c xfersetup_.c zip_.c 
    46     46   
    47         -OBJ   = $(OX)\add$O $(OX)\allrepo$O $(OX)\attach$O $(OX)\bag$O $(OX)\bisect$O $(OX)\blob$O $(OX)\branch$O $(OX)\browse$O $(OX)\captcha$O $(OX)\cgi$O $(OX)\checkin$O $(OX)\checkout$O $(OX)\clearsign$O $(OX)\clone$O $(OX)\comformat$O $(OX)\configure$O $(OX)\content$O $(OX)\db$O $(OX)\delta$O $(OX)\deltacmd$O $(OX)\descendants$O $(OX)\diff$O $(OX)\diffcmd$O $(OX)\doc$O $(OX)\encode$O $(OX)\event$O $(OX)\export$O $(OX)\file$O $(OX)\finfo$O $(OX)\glob$O $(OX)\graph$O $(OX)\gzip$O $(OX)\http$O $(OX)\http_socket$O $(OX)\http_ssl$O $(OX)\http_transport$O $(OX)\import$O $(OX)\info$O $(OX)\json$O $(OX)\json_artifact$O $(OX)\json_branch$O $(OX)\json_config$O $(OX)\json_diff$O $(OX)\json_dir$O $(OX)\json_finfo$O $(OX)\json_login$O $(OX)\json_query$O $(OX)\json_report$O $(OX)\json_tag$O $(OX)\json_timeline$O $(OX)\json_user$O $(OX)\json_wiki$O $(OX)\leaf$O $(OX)\login$O $(OX)\main$O $(OX)\manifest$O $(OX)\md5$O $(OX)\merge$O $(OX)\merge3$O $(OX)\name$O $(OX)\path$O $(OX)\pivot$O $(OX)\popen$O $(OX)\pqueue$O $(OX)\printf$O $(OX)\rebuild$O $(OX)\report$O $(OX)\rss$O $(OX)\schema$O $(OX)\search$O $(OX)\setup$O $(OX)\sha1$O $(OX)\shun$O $(OX)\skins$O $(OX)\sqlcmd$O $(OX)\stash$O $(OX)\stat$O $(OX)\style$O $(OX)\sync$O $(OX)\tag$O $(OX)\tar$O $(OX)\th_main$O $(OX)\timeline$O $(OX)\tkt$O $(OX)\tktsetup$O $(OX)\undo$O $(OX)\update$O $(OX)\url$O $(OX)\user$O $(OX)\verify$O $(OX)\vfile$O $(OX)\wiki$O $(OX)\wikiformat$O $(OX)\winhttp$O $(OX)\xfer$O $(OX)\xfersetup$O $(OX)\zip$O $(OX)\shell$O $(OX)\sqlite3$O $(OX)\th$O $(OX)\th_lang$O 
           47  +OBJ   = $(OX)\add$O $(OX)\allrepo$O $(OX)\attach$O $(OX)\bag$O $(OX)\bisect$O $(OX)\blob$O $(OX)\branch$O $(OX)\browse$O $(OX)\captcha$O $(OX)\cgi$O $(OX)\checkin$O $(OX)\checkout$O $(OX)\clearsign$O $(OX)\clone$O $(OX)\comformat$O $(OX)\configure$O $(OX)\content$O $(OX)\db$O $(OX)\delta$O $(OX)\deltacmd$O $(OX)\descendants$O $(OX)\diff$O $(OX)\diffcmd$O $(OX)\doc$O $(OX)\encode$O $(OX)\event$O $(OX)\export$O $(OX)\file$O $(OX)\finfo$O $(OX)\glob$O $(OX)\graph$O $(OX)\gzip$O $(OX)\http$O $(OX)\http_socket$O $(OX)\http_ssl$O $(OX)\http_transport$O $(OX)\import$O $(OX)\info$O $(OX)\json$O $(OX)\json_artifact$O $(OX)\json_branch$O $(OX)\json_config$O $(OX)\json_diff$O $(OX)\json_dir$O $(OX)\json_finfo$O $(OX)\json_login$O $(OX)\json_query$O $(OX)\json_report$O $(OX)\json_tag$O $(OX)\json_timeline$O $(OX)\json_user$O $(OX)\json_wiki$O $(OX)\leaf$O $(OX)\login$O $(OX)\main$O $(OX)\manifest$O $(OX)\md5$O $(OX)\merge$O $(OX)\merge3$O $(OX)\name$O $(OX)\path$O $(OX)\pivot$O $(OX)\popen$O $(OX)\pqueue$O $(OX)\printf$O $(OX)\rebuild$O $(OX)\report$O $(OX)\rss$O $(OX)\schema$O $(OX)\search$O $(OX)\setup$O $(OX)\sha1$O $(OX)\shun$O $(OX)\skins$O $(OX)\sqlcmd$O $(OX)\stash$O $(OX)\stat$O $(OX)\style$O $(OX)\sync$O $(OX)\tag$O $(OX)\tar$O $(OX)\th_main$O $(OX)\timeline$O $(OX)\tkt$O $(OX)\tktsetup$O $(OX)\undo$O $(OX)\update$O $(OX)\url$O $(OX)\user$O $(OX)\verify$O $(OX)\vfile$O $(OX)\wiki$O $(OX)\wikiformat$O $(OX)\winhttp$O $(OX)\wysiwyg$O $(OX)\xfer$O $(OX)\xfersetup$O $(OX)\zip$O $(OX)\shell$O $(OX)\sqlite3$O $(OX)\th$O $(OX)\th_lang$O 
    48     48   
    49     49   
    50     50   APPNAME = $(OX)\fossil$(E)
    51     51   
    52     52   all: $(OX) $(APPNAME)
    53     53   
    54     54   $(APPNAME) : translate$E mkindex$E headers $(OBJ) $(OX)\linkopts
................................................................................
   150    150   	echo $(OX)\url.obj >> $@
   151    151   	echo $(OX)\user.obj >> $@
   152    152   	echo $(OX)\verify.obj >> $@
   153    153   	echo $(OX)\vfile.obj >> $@
   154    154   	echo $(OX)\wiki.obj >> $@
   155    155   	echo $(OX)\wikiformat.obj >> $@
   156    156   	echo $(OX)\winhttp.obj >> $@
          157  +	echo $(OX)\wysiwyg.obj >> $@
   157    158   	echo $(OX)\xfer.obj >> $@
   158    159   	echo $(OX)\xfersetup.obj >> $@
   159    160   	echo $(OX)\zip.obj >> $@
   160    161   	echo $(LIBS) >> $@
   161    162   
   162    163   
   163    164   
................................................................................
   780    781   	translate$E $** > $@
   781    782   
   782    783   $(OX)\winhttp$O : winhttp_.c winhttp.h
   783    784   	$(TCC) /Fo$@ -c winhttp_.c
   784    785   
   785    786   winhttp_.c : $(SRCDIR)\winhttp.c
   786    787   	translate$E $** > $@
          788  +
          789  +$(OX)\wysiwyg$O : wysiwyg_.c wysiwyg.h
          790  +	$(TCC) /Fo$@ -c wysiwyg_.c
          791  +
          792  +wysiwyg_.c : $(SRCDIR)\wysiwyg.c
          793  +	translate$E $** > $@
   787    794   
   788    795   $(OX)\xfer$O : xfer_.c xfer.h
   789    796   	$(TCC) /Fo$@ -c xfer_.c
   790    797   
   791    798   xfer_.c : $(SRCDIR)\xfer.c
   792    799   	translate$E $** > $@
   793    800   
................................................................................
   800    807   $(OX)\zip$O : zip_.c zip.h
   801    808   	$(TCC) /Fo$@ -c zip_.c
   802    809   
   803    810   zip_.c : $(SRCDIR)\zip.c
   804    811   	translate$E $** > $@
   805    812   
   806    813   headers: makeheaders$E page_index.h VERSION.h
   807         -	makeheaders$E add_.c:add.h allrepo_.c:allrepo.h attach_.c:attach.h bag_.c:bag.h bisect_.c:bisect.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h captcha_.c:captcha.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h configure_.c:configure.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendants_.c:descendants.h diff_.c:diff.h diffcmd_.c:diffcmd.h doc_.c:doc.h encode_.c:encode.h event_.c:event.h export_.c:export.h file_.c:file.h finfo_.c:finfo.h glob_.c:glob.h graph_.c:graph.h gzip_.c:gzip.h http_.c:http.h http_socket_.c:http_socket.h http_ssl_.c:http_ssl.h http_transport_.c:http_transport.h import_.c:import.h info_.c:info.h json_.c:json.h json_artifact_.c:json_artifact.h json_branch_.c:json_branch.h json_config_.c:json_config.h json_diff_.c:json_diff.h json_dir_.c:json_dir.h json_finfo_.c:json_finfo.h json_login_.c:json_login.h json_query_.c:json_query.h json_report_.c:json_report.h json_tag_.c:json_tag.h json_timeline_.c:json_timeline.h json_user_.c:json_user.h json_wiki_.c:json_wiki.h leaf_.c:leaf.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h path_.c:path.h pivot_.c:pivot.h popen_.c:popen.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h report_.c:report.h rss_.c:rss.h schema_.c:schema.h search_.c:search.h setup_.c:setup.h sha1_.c:sha1.h shun_.c:shun.h skins_.c:skins.h sqlcmd_.c:sqlcmd.h stash_.c:stash.h stat_.c:stat.h style_.c:style.h sync_.c:sync.h tag_.c:tag.h tar_.c:tar.h th_main_.c:th_main.h timeline_.c:timeline.h tkt_.c:tkt.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h winhttp_.c:winhttp.h xfer_.c:xfer.h xfersetup_.c:xfersetup.h zip_.c:zip.h $(SRCDIR)\sqlite3.h $(SRCDIR)\th.h VERSION.h $(SRCDIR)\cson_amalgamation.h
          814  +	makeheaders$E add_.c:add.h allrepo_.c:allrepo.h attach_.c:attach.h bag_.c:bag.h bisect_.c:bisect.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h captcha_.c:captcha.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h configure_.c:configure.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendants_.c:descendants.h diff_.c:diff.h diffcmd_.c:diffcmd.h doc_.c:doc.h encode_.c:encode.h event_.c:event.h export_.c:export.h file_.c:file.h finfo_.c:finfo.h glob_.c:glob.h graph_.c:graph.h gzip_.c:gzip.h http_.c:http.h http_socket_.c:http_socket.h http_ssl_.c:http_ssl.h http_transport_.c:http_transport.h import_.c:import.h info_.c:info.h json_.c:json.h json_artifact_.c:json_artifact.h json_branch_.c:json_branch.h json_config_.c:json_config.h json_diff_.c:json_diff.h json_dir_.c:json_dir.h json_finfo_.c:json_finfo.h json_login_.c:json_login.h json_query_.c:json_query.h json_report_.c:json_report.h json_tag_.c:json_tag.h json_timeline_.c:json_timeline.h json_user_.c:json_user.h json_wiki_.c:json_wiki.h leaf_.c:leaf.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h path_.c:path.h pivot_.c:pivot.h popen_.c:popen.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h report_.c:report.h rss_.c:rss.h schema_.c:schema.h search_.c:search.h setup_.c:setup.h sha1_.c:sha1.h shun_.c:shun.h skins_.c:skins.h sqlcmd_.c:sqlcmd.h stash_.c:stash.h stat_.c:stat.h style_.c:style.h sync_.c:sync.h tag_.c:tag.h tar_.c:tar.h th_main_.c:th_main.h timeline_.c:timeline.h tkt_.c:tkt.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h winhttp_.c:winhttp.h wysiwyg_.c:wysiwyg.h xfer_.c:xfer.h xfersetup_.c:xfersetup.h zip_.c:zip.h $(SRCDIR)\sqlite3.h $(SRCDIR)\th.h VERSION.h $(SRCDIR)\cson_amalgamation.h
   808    815   	@copy /Y nul: headers