Fossil SCM

Reintroduced the legacy wysiwyg wiki editor as an optional element which can be plugged in via the skin if desired. Several semi-related "code-adjacent" tweaks and improvements.

stephan 2020-08-30 18:58 trunk merge
Commit 03a64a39adcefcc5d9beb525531a4bb5d0809cfeba25190c1b2c6311d352ef01
--- skins/xekri/css.txt
+++ skins/xekri/css.txt
@@ -1118,5 +1118,10 @@
11181118
}
11191119
/* odd table row color */
11201120
tr.row1 {
11211121
/* Use default */
11221122
}
1123
+
1124
+.fossil-tooltip.help-buttonlet-content {
1125
+ background-color: #111;
1126
+ border: 1px solid rgba(255,255,255,0.5);
1127
+}
11231128
--- skins/xekri/css.txt
+++ skins/xekri/css.txt
@@ -1118,5 +1118,10 @@
1118 }
1119 /* odd table row color */
1120 tr.row1 {
1121 /* Use default */
1122 }
 
 
 
 
 
1123
--- skins/xekri/css.txt
+++ skins/xekri/css.txt
@@ -1118,5 +1118,10 @@
1118 }
1119 /* odd table row color */
1120 tr.row1 {
1121 /* Use default */
1122 }
1123
1124 .fossil-tooltip.help-buttonlet-content {
1125 background-color: #111;
1126 border: 1px solid rgba(255,255,255,0.5);
1127 }
1128
+40 -18
--- src/default.css
+++ src/default.css
@@ -1108,16 +1108,17 @@
11081108
we can include multiple INPUT elements (e.g. a set of radio
11091109
buttons). Note that these elements must sometimes be BLOCK elements
11101110
(e.g. DIV) so that certain nesting constructs are legal.
11111111
*/
11121112
.input-with-label {
1113
- border: 1px inset #808080;
1113
+ border: 1px inset rgba(128, 128, 128, 0.5);
11141114
border-radius: 0.25em;
1115
- padding: 0.25em 0.4em;
1115
+ padding: 0.15em 0.25em;
11161116
margin: 0 0.5em;
11171117
display: inline-block;
11181118
cursor: default;
1119
+ white-space: nowrap;
11191120
}
11201121
.input-with-label > * {
11211122
vertical-align: middle;
11221123
}
11231124
.input-with-label > label {
@@ -1310,32 +1311,52 @@
13101311
otherwise they must be DIVs (block elements) so that nesting of
13111312
block-element content is legal.
13121313
*/
13131314
.help-buttonlet {
13141315
display: inline-block;
1315
- min-width: 1rem;
1316
- max-width: 1rem;
1317
- min-height: 1rem;
1318
- max-height: 1rem;
1319
- font-size: 0.9em;
1320
- border-radius: 0.5rem;
1321
- background-color: rgba(54, 54, 255,1);
1322
- color: rgb(255, 255, 255);
1316
+ min-width: 1em;
1317
+ max-width: 1em;
1318
+ min-height: 1em;
1319
+ max-height: 1em;
13231320
cursor: pointer;
1324
- font-family: monspace;
1325
- text-align: center;
13261321
margin: 0 0 0 0.35em;
1327
- border-width: 1px;
1322
+ background-image: /* white question mark on blue circular background */
1323
+ url("data:image/svg+xml;charset=UTF-8,%3csvg xmlns='http://www.w3.org/2000/svg' \
1324
+viewBox='0 0 15.867574 15.867574'%3e%3ccircle cx='7.9337869' cy='7.9337869' \
1325
+r='7.9337869' style='fill:%23f0f0f0;stroke-width:1' /%3e%3ccircle cx='7.9337869' \
1326
+cy='7.9337869' r='6.9662519' style='fill:%23404040;stroke-width:1' /%3e%3ccircle \
1327
+cx='7.9337869' cy='7.9337869' r='5.9987168' style='fill:%235080d0;stroke-width:1' \
1328
+ /%3e%3cpath d='M 8.7214664,9.7504179 H 6.1597329 V 9.4027037 q 0,-0.5818896 \
1329
+0.234175,-1.0289511 Q 6.628083,7.9195949 7.3802819,7.2241658 L 7.8344395,6.8125852 \
1330
+Q 8.2389238,6.4435822 8.4234253,6.1171563 8.6150232,5.7907304 8.6150232,5.4643045 \
1331
+q 0,-0.496735 -0.3406184,-0.7734874 Q 7.9337866,4.4069686 7.323512,4.4069686 q \
1332
+-0.5747934,0 -1.2418375,0.2412712 Q 5.4146304,4.8824149 4.6908164,5.3507651 \
1333
+V 3.1225537 Q 5.5494585,2.8245126 6.2590798,2.6825884 6.9687013,2.5406641 \
1334
+7.6286492,2.5406641 q 1.7314764,0 2.6397908,0.7096215 0.908317,0.7025253 \
1335
+0.908317,2.0579022 0,0.6954289 -0.276754,1.2489339 -0.276751,0.5464084 \
1336
+-0.9437957,1.1779715 L 9.5020499,8.1395775 Q 9.0195073,8.5795428 8.8704867,8.8491989 \
1337
+8.7214664,9.1117588 8.7214664,9.4310884 Z M 6.1597329,10.800658 H 8.7214664 \
1338
+V 13.32691 H 6.1597329 Z' style='fill:%23f8f8f8;stroke-width:1.32118618' /%3e%3c/svg%3e");
1339
+ background-repeat: no-repeat;
1340
+ background-position: center;
1341
+ /* When not using a background image, this additional style works
1342
+ reasonably well along with a ::before content of "?": */
1343
+ /*border-width: 1px;
13281344
border-style: outset;
1345
+ border-radius: 0.5em;
1346
+ font-size: 100%;
1347
+ font-family: monspace;
13291348
font-weight: 700;
13301349
overflow: hidden;
1331
-}
1332
-
1333
-.help-buttonlet::before {
1334
- content: "?";
1350
+ background-color: rgba(54, 54, 255,1);
1351
+ color: rgb(255, 255, 255);
1352
+ text-align: center;
1353
+ line-height: 1; */
13351354
}
1336
-
1355
+/*.help-buttonlet::before {
1356
+ content: "?";
1357
+}*/
13371358
/**
13381359
We really want to hide all help text via CSS but CSS cannot select
13391360
TEXT nodes. Thus we move them out of the way programmatically
13401361
during initialization.
13411362
*/
@@ -1349,6 +1370,7 @@
13491370
*/
13501371
.fossil-tooltip.help-buttonlet-content {
13511372
cursor: default;
13521373
text-align: left;
13531374
border-style: outset;
1375
+ background-color: inherit;
13541376
}
13551377
--- src/default.css
+++ src/default.css
@@ -1108,16 +1108,17 @@
1108 we can include multiple INPUT elements (e.g. a set of radio
1109 buttons). Note that these elements must sometimes be BLOCK elements
1110 (e.g. DIV) so that certain nesting constructs are legal.
1111 */
1112 .input-with-label {
1113 border: 1px inset #808080;
1114 border-radius: 0.25em;
1115 padding: 0.25em 0.4em;
1116 margin: 0 0.5em;
1117 display: inline-block;
1118 cursor: default;
 
1119 }
1120 .input-with-label > * {
1121 vertical-align: middle;
1122 }
1123 .input-with-label > label {
@@ -1310,32 +1311,52 @@
1310 otherwise they must be DIVs (block elements) so that nesting of
1311 block-element content is legal.
1312 */
1313 .help-buttonlet {
1314 display: inline-block;
1315 min-width: 1rem;
1316 max-width: 1rem;
1317 min-height: 1rem;
1318 max-height: 1rem;
1319 font-size: 0.9em;
1320 border-radius: 0.5rem;
1321 background-color: rgba(54, 54, 255,1);
1322 color: rgb(255, 255, 255);
1323 cursor: pointer;
1324 font-family: monspace;
1325 text-align: center;
1326 margin: 0 0 0 0.35em;
1327 border-width: 1px;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1328 border-style: outset;
 
 
 
1329 font-weight: 700;
1330 overflow: hidden;
1331 }
1332
1333 .help-buttonlet::before {
1334 content: "?";
1335 }
1336
 
 
1337 /**
1338 We really want to hide all help text via CSS but CSS cannot select
1339 TEXT nodes. Thus we move them out of the way programmatically
1340 during initialization.
1341 */
@@ -1349,6 +1370,7 @@
1349 */
1350 .fossil-tooltip.help-buttonlet-content {
1351 cursor: default;
1352 text-align: left;
1353 border-style: outset;
 
1354 }
1355
--- src/default.css
+++ src/default.css
@@ -1108,16 +1108,17 @@
1108 we can include multiple INPUT elements (e.g. a set of radio
1109 buttons). Note that these elements must sometimes be BLOCK elements
1110 (e.g. DIV) so that certain nesting constructs are legal.
1111 */
1112 .input-with-label {
1113 border: 1px inset rgba(128, 128, 128, 0.5);
1114 border-radius: 0.25em;
1115 padding: 0.15em 0.25em;
1116 margin: 0 0.5em;
1117 display: inline-block;
1118 cursor: default;
1119 white-space: nowrap;
1120 }
1121 .input-with-label > * {
1122 vertical-align: middle;
1123 }
1124 .input-with-label > label {
@@ -1310,32 +1311,52 @@
1311 otherwise they must be DIVs (block elements) so that nesting of
1312 block-element content is legal.
1313 */
1314 .help-buttonlet {
1315 display: inline-block;
1316 min-width: 1em;
1317 max-width: 1em;
1318 min-height: 1em;
1319 max-height: 1em;
 
 
 
 
1320 cursor: pointer;
 
 
1321 margin: 0 0 0 0.35em;
1322 background-image: /* white question mark on blue circular background */
1323 url("data:image/svg+xml;charset=UTF-8,%3csvg xmlns='http://www.w3.org/2000/svg' \
1324 viewBox='0 0 15.867574 15.867574'%3e%3ccircle cx='7.9337869' cy='7.9337869' \
1325 r='7.9337869' style='fill:%23f0f0f0;stroke-width:1' /%3e%3ccircle cx='7.9337869' \
1326 cy='7.9337869' r='6.9662519' style='fill:%23404040;stroke-width:1' /%3e%3ccircle \
1327 cx='7.9337869' cy='7.9337869' r='5.9987168' style='fill:%235080d0;stroke-width:1' \
1328 /%3e%3cpath d='M 8.7214664,9.7504179 H 6.1597329 V 9.4027037 q 0,-0.5818896 \
1329 0.234175,-1.0289511 Q 6.628083,7.9195949 7.3802819,7.2241658 L 7.8344395,6.8125852 \
1330 Q 8.2389238,6.4435822 8.4234253,6.1171563 8.6150232,5.7907304 8.6150232,5.4643045 \
1331 q 0,-0.496735 -0.3406184,-0.7734874 Q 7.9337866,4.4069686 7.323512,4.4069686 q \
1332 -0.5747934,0 -1.2418375,0.2412712 Q 5.4146304,4.8824149 4.6908164,5.3507651 \
1333 V 3.1225537 Q 5.5494585,2.8245126 6.2590798,2.6825884 6.9687013,2.5406641 \
1334 7.6286492,2.5406641 q 1.7314764,0 2.6397908,0.7096215 0.908317,0.7025253 \
1335 0.908317,2.0579022 0,0.6954289 -0.276754,1.2489339 -0.276751,0.5464084 \
1336 -0.9437957,1.1779715 L 9.5020499,8.1395775 Q 9.0195073,8.5795428 8.8704867,8.8491989 \
1337 8.7214664,9.1117588 8.7214664,9.4310884 Z M 6.1597329,10.800658 H 8.7214664 \
1338 V 13.32691 H 6.1597329 Z' style='fill:%23f8f8f8;stroke-width:1.32118618' /%3e%3c/svg%3e");
1339 background-repeat: no-repeat;
1340 background-position: center;
1341 /* When not using a background image, this additional style works
1342 reasonably well along with a ::before content of "?": */
1343 /*border-width: 1px;
1344 border-style: outset;
1345 border-radius: 0.5em;
1346 font-size: 100%;
1347 font-family: monspace;
1348 font-weight: 700;
1349 overflow: hidden;
1350 background-color: rgba(54, 54, 255,1);
1351 color: rgb(255, 255, 255);
1352 text-align: center;
1353 line-height: 1; */
1354 }
1355 /*.help-buttonlet::before {
1356 content: "?";
1357 }*/
1358 /**
1359 We really want to hide all help text via CSS but CSS cannot select
1360 TEXT nodes. Thus we move them out of the way programmatically
1361 during initialization.
1362 */
@@ -1349,6 +1370,7 @@
1370 */
1371 .fossil-tooltip.help-buttonlet-content {
1372 cursor: default;
1373 text-align: left;
1374 border-style: outset;
1375 background-color: inherit;
1376 }
1377
+40 -18
--- src/default.css
+++ src/default.css
@@ -1108,16 +1108,17 @@
11081108
we can include multiple INPUT elements (e.g. a set of radio
11091109
buttons). Note that these elements must sometimes be BLOCK elements
11101110
(e.g. DIV) so that certain nesting constructs are legal.
11111111
*/
11121112
.input-with-label {
1113
- border: 1px inset #808080;
1113
+ border: 1px inset rgba(128, 128, 128, 0.5);
11141114
border-radius: 0.25em;
1115
- padding: 0.25em 0.4em;
1115
+ padding: 0.15em 0.25em;
11161116
margin: 0 0.5em;
11171117
display: inline-block;
11181118
cursor: default;
1119
+ white-space: nowrap;
11191120
}
11201121
.input-with-label > * {
11211122
vertical-align: middle;
11221123
}
11231124
.input-with-label > label {
@@ -1310,32 +1311,52 @@
13101311
otherwise they must be DIVs (block elements) so that nesting of
13111312
block-element content is legal.
13121313
*/
13131314
.help-buttonlet {
13141315
display: inline-block;
1315
- min-width: 1rem;
1316
- max-width: 1rem;
1317
- min-height: 1rem;
1318
- max-height: 1rem;
1319
- font-size: 0.9em;
1320
- border-radius: 0.5rem;
1321
- background-color: rgba(54, 54, 255,1);
1322
- color: rgb(255, 255, 255);
1316
+ min-width: 1em;
1317
+ max-width: 1em;
1318
+ min-height: 1em;
1319
+ max-height: 1em;
13231320
cursor: pointer;
1324
- font-family: monspace;
1325
- text-align: center;
13261321
margin: 0 0 0 0.35em;
1327
- border-width: 1px;
1322
+ background-image: /* white question mark on blue circular background */
1323
+ url("data:image/svg+xml;charset=UTF-8,%3csvg xmlns='http://www.w3.org/2000/svg' \
1324
+viewBox='0 0 15.867574 15.867574'%3e%3ccircle cx='7.9337869' cy='7.9337869' \
1325
+r='7.9337869' style='fill:%23f0f0f0;stroke-width:1' /%3e%3ccircle cx='7.9337869' \
1326
+cy='7.9337869' r='6.9662519' style='fill:%23404040;stroke-width:1' /%3e%3ccircle \
1327
+cx='7.9337869' cy='7.9337869' r='5.9987168' style='fill:%235080d0;stroke-width:1' \
1328
+ /%3e%3cpath d='M 8.7214664,9.7504179 H 6.1597329 V 9.4027037 q 0,-0.5818896 \
1329
+0.234175,-1.0289511 Q 6.628083,7.9195949 7.3802819,7.2241658 L 7.8344395,6.8125852 \
1330
+Q 8.2389238,6.4435822 8.4234253,6.1171563 8.6150232,5.7907304 8.6150232,5.4643045 \
1331
+q 0,-0.496735 -0.3406184,-0.7734874 Q 7.9337866,4.4069686 7.323512,4.4069686 q \
1332
+-0.5747934,0 -1.2418375,0.2412712 Q 5.4146304,4.8824149 4.6908164,5.3507651 \
1333
+V 3.1225537 Q 5.5494585,2.8245126 6.2590798,2.6825884 6.9687013,2.5406641 \
1334
+7.6286492,2.5406641 q 1.7314764,0 2.6397908,0.7096215 0.908317,0.7025253 \
1335
+0.908317,2.0579022 0,0.6954289 -0.276754,1.2489339 -0.276751,0.5464084 \
1336
+-0.9437957,1.1779715 L 9.5020499,8.1395775 Q 9.0195073,8.5795428 8.8704867,8.8491989 \
1337
+8.7214664,9.1117588 8.7214664,9.4310884 Z M 6.1597329,10.800658 H 8.7214664 \
1338
+V 13.32691 H 6.1597329 Z' style='fill:%23f8f8f8;stroke-width:1.32118618' /%3e%3c/svg%3e");
1339
+ background-repeat: no-repeat;
1340
+ background-position: center;
1341
+ /* When not using a background image, this additional style works
1342
+ reasonably well along with a ::before content of "?": */
1343
+ /*border-width: 1px;
13281344
border-style: outset;
1345
+ border-radius: 0.5em;
1346
+ font-size: 100%;
1347
+ font-family: monspace;
13291348
font-weight: 700;
13301349
overflow: hidden;
1331
-}
1332
-
1333
-.help-buttonlet::before {
1334
- content: "?";
1350
+ background-color: rgba(54, 54, 255,1);
1351
+ color: rgb(255, 255, 255);
1352
+ text-align: center;
1353
+ line-height: 1; */
13351354
}
1336
-
1355
+/*.help-buttonlet::before {
1356
+ content: "?";
1357
+}*/
13371358
/**
13381359
We really want to hide all help text via CSS but CSS cannot select
13391360
TEXT nodes. Thus we move them out of the way programmatically
13401361
during initialization.
13411362
*/
@@ -1349,6 +1370,7 @@
13491370
*/
13501371
.fossil-tooltip.help-buttonlet-content {
13511372
cursor: default;
13521373
text-align: left;
13531374
border-style: outset;
1375
+ background-color: inherit;
13541376
}
13551377
--- src/default.css
+++ src/default.css
@@ -1108,16 +1108,17 @@
1108 we can include multiple INPUT elements (e.g. a set of radio
1109 buttons). Note that these elements must sometimes be BLOCK elements
1110 (e.g. DIV) so that certain nesting constructs are legal.
1111 */
1112 .input-with-label {
1113 border: 1px inset #808080;
1114 border-radius: 0.25em;
1115 padding: 0.25em 0.4em;
1116 margin: 0 0.5em;
1117 display: inline-block;
1118 cursor: default;
 
1119 }
1120 .input-with-label > * {
1121 vertical-align: middle;
1122 }
1123 .input-with-label > label {
@@ -1310,32 +1311,52 @@
1310 otherwise they must be DIVs (block elements) so that nesting of
1311 block-element content is legal.
1312 */
1313 .help-buttonlet {
1314 display: inline-block;
1315 min-width: 1rem;
1316 max-width: 1rem;
1317 min-height: 1rem;
1318 max-height: 1rem;
1319 font-size: 0.9em;
1320 border-radius: 0.5rem;
1321 background-color: rgba(54, 54, 255,1);
1322 color: rgb(255, 255, 255);
1323 cursor: pointer;
1324 font-family: monspace;
1325 text-align: center;
1326 margin: 0 0 0 0.35em;
1327 border-width: 1px;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1328 border-style: outset;
 
 
 
1329 font-weight: 700;
1330 overflow: hidden;
1331 }
1332
1333 .help-buttonlet::before {
1334 content: "?";
1335 }
1336
 
 
1337 /**
1338 We really want to hide all help text via CSS but CSS cannot select
1339 TEXT nodes. Thus we move them out of the way programmatically
1340 during initialization.
1341 */
@@ -1349,6 +1370,7 @@
1349 */
1350 .fossil-tooltip.help-buttonlet-content {
1351 cursor: default;
1352 text-align: left;
1353 border-style: outset;
 
1354 }
1355
--- src/default.css
+++ src/default.css
@@ -1108,16 +1108,17 @@
1108 we can include multiple INPUT elements (e.g. a set of radio
1109 buttons). Note that these elements must sometimes be BLOCK elements
1110 (e.g. DIV) so that certain nesting constructs are legal.
1111 */
1112 .input-with-label {
1113 border: 1px inset rgba(128, 128, 128, 0.5);
1114 border-radius: 0.25em;
1115 padding: 0.15em 0.25em;
1116 margin: 0 0.5em;
1117 display: inline-block;
1118 cursor: default;
1119 white-space: nowrap;
1120 }
1121 .input-with-label > * {
1122 vertical-align: middle;
1123 }
1124 .input-with-label > label {
@@ -1310,32 +1311,52 @@
1311 otherwise they must be DIVs (block elements) so that nesting of
1312 block-element content is legal.
1313 */
1314 .help-buttonlet {
1315 display: inline-block;
1316 min-width: 1em;
1317 max-width: 1em;
1318 min-height: 1em;
1319 max-height: 1em;
 
 
 
 
1320 cursor: pointer;
 
 
1321 margin: 0 0 0 0.35em;
1322 background-image: /* white question mark on blue circular background */
1323 url("data:image/svg+xml;charset=UTF-8,%3csvg xmlns='http://www.w3.org/2000/svg' \
1324 viewBox='0 0 15.867574 15.867574'%3e%3ccircle cx='7.9337869' cy='7.9337869' \
1325 r='7.9337869' style='fill:%23f0f0f0;stroke-width:1' /%3e%3ccircle cx='7.9337869' \
1326 cy='7.9337869' r='6.9662519' style='fill:%23404040;stroke-width:1' /%3e%3ccircle \
1327 cx='7.9337869' cy='7.9337869' r='5.9987168' style='fill:%235080d0;stroke-width:1' \
1328 /%3e%3cpath d='M 8.7214664,9.7504179 H 6.1597329 V 9.4027037 q 0,-0.5818896 \
1329 0.234175,-1.0289511 Q 6.628083,7.9195949 7.3802819,7.2241658 L 7.8344395,6.8125852 \
1330 Q 8.2389238,6.4435822 8.4234253,6.1171563 8.6150232,5.7907304 8.6150232,5.4643045 \
1331 q 0,-0.496735 -0.3406184,-0.7734874 Q 7.9337866,4.4069686 7.323512,4.4069686 q \
1332 -0.5747934,0 -1.2418375,0.2412712 Q 5.4146304,4.8824149 4.6908164,5.3507651 \
1333 V 3.1225537 Q 5.5494585,2.8245126 6.2590798,2.6825884 6.9687013,2.5406641 \
1334 7.6286492,2.5406641 q 1.7314764,0 2.6397908,0.7096215 0.908317,0.7025253 \
1335 0.908317,2.0579022 0,0.6954289 -0.276754,1.2489339 -0.276751,0.5464084 \
1336 -0.9437957,1.1779715 L 9.5020499,8.1395775 Q 9.0195073,8.5795428 8.8704867,8.8491989 \
1337 8.7214664,9.1117588 8.7214664,9.4310884 Z M 6.1597329,10.800658 H 8.7214664 \
1338 V 13.32691 H 6.1597329 Z' style='fill:%23f8f8f8;stroke-width:1.32118618' /%3e%3c/svg%3e");
1339 background-repeat: no-repeat;
1340 background-position: center;
1341 /* When not using a background image, this additional style works
1342 reasonably well along with a ::before content of "?": */
1343 /*border-width: 1px;
1344 border-style: outset;
1345 border-radius: 0.5em;
1346 font-size: 100%;
1347 font-family: monspace;
1348 font-weight: 700;
1349 overflow: hidden;
1350 background-color: rgba(54, 54, 255,1);
1351 color: rgb(255, 255, 255);
1352 text-align: center;
1353 line-height: 1; */
1354 }
1355 /*.help-buttonlet::before {
1356 content: "?";
1357 }*/
1358 /**
1359 We really want to hide all help text via CSS but CSS cannot select
1360 TEXT nodes. Thus we move them out of the way programmatically
1361 during initialization.
1362 */
@@ -1349,6 +1370,7 @@
1370 */
1371 .fossil-tooltip.help-buttonlet-content {
1372 cursor: default;
1373 text-align: left;
1374 border-style: outset;
1375 background-color: inherit;
1376 }
1377
+21 -12
--- src/fossil.dom.js
+++ src/fossil.dom.js
@@ -400,26 +400,35 @@
400400
};
401401
dom.replaceNode.counter = 0;
402402
/**
403403
Two args == getter: (e,key), returns value
404404
405
- Three == setter: (e,key,val), returns e. If val===null
406
- or val===undefined then the attribute is removed. If (e)
407
- has a forEach method then this routine is applied to each
408
- element of that collection via that method.
405
+ Three or more == setter: (e,key,val[...,keyN,valN]), returns
406
+ e. If val===null or val===undefined then the attribute is
407
+ removed. If (e) has a forEach method then this routine is applied
408
+ to each element of that collection via that method. Each pair of
409
+ keys/values is applied to all elements designated by the first
410
+ argument.
409411
*/
410412
dom.attr = function f(e){
411413
if(2===arguments.length) return e.getAttribute(arguments[1]);
412
- if(e.forEach){
413
- e.forEach((x)=>f(x,arguments[1],arguments[2]));
414
+ const a = argsToArray(arguments);
415
+ if(e.forEach){ /* Apply to all elements in the collection */
416
+ e.forEach(function(x){
417
+ a[0] = x;
418
+ f.apply(f,a);
419
+ });
414420
return e;
415
- }
416
- const key = arguments[1], val = arguments[2];
417
- if(null===val || undefined===val){
418
- e.removeAttribute(key);
419
- }else{
420
- e.setAttribute(key,val);
421
+ }
422
+ a.shift(/*element(s)*/);
423
+ while(a.length){
424
+ const key = a.shift(), val = a.shift();
425
+ if(null===val || undefined===val){
426
+ e.removeAttribute(key);
427
+ }else{
428
+ e.setAttribute(key,val);
429
+ }
421430
}
422431
return e;
423432
};
424433
425434
const enableDisable = function f(enable){
426435
--- src/fossil.dom.js
+++ src/fossil.dom.js
@@ -400,26 +400,35 @@
400 };
401 dom.replaceNode.counter = 0;
402 /**
403 Two args == getter: (e,key), returns value
404
405 Three == setter: (e,key,val), returns e. If val===null
406 or val===undefined then the attribute is removed. If (e)
407 has a forEach method then this routine is applied to each
408 element of that collection via that method.
 
 
409 */
410 dom.attr = function f(e){
411 if(2===arguments.length) return e.getAttribute(arguments[1]);
412 if(e.forEach){
413 e.forEach((x)=>f(x,arguments[1],arguments[2]));
 
 
 
 
414 return e;
415 }
416 const key = arguments[1], val = arguments[2];
417 if(null===val || undefined===val){
418 e.removeAttribute(key);
419 }else{
420 e.setAttribute(key,val);
 
 
 
421 }
422 return e;
423 };
424
425 const enableDisable = function f(enable){
426
--- src/fossil.dom.js
+++ src/fossil.dom.js
@@ -400,26 +400,35 @@
400 };
401 dom.replaceNode.counter = 0;
402 /**
403 Two args == getter: (e,key), returns value
404
405 Three or more == setter: (e,key,val[...,keyN,valN]), returns
406 e. If val===null or val===undefined then the attribute is
407 removed. If (e) has a forEach method then this routine is applied
408 to each element of that collection via that method. Each pair of
409 keys/values is applied to all elements designated by the first
410 argument.
411 */
412 dom.attr = function f(e){
413 if(2===arguments.length) return e.getAttribute(arguments[1]);
414 const a = argsToArray(arguments);
415 if(e.forEach){ /* Apply to all elements in the collection */
416 e.forEach(function(x){
417 a[0] = x;
418 f.apply(f,a);
419 });
420 return e;
421 }
422 a.shift(/*element(s)*/);
423 while(a.length){
424 const key = a.shift(), val = a.shift();
425 if(null===val || undefined===val){
426 e.removeAttribute(key);
427 }else{
428 e.setAttribute(key,val);
429 }
430 }
431 return e;
432 };
433
434 const enableDisable = function f(enable){
435
--- src/fossil.page.fileedit.js
+++ src/fossil.page.fileedit.js
@@ -687,18 +687,11 @@
687687
}else{
688688
P.e.taComment = P.e.taCommentSmall;
689689
D.addClass(P.e.taCommentBig, 'hidden');
690690
}
691691
D.removeClass(P.e.taComment, 'hidden');
692
- P.tabs.e.container.insertBefore(
693
- /* Move the status bar between the tab buttons and
694
- tab panels. Seems to be the best fit in terms of
695
- functionality and visibility. */
696
- E('#fossil-status-bar'), P.tabs.e.tabs
697
- );
698
- P.tabs.e.container.insertBefore(P.e.editStatus, P.tabs.e.tabs);
699
-
692
+ P.tabs.addCustomWidget( E('#fossil-status-bar') ).addCustomWidget(P.e.editStatus);
700693
P.tabs.addEventListener(
701694
/* Set up auto-refresh of the preview tab... */
702695
'before-switch-to', function(ev){
703696
if(ev.detail===P.e.tabs.preview){
704697
P.baseHrefForFile();
705698
706699
ADDED src/fossil.page.wikiedit-wysiwyg-legacy.js
--- src/fossil.page.fileedit.js
+++ src/fossil.page.fileedit.js
@@ -687,18 +687,11 @@
687 }else{
688 P.e.taComment = P.e.taCommentSmall;
689 D.addClass(P.e.taCommentBig, 'hidden');
690 }
691 D.removeClass(P.e.taComment, 'hidden');
692 P.tabs.e.container.insertBefore(
693 /* Move the status bar between the tab buttons and
694 tab panels. Seems to be the best fit in terms of
695 functionality and visibility. */
696 E('#fossil-status-bar'), P.tabs.e.tabs
697 );
698 P.tabs.e.container.insertBefore(P.e.editStatus, P.tabs.e.tabs);
699
700 P.tabs.addEventListener(
701 /* Set up auto-refresh of the preview tab... */
702 'before-switch-to', function(ev){
703 if(ev.detail===P.e.tabs.preview){
704 P.baseHrefForFile();
705
706 DDED src/fossil.page.wikiedit-wysiwyg-legacy.js
--- src/fossil.page.fileedit.js
+++ src/fossil.page.fileedit.js
@@ -687,18 +687,11 @@
687 }else{
688 P.e.taComment = P.e.taCommentSmall;
689 D.addClass(P.e.taCommentBig, 'hidden');
690 }
691 D.removeClass(P.e.taComment, 'hidden');
692 P.tabs.addCustomWidget( E('#fossil-status-bar') ).addCustomWidget(P.e.editStatus);
 
 
 
 
 
 
 
693 P.tabs.addEventListener(
694 /* Set up auto-refresh of the preview tab... */
695 'before-switch-to', function(ev){
696 if(ev.detail===P.e.tabs.preview){
697 P.baseHrefForFile();
698
699 DDED src/fossil.page.wikiedit-wysiwyg-legacy.js
--- a/src/fossil.page.wikiedit-wysiwyg-legacy.js
+++ b/src/fossil.page.wikiedit-wysiwyg-legacy.js
@@ -0,0 +1,438 @@
1
+/**
2
+ A slight adaptation of fossil's legacy wysiwyg wiki editor which
3
+ makes it usable with the newer editor's edit widget replacement
4
+ API.
5
+
6
+ Requires: window.fossil, fossil.dom, and that the current page is
7
+ /wikiedit. If called from another page it returns without effect.
8
+ditor-widget-swapping API.
9
+*/
10
+(function(F/*fossil object*/){
11
+ 'use strict';
12
+ if(!F || !F.page || F.page.name!=='wikiedit') return;
13
+
14
+ const D = F.dom;
15
+
16
+ ////////////////////////////////////////////////////////////////////////
17
+ // Install an app-specific stylesheet...
18
+ (function(){
19
+ const head = document.head || document.querySelector('head'),
20
+ styleTag = document.createElement('style'),
21
+ styleCSS = `
22
+.intLink { cursor: pointer; }
23
+img.intLink { border: 0; }
24
+#wysiwyg-container {
25
+ display: flex;
26
+ flex-direction: column;
27
+ max-width: 100% /* w/o this, toolbars don't wrap properly! */
28
+}
29
+#wysiwygBox {
30
+ border: 1px solid rgba(127,127,127,0.3);
31
+ border-radius: 0.25em;
32
+ padding: 0.25em 1em;
33
+ margin: 0;
34
+ overflow: auto;
35
+ min-height: 20em;
36
+ resize: vertical;
37
+}
38
+#wysiwygEditMode { /* wrapper for radio buttons */
39
+ border: 1px solid rgba(127,127,127,0.3);
40
+ border-radius: 0.25em;
41
+ padding: 0 0.35em 0 0.35em
42
+}
43
+#wysiwygEditMode > * {
44
+ vertical-align: text-top;
45
+}
46
+#wysiwygEditMode label { cursor: pointer; }
47
+#wysiwyg-toolbars {
48
+ margin: 0 0 0.25em 0;
49
+ display: flex;
50
+ flex-wrap: wrap;
51
+ flex-direction: column;
52
+ align-items: flex-start;
53
+}
54
+#wysiwyg-toolbars > * {
55
+ margin: 0 0.5em 0.25em 0;
56
+}
57
+#wysiwyg-toolBar1, #wysiwyg-toolBar2 {
58
+ margin: 0 0.2em 0.2em 0;
59
+ display: flex;
60
+ flex-flow: row wrap;
61
+}
62
+#wysiwyg-toolBar1 > * { /* formatting buttons */
63
+ vertical-align: middle;
64
+ margin: 0 0.25em 0.25em 0;
65
+}
66
+#wysiwyg-toolBar2 > * { /* icons */
67
+ border: 1px solid rgba(127,127,127,0.3);
68
+ vertical-align: baseline;
69
+ ma/* Adapted from https://st
70
+ styleTag.type = 'text/css';
71
+ D.append(styleTag, styleCSS);
72
+ })();
73
+
74
+ const outerContainer = D.attr(D.div(), 'id', 'wysiwyg-container'),
75
+ toolbars = D.attr(D.div(), 'id', 'wysiwyg-toolbars'),
76
+ toolbar1 = D.attr(D.div(), 'id', 'wysiwyg-toolBar1'),
77
+ // ^^^ formatting options
78
+ toolbar2 = D.attr(D.div(), 'id', 'wysiwyg-toolBar2')
79
+ // ^^^^ action icon buttons
80
+ ;
81
+ D.append(outerContainer, D.append(toolbars, toolbar1, toolbar2));
82
+
83
+ /** Returns a function which simplifies adding a list of options
84
+ to the given select element. See below for example usage. */
85
+ const addOptions = function(select){
86
+ return function ff(value, label){
87
+ D.option(select, value, label || value);
88
+ return ff;
89
+ };
90
+ };
91
+
92
+ ////////////////////////////////////////////////////////////////////////
93
+ // Edit mode selection (radio buttons).
94
+ const radio0 =
95
+ D.attr(
96
+ D.input('radio'),
97
+ 'name','wysiwyg-mode',
98
+ 'id', 'wysiwyg-mode-0',
99
+ 'value',0,
100
+ 'checked',true),
101
+ radio1 = D.attr(
102
+ D.input('radio'),
103
+ 'id','wysiwyg-mode-1',
104
+ 'name','wysiwyg-mode',
105
+ 'value',1),
106
+ radios = D.append(
107
+ D.attr(D.span(), 'id', 'wysiwygEditMode'),
108
+ radio0, D.append(
109
+ D.attr(D.label(), 'for', 'wysiwyg-mode-0'),
110
+ "WYSIWYG"
111
+ ),
112
+ radio1, D.append(
113
+ D.attr(D.label(), 'for', 'wysiwyg-mode-1'),
114
+ "Raw HTML"
115
+ )
116
+ );
117
+ D.append(toolbar1, radios);
118
+ const radioHandler = function(){setDocMode(+this.value)};
119
+ radio0.addEventListener('change',radioHandler, false);
120
+ radio1.addEventListener('change',radioHandler, false);
121
+
122
+
123
+ ////////////////////////////////////////////////////////////////////////
124
+ // Text formatting options...
125
+ var select;
126
+ select = D.addClass(D.select(), 'format');
127
+ select.dataset.format = "formatblock";
128
+ D.append(toolbar1, select);
129
+ addOptions(select)(
130
+ '', '- formatting -')(
131
+ "h1", "Title 1 <h1>")(
132
+ "h2", "Title 2 <h2>")(
133
+ "h3", "Title 3 <h3>")(
134
+ "h4", "Title 4 <h4>")(
135
+ "h5", "Title 5 <h5>")(
136
+ "h6", "Subtitle <h6>")(
137
+ "p", "Paragraph <p>")(
138
+ "pre", "Preformatted <pre>");
139
+
140
+ select = D.addClass(D.select(), 'format');
141
+ select.dataset.format = "fontname";
142
+ D.append(toolbar1, select);
143
+ D.addClass(
144
+ D.option(select, '', '- font -'),
145
+ "heading"
146
+ );
147
+ addOptions(select)(
148
+ 'Arial')(
149
+ 'Arial Black')(
150
+ 'Courier New')(
151
+ 'Times New Roman');
152
+
153
+ select = D.addClass(D.select(), 'format');
154
+ D.append(toolbar1, select);
155
+ select.dataset.format = "fontsize";
156
+ D.addClass(
157
+ D.option(select, '', '- size -'),
158
+ "heading"
159
+ );
160
+ addOptions(select)(
161
+ "1", "Very small")(
162
+ "2", "A bit small")(
163
+ "3", "Normal")(
164
+ "4", "Medium-large")(
165
+ "5", "Big")(
166
+ "6", "Very big")(
167
+ "7", "Maximum");
168
+
169
+ select = D.addClass(D.select(), 'format');
170
+ D.append(toolbar1, select);
171
+ select.dataset.format = 'forecolor';
172
+ D.addClass(
173
+ D.option(select, '', '- color -'),
174
+ "heading"
175
+ );
176
+ addOptions(select)(
177
+ "red", "Red")(
178
+ "blue", "Blue")(
179
+ "green", "Green")(
180
+ "black", "Black")(
181
+ "grey", "Grey")(
182
+ "yellow", "Yellow")(
183
+ "cyan", "Cyan")(
184
+ "magenta", "Magenta");
185
+
186
+
187
+ ////////////////////////////////////////////////////////////////////////
188
+ // Icon-based toolbar...
189
+ /**
190
+ Inject the icons...
191
+
192
+ mkbuiltins strips anything which looks like a C++-style comment,
193
+ even if it's in a string literal, and thus the runs of "/"
194
+ characters in the DOM element data attributes have been mangled
195
+ to work around that: we simply use \x2f for every 2nd slash.
196
+ */
197
+ (function f(title,format,src){
198
+ const img = D.img();
199
+ D.append(toolbar2, img);
200
+ D.addClass(img, 'intLink');
201
+ D.attr(img, 'title', title);
202
+ img.dataset.format = format;
203
+ D.attr(img, 'src', 'string'===typeof src ? src : src.join(''));
204
+ return f;
205
+ })(
206
+ 'Undo', 'undo',
207
+ ["data:image/gif;base64,R0lGODlhFgAWAOMKADljwliE33mOrpGjuYKl8aezxqPD+7",
208
+ "/I19DV3NHa7P/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f",
209
+ "/\x2f/\x2f/\x2f/yH5BAEKAA8ALAAAAAAWABYAAARR8MlJq704680",
210
+ "7TkaYeJJBnES4EeUJvIGapWYAC0CsocQ7SDlWJkAkCA6ToMYWIARGQF3mRQVIEjkkSVLIbSfE",
211
+ "whdRIH4fh/DZMICe3/C4nBQBADs="]
212
+ )(
213
+ 'Redo','redo',
214
+ ["data:image/gif;base64,R0lGODlhFgAWAMIHAB1ChDljwl9vj1iE34Kl8aPD+7/I1/",
215
+ "/\x2f/yH5BAEKAAcALAAAAAAWABYAAANKeLrc/jDKSesyphi7SiEgsVXZEATDICqBVJjpqWZt9Na",
216
+ "EDNbQK1wCQsxlYnxMAImhyDoFAElJasRRvAZVRqqQXUy7Cgx4TC6bswkAOw=="]
217
+ )(
218
+ "Remove formatting",
219
+ "removeFormat",
220
+ ["data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AA",
221
+ "AABGdBTUEAALGPC/xhBQAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAAOxAAADsQBlSsOGwA",
222
+ "AAAd0SU1FB9oECQMCKPI8CIIAAAAIdEVYdENvbW1lbnQA9syWvwAAAuhJREFUOMtjYBgFxAB5",
223
+ "01ZWBvVaL2nHnlmk6mXCJbF69zU+Hz/9fB5O1lx+bg45qhl8/fYr5it3XrP/YWTUvvvk3VeqG",
224
+ "Xz70TvbJy8+Wv39+2/Hz19/mGwjZzuTYjALuoBv9jImaXHeyD3H7kU8fPj2ICML8z92dlbtMz",
225
+ "deiG3fco7J08foH1kurkm3E9iw54YvKwuTuom+LPt/BgbWf3/\x2fsf37/1/c02cCG1lB8f/\x2ff95",
226
+ "DZx74MTMzshhoSm6szrQ/a6Ir/Z2RkfEjBxuLYFpDiDi6Af/\x2f/2ckaHBp7+7wmavP5n76+P2C",
227
+ "lrLIYl8H9W36auJCbCxM4szMTJac7Kza/\x2f/\x2fR3H1w2cfWAgafPbqs5g7D95++/P1B4+ECK8tA",
228
+ "wMDw/1H7159+/7r7ZcvPz4fOHbzEwMDwx8GBgaGnNatfHZx8zqrJ+4VJBh5CQEGOySEua/v3n",
229
+ "7hXmqI8WUGBgYGL3vVG7fuPK3i5GD9/fja7ZsMDAzMG/Ze52mZeSj4yu1XEq/ff7W5dvfVAS1",
230
+ "lsXc4Db7z8C3r8p7Qjf/\x2f/2dnZGxlqJuyr3rPqQd/Hhyu7oSpYWScylDQsd3kzvnH738wMDzj",
231
+ "5GBN1VIWW4c3KDon7VOvm7S3paB9u5qsU5/x5KUnlY+eexQbkLNsErK61+++VnAJcfkyMTIwf",
232
+ "fj0QwZbJDKjcETs1Y8evyd48toz8y/ffzv/\x2fvPP4veffxpX77z6l5JewHPu8MqTDAwMDLzyrj",
233
+ "b/mZm0JcT5Lj+89+Ybm6zz95oMh7s4XbygN3Sluq4Mj5K8iKMgP4f0/\x2f/\x2ffv77/\x2f8nLy+7MCc",
234
+ "XmyYDAwODS9jM9tcvPypd35pne3ljdjvj26+H2dhYpuENikgfvQeXNmSl3tqepxXsqhXPyc66",
235
+ "6s+fv1fMdKR3TK72zpix8nTc7bdfhfkEeVbC9KhbK/9iYWHiErbu6MWbY/7/\x2f8/4/\x2f9/pgOnH",
236
+ "6jGVazvFDRtq2VgiBIZrUTIBgCk+ivHvuEKwAAAAABJRU5ErkJggg=="]
237
+ )(
238
+ "Bold",
239
+ "bold",
240
+ ["data:image/gif;base64,R0lGODlhFgAWAID/AMDAwAAAACH5BAEAAAAALAAAAAAWAB",
241
+ "YAQAInhI+pa+H9mJy0LhdgtrxzDG5WGFVk6aXqyk6Y9kXvKKNuLbb6zgMFADs="]
242
+ )(
243
+ "Italic",
244
+ "italic",
245
+ ["data:image/gif;base64,R0lGODlhFgAWAKEDAAAAAF9vj5WIbf/\x2f/yH5BAEAAAMALA",
246
+ "AAAAAWABYAAAIjnI+py+0Po5x0gXvruEKHrF2BB1YiCWgbMFIYpsbyTNd2UwAAOw=="]
247
+ )(
248
+ "Underline",
249
+ "underline",
250
+ ["data:image/gif;base64,R0lGODlhFgAWAKECAAAAAF9vj/\x2f/\x2f/\x2f/\x2fyH5BAEAAAIALA",
251
+ "AAAAAWABYAAAIrlI+py+0Po5zUgAsEzvEeL4Ea15EiJJ5PSqJmuwKBEKgxVuXWtun+DwxCCgA",
252
+ "7"]
253
+ )(
254
+ "Left align",
255
+ "justifyleft",
256
+ ["data:image/gif;base64,R0lGODlhFgAWAID/AMDAwAAAACH5BAEAAAAALAAAAAAWAB",
257
+ "YAQAIghI+py+0Po5y02ouz3jL4D4JMGELkGYxo+qzl4nKyXAAAOw=="]
258
+ )(
259
+ "Center align",
260
+ "justifycenter",
261
+ ["data:image/gif;base64,R0lGODlhFgAWAID/AMDAwAAAACH5BAEAAAAALAAAAAAWAB",
262
+ "YAQAIfhI+py+0Po5y02ouz3jL4D4JOGI7kaZ5Bqn4sycVbAQA7"]
263
+ )(
264
+ "Right align",
265
+ "justifyright",
266
+ ["data:image/gif;base64,R0lGODlhFgAWAID/AMDAwAAAACH5BAEAAAAALAAAAAAWAB",
267
+ "YAQAIghI+py+0Po5y02ouz3jL4D4JQGDLkGYxouqzl43JyVgAAOw=="]
268
+ )(
269
+ "Numbered list",
270
+ "insertorderedlist",
271
+ ["data:image/gif;base64,R0lGODlhFgAWAMIGAAAAADljwliE35GjuaezxtHa7P/\x2f/\x2f",
272
+ "/\x2f/yH5BAEAAAcALAAAAAAWABYAAAM2eLrc/jDKSespwjoRFvggCBUBoTFBeq6QIAysQnRHaEO",
273
+ "zyaZ07Lu9lUBnC0UGQU1K52s6n5oEADs="]
274
+ )(
275
+ "Dotted list",
276
+ "insertunorderedlist",
277
+ ["data:image/gif;base64,R0lGODlhFgAWAMIGAAAAAB1ChF9vj1iE33mOrqezxv/\x2f/\x2f",
278
+ "/\x2f/yH5BAEAAAcALAAAAAAWABYAAAMyeLrc/jDKSesppNhGRlBAKIZRERBbqm6YtnbfMY7lud6",
279
+ "4UwiuKnigGQliQuWOyKQykgAAOw=="]
280
+ )(
281
+ "Quote",
282
+ "formatblock",
283
+ ["data:image/gif;base64,R0lGODlhFgAWAIQXAC1NqjFRjkBgmT9nqUJnsk9xrFJ7u2",
284
+ "R9qmKBt1iGzHmOrm6Sz4OXw3Odz4Cl2ZSnw6KxyqO306K63bG70bTB0rDI3bvI4P",
285
+ "/\x2f/\x2f/\x2f/\x2f/",
286
+ "/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f",
287
+ "/\x2f/\x2f/\x2fyH5BAEKAB8ALAAAAAAWABYAAAVP4CeOZGmeaKqubEs2Cekk",
288
+ "ErvEI1zZuOgYFlakECEZFi0GgTGKEBATFmJAVXweVOoKEQgABB9IQDCmrLpjETrQQlhHjINrT",
289
+ "q/b7/i8fp8PAQA7"]
290
+ )(
291
+ "Delete indentation",
292
+ "outdent",
293
+ ["data:image/gif;base64,R0lGODlhFgAWAMIHAAAAADljwliE35GjuaezxtDV3NHa7P",
294
+ "/\x2f/yH5BAEAAAcALAAAAAAWABYAAAM2eLrc/jDKCQG9F2i7u8agQgyK1z2EIBil+TWqEMxhMcz",
295
+ "sYVJ3e4ahk+sFnAgtxSQDqWw6n5cEADs="]
296
+ )(
297
+ "Add indentation",
298
+ "indent",
299
+ ["data:image/gif;base64,R0lGODlhFgAWAOMIAAAAADljwl9vj1iE35GjuaezxtDV3N",
300
+ "Ha7P/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f",
301
+ "/\x2f/\x2f/yH5BAEAAAgALAAAAAAWABYAAAQ7EMlJq704650",
302
+ "B/x8gemMpgugwHJNZXodKsO5oqUOgo5KhBwWESyMQsCRDHu9VOyk5TM9zSpFSr9gsJwIAOw=="
303
+ ]
304
+ )(
305
+ "Hyperlink",
306
+ "createlink",
307
+ ["data:image/gif;base64,R0lGODlhFgAWAOMKAB1ChDRLY19vj3mOrpGjuaezxrCztb",
308
+ "/I19Ha7Pv8/f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f",
309
+ "/yH5BAEKAA8ALAAAAAAWABYAAARY8MlJq704682",
310
+ "7/2BYIQVhHg9pEgVGIklyDEUBy/RlE4FQF4dCj2AQXAiJQDCWQCAEBwIioEMQBgSAFhDAGghG",
311
+ "i9XgHAhMNoSZgJkJei33UESv2+/4vD4TAQA7"]
312
+ )(
313
+ "Cut",
314
+ "cut",
315
+ ["data:image/gif;base64,R0lGODlhFgAWAIQSAB1ChBFNsRJTySJYwjljwkxwl19vj1",
316
+ "dusYODhl6MnHmOrpqbmpGjuaezxrCztcDCxL/I18rL1P/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f",
317
+ "/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/",
318
+ "/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f",
319
+ "yH5BAEAAB8ALAAAAAAWABYAAAVu4CeOZGmeaKqubDs6TNnE",
320
+ "bGNApNG0kbGMi5trwcA9GArXh+FAfBAw5UexUDAQESkRsfhJPwaH4YsEGAAJGisRGAQY7UCC9",
321
+ "ZAXBB+74LGCRxIEHwAHdWooDgGJcwpxDisQBQRjIgkDCVlfmZqbmiEAOw=="]
322
+ )(
323
+ "Copy",
324
+ "copy",
325
+ ["data:image/gif;base64,R0lGODlhFgAWAIQcAB1ChBFNsTRLYyJYwjljwl9vj1iE31",
326
+ "iGzF6MnHWX9HOdz5GjuYCl2YKl8ZOt4qezxqK63aK/9KPD+7DI3b/I17LM/MrL1MLY9NHa7OP",
327
+ "s++bx/Pv8/f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f",
328
+ "/yH5BAEAAB8ALAAAAAAWABYAAAWG4CeOZGmeaKqubOum1SQ/",
329
+ "kPVOW749BeVSus2CgrCxHptLBbOQxCSNCCaF1GUqwQbBd0JGJAyGJJiobE+LnCaDcXAaEoxhQ",
330
+ "ACgNw0FQx9kP+wmaRgYFBQNeAoGihCAJQsCkJAKOhgXEw8BLQYciooHf5o7EA+kC40qBKkAAA",
331
+ "Grpy+wsbKzIiEAOw=="]
332
+ )(
333
+ /* Paste, when activated via JS, has no effect in some (maybe all)
334
+ environments. Activated externally, e.g. keyboard, it works. */
335
+ "Paste (does not work in all environments)",
336
+ "paste",
337
+ ["data:image/gif;base64,R0lGODlhFgAWAIQUAD04KTRLY2tXQF9vj414WZWIbXmOrp",
338
+ "qbmpGjudClFaezxsa0cb/I1+3YitHa7PrkIPHvbuPs+/fvrvv8/f/\x2f/\x2f/\x2f",
339
+ "/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/",
340
+ "/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f",
341
+ "yH5BAEAAB8ALAAAAAAWABYAAAWN4CeOZGmeaKqubGsusPvB",
342
+ "SyFJjVDs6nJLB0khR4AkBCmfsCGBQAoCwjF5gwquVykSFbwZE+AwIBV0GhFog2EwIDchjwRiQ",
343
+ "o9E2Fx4XD5R+B0DDAEnBXBhBhN2DgwDAQFjJYVhCQYRfgoIDGiQJAWTCQMRiwwMfgicnVcAAA",
344
+ "MOaK+bLAOrtLUyt7i5uiUhADs="]
345
+ );
346
+
347
+ ////////////////////////////////////////////////////////////////////////
348
+ // The main editor area...
349
+ const oDoc = D.attr(D.div(), 'id', "wysiwygBox");
350
+ D.attr(oDoc, 'contenteditable', 'true');
351
+ D.append(outerContainer, oDoc);
352
+
353
+ /* Initialize the document editor */
354
+ function initDoc() {
355
+ initEventHandlers();
356
+ if (!isWysiwyg()) { setDocMode(true); }
357
+ }
358
+
359
+ function initEventHandlers() {
360
+ //console.debug("initEventHandlers()");
361
+ const handleDropDown = function() {
362
+ formatDoc(this.dataset.format,this[this.selectedIndex].value);
363
+ this.selectedIndex = 0;
364
+ };
365
+
366
+ const handleFormatButton = function() {
367
+ var extra;
368
+ switch (this.dataset.format) {
369
+ case 'createlink':
370
+ const sLnk = prompt('Target URL:','');
371
+ if(sLnk) extra = sLnk;
372
+ break;
373
+ case 'formatblock':
374
+ extra = 'blockquote';
375
+ break;
376
+ }
377
+ formatDoc(this.dataset.format, extra);
378
+ };
379
+
380
+ var i, controls = outerContainer.querySelectorAll('select.format');
381
+ for(i = 0; i < controls.length; i++) {
382
+ controls[i].addEventListener('change', handleDropDown, false);;
383
+ }
384
+ controls = outerContainer.querySelectorAll('.intLink');
385
+ for(i = 0; i < controls.length; i++) {
386
+ controls[i].addEventListener('click', handleFormatButton, false);
387
+ }
388
+ }
389
+
390
+ /* Return true if the document editor is in WYSIWYG mode. Return
391
+ ** false if it is in Markup mode */
392
+ function isWysiwyg() {
393
+ return radio0.checked;
394
+ }
395
+
396
+ /* Run the editing command if in WYSIWYG mode */
397
+ function formatDoc(sCmd, sValue) {
398
+ ioDoc.innerHTML = content){
399
+ try {
400
+ // First, try the W3C draft standard way, which has
401
+ // been working on all non-IE browsers for a while.
402
+ // It is also supported by IE11 and higher.
403
+ document.execCommand("styleWithCSS", false, false);
404
+ } catch (e) {
405
+ try {
406
+ // For IE9 or IE10, this should work.
407
+ document.execCommand("useCSS", 0, true);
408
+ } catch (e) {
409
+ // OK, that apparently did not work, do nothing.
410
+ }
411
+ }
412
+ document.execCommand(sCmd, false, sValue);
413
+ oDoc.focus();
414
+ }
415
+ }
416
+
417
+ /* Change the editing mode. Convert to markup if the argument
418
+ ** is true and wysiwyg if the argument is false. */
419
+ function setDocMode(bToMarkup, content) {
420
+ if(undefined===content){
421
+ content = bToMarkup ? oDoc.innerHTML : oDoc.innerText;
422
+ }
423
+ if(!setDocMode.linebreak){
424
+ setDocMode.linebreak = new RegExp("</p><p>","ig");
425
+ }
426
+ if(!setDocMode.toHide){
427
+ setDocMode.toHide = toolbars.querySelectorAll(
428
+ '#wysiwyg-toolBar1 > *:not(#wysiwygEditMode), '
429
+ +'#wysiwyg-toolBar2');
430
+ }
431
+ if (bToMarkup) {
432
+ /* WYSIWYG -> Markup */
433
+ // Legacy did this: content=content.replace(setDocMode.linebreak,"</p>\n\n<p>")
434
+ D.append(D.clearElement(oDoc), content)
435
+ oDoc.style.whInvoke this routine prior to submitting the HTML content back
436
+ ** to the server */
437
+ /*functio /* Return true if th=="pre-wrap"){setDocMode(0);}
438
+ document.getElementById("wysiwygValue").
--- a/src/fossil.page.wikiedit-wysiwyg-legacy.js
+++ b/src/fossil.page.wikiedit-wysiwyg-legacy.js
@@ -0,0 +1,438 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
--- a/src/fossil.page.wikiedit-wysiwyg-legacy.js
+++ b/src/fossil.page.wikiedit-wysiwyg-legacy.js
@@ -0,0 +1,438 @@
1 /**
2 A slight adaptation of fossil's legacy wysiwyg wiki editor which
3 makes it usable with the newer editor's edit widget replacement
4 API.
5
6 Requires: window.fossil, fossil.dom, and that the current page is
7 /wikiedit. If called from another page it returns without effect.
8 ditor-widget-swapping API.
9 */
10 (function(F/*fossil object*/){
11 'use strict';
12 if(!F || !F.page || F.page.name!=='wikiedit') return;
13
14 const D = F.dom;
15
16 ////////////////////////////////////////////////////////////////////////
17 // Install an app-specific stylesheet...
18 (function(){
19 const head = document.head || document.querySelector('head'),
20 styleTag = document.createElement('style'),
21 styleCSS = `
22 .intLink { cursor: pointer; }
23 img.intLink { border: 0; }
24 #wysiwyg-container {
25 display: flex;
26 flex-direction: column;
27 max-width: 100% /* w/o this, toolbars don't wrap properly! */
28 }
29 #wysiwygBox {
30 border: 1px solid rgba(127,127,127,0.3);
31 border-radius: 0.25em;
32 padding: 0.25em 1em;
33 margin: 0;
34 overflow: auto;
35 min-height: 20em;
36 resize: vertical;
37 }
38 #wysiwygEditMode { /* wrapper for radio buttons */
39 border: 1px solid rgba(127,127,127,0.3);
40 border-radius: 0.25em;
41 padding: 0 0.35em 0 0.35em
42 }
43 #wysiwygEditMode > * {
44 vertical-align: text-top;
45 }
46 #wysiwygEditMode label { cursor: pointer; }
47 #wysiwyg-toolbars {
48 margin: 0 0 0.25em 0;
49 display: flex;
50 flex-wrap: wrap;
51 flex-direction: column;
52 align-items: flex-start;
53 }
54 #wysiwyg-toolbars > * {
55 margin: 0 0.5em 0.25em 0;
56 }
57 #wysiwyg-toolBar1, #wysiwyg-toolBar2 {
58 margin: 0 0.2em 0.2em 0;
59 display: flex;
60 flex-flow: row wrap;
61 }
62 #wysiwyg-toolBar1 > * { /* formatting buttons */
63 vertical-align: middle;
64 margin: 0 0.25em 0.25em 0;
65 }
66 #wysiwyg-toolBar2 > * { /* icons */
67 border: 1px solid rgba(127,127,127,0.3);
68 vertical-align: baseline;
69 ma/* Adapted from https://st
70 styleTag.type = 'text/css';
71 D.append(styleTag, styleCSS);
72 })();
73
74 const outerContainer = D.attr(D.div(), 'id', 'wysiwyg-container'),
75 toolbars = D.attr(D.div(), 'id', 'wysiwyg-toolbars'),
76 toolbar1 = D.attr(D.div(), 'id', 'wysiwyg-toolBar1'),
77 // ^^^ formatting options
78 toolbar2 = D.attr(D.div(), 'id', 'wysiwyg-toolBar2')
79 // ^^^^ action icon buttons
80 ;
81 D.append(outerContainer, D.append(toolbars, toolbar1, toolbar2));
82
83 /** Returns a function which simplifies adding a list of options
84 to the given select element. See below for example usage. */
85 const addOptions = function(select){
86 return function ff(value, label){
87 D.option(select, value, label || value);
88 return ff;
89 };
90 };
91
92 ////////////////////////////////////////////////////////////////////////
93 // Edit mode selection (radio buttons).
94 const radio0 =
95 D.attr(
96 D.input('radio'),
97 'name','wysiwyg-mode',
98 'id', 'wysiwyg-mode-0',
99 'value',0,
100 'checked',true),
101 radio1 = D.attr(
102 D.input('radio'),
103 'id','wysiwyg-mode-1',
104 'name','wysiwyg-mode',
105 'value',1),
106 radios = D.append(
107 D.attr(D.span(), 'id', 'wysiwygEditMode'),
108 radio0, D.append(
109 D.attr(D.label(), 'for', 'wysiwyg-mode-0'),
110 "WYSIWYG"
111 ),
112 radio1, D.append(
113 D.attr(D.label(), 'for', 'wysiwyg-mode-1'),
114 "Raw HTML"
115 )
116 );
117 D.append(toolbar1, radios);
118 const radioHandler = function(){setDocMode(+this.value)};
119 radio0.addEventListener('change',radioHandler, false);
120 radio1.addEventListener('change',radioHandler, false);
121
122
123 ////////////////////////////////////////////////////////////////////////
124 // Text formatting options...
125 var select;
126 select = D.addClass(D.select(), 'format');
127 select.dataset.format = "formatblock";
128 D.append(toolbar1, select);
129 addOptions(select)(
130 '', '- formatting -')(
131 "h1", "Title 1 <h1>")(
132 "h2", "Title 2 <h2>")(
133 "h3", "Title 3 <h3>")(
134 "h4", "Title 4 <h4>")(
135 "h5", "Title 5 <h5>")(
136 "h6", "Subtitle <h6>")(
137 "p", "Paragraph <p>")(
138 "pre", "Preformatted <pre>");
139
140 select = D.addClass(D.select(), 'format');
141 select.dataset.format = "fontname";
142 D.append(toolbar1, select);
143 D.addClass(
144 D.option(select, '', '- font -'),
145 "heading"
146 );
147 addOptions(select)(
148 'Arial')(
149 'Arial Black')(
150 'Courier New')(
151 'Times New Roman');
152
153 select = D.addClass(D.select(), 'format');
154 D.append(toolbar1, select);
155 select.dataset.format = "fontsize";
156 D.addClass(
157 D.option(select, '', '- size -'),
158 "heading"
159 );
160 addOptions(select)(
161 "1", "Very small")(
162 "2", "A bit small")(
163 "3", "Normal")(
164 "4", "Medium-large")(
165 "5", "Big")(
166 "6", "Very big")(
167 "7", "Maximum");
168
169 select = D.addClass(D.select(), 'format');
170 D.append(toolbar1, select);
171 select.dataset.format = 'forecolor';
172 D.addClass(
173 D.option(select, '', '- color -'),
174 "heading"
175 );
176 addOptions(select)(
177 "red", "Red")(
178 "blue", "Blue")(
179 "green", "Green")(
180 "black", "Black")(
181 "grey", "Grey")(
182 "yellow", "Yellow")(
183 "cyan", "Cyan")(
184 "magenta", "Magenta");
185
186
187 ////////////////////////////////////////////////////////////////////////
188 // Icon-based toolbar...
189 /**
190 Inject the icons...
191
192 mkbuiltins strips anything which looks like a C++-style comment,
193 even if it's in a string literal, and thus the runs of "/"
194 characters in the DOM element data attributes have been mangled
195 to work around that: we simply use \x2f for every 2nd slash.
196 */
197 (function f(title,format,src){
198 const img = D.img();
199 D.append(toolbar2, img);
200 D.addClass(img, 'intLink');
201 D.attr(img, 'title', title);
202 img.dataset.format = format;
203 D.attr(img, 'src', 'string'===typeof src ? src : src.join(''));
204 return f;
205 })(
206 'Undo', 'undo',
207 ["data:image/gif;base64,R0lGODlhFgAWAOMKADljwliE33mOrpGjuYKl8aezxqPD+7",
208 "/I19DV3NHa7P/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f",
209 "/\x2f/\x2f/\x2f/yH5BAEKAA8ALAAAAAAWABYAAARR8MlJq704680",
210 "7TkaYeJJBnES4EeUJvIGapWYAC0CsocQ7SDlWJkAkCA6ToMYWIARGQF3mRQVIEjkkSVLIbSfE",
211 "whdRIH4fh/DZMICe3/C4nBQBADs="]
212 )(
213 'Redo','redo',
214 ["data:image/gif;base64,R0lGODlhFgAWAMIHAB1ChDljwl9vj1iE34Kl8aPD+7/I1/",
215 "/\x2f/yH5BAEKAAcALAAAAAAWABYAAANKeLrc/jDKSesyphi7SiEgsVXZEATDICqBVJjpqWZt9Na",
216 "EDNbQK1wCQsxlYnxMAImhyDoFAElJasRRvAZVRqqQXUy7Cgx4TC6bswkAOw=="]
217 )(
218 "Remove formatting",
219 "removeFormat",
220 ["data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AA",
221 "AABGdBTUEAALGPC/xhBQAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAAOxAAADsQBlSsOGwA",
222 "AAAd0SU1FB9oECQMCKPI8CIIAAAAIdEVYdENvbW1lbnQA9syWvwAAAuhJREFUOMtjYBgFxAB5",
223 "01ZWBvVaL2nHnlmk6mXCJbF69zU+Hz/9fB5O1lx+bg45qhl8/fYr5it3XrP/YWTUvvvk3VeqG",
224 "Xz70TvbJy8+Wv39+2/Hz19/mGwjZzuTYjALuoBv9jImaXHeyD3H7kU8fPj2ICML8z92dlbtMz",
225 "deiG3fco7J08foH1kurkm3E9iw54YvKwuTuom+LPt/BgbWf3/\x2fsf37/1/c02cCG1lB8f/\x2ff95",
226 "DZx74MTMzshhoSm6szrQ/a6Ir/Z2RkfEjBxuLYFpDiDi6Af/\x2f/2ckaHBp7+7wmavP5n76+P2C",
227 "lrLIYl8H9W36auJCbCxM4szMTJac7Kza/\x2f/\x2fR3H1w2cfWAgafPbqs5g7D95++/P1B4+ECK8tA",
228 "wMDw/1H7159+/7r7ZcvPz4fOHbzEwMDwx8GBgaGnNatfHZx8zqrJ+4VJBh5CQEGOySEua/v3n",
229 "7hXmqI8WUGBgYGL3vVG7fuPK3i5GD9/fja7ZsMDAzMG/Ze52mZeSj4yu1XEq/ff7W5dvfVAS1",
230 "lsXc4Db7z8C3r8p7Qjf/\x2f/2dnZGxlqJuyr3rPqQd/Hhyu7oSpYWScylDQsd3kzvnH738wMDzj",
231 "5GBN1VIWW4c3KDon7VOvm7S3paB9u5qsU5/x5KUnlY+eexQbkLNsErK61+++VnAJcfkyMTIwf",
232 "fj0QwZbJDKjcETs1Y8evyd48toz8y/ffzv/\x2fvPP4veffxpX77z6l5JewHPu8MqTDAwMDLzyrj",
233 "b/mZm0JcT5Lj+89+Ybm6zz95oMh7s4XbygN3Sluq4Mj5K8iKMgP4f0/\x2f/\x2ffv77/\x2f8nLy+7MCc",
234 "XmyYDAwODS9jM9tcvPypd35pne3ljdjvj26+H2dhYpuENikgfvQeXNmSl3tqepxXsqhXPyc66",
235 "6s+fv1fMdKR3TK72zpix8nTc7bdfhfkEeVbC9KhbK/9iYWHiErbu6MWbY/7/\x2f8/4/\x2f9/pgOnH",
236 "6jGVazvFDRtq2VgiBIZrUTIBgCk+ivHvuEKwAAAAABJRU5ErkJggg=="]
237 )(
238 "Bold",
239 "bold",
240 ["data:image/gif;base64,R0lGODlhFgAWAID/AMDAwAAAACH5BAEAAAAALAAAAAAWAB",
241 "YAQAInhI+pa+H9mJy0LhdgtrxzDG5WGFVk6aXqyk6Y9kXvKKNuLbb6zgMFADs="]
242 )(
243 "Italic",
244 "italic",
245 ["data:image/gif;base64,R0lGODlhFgAWAKEDAAAAAF9vj5WIbf/\x2f/yH5BAEAAAMALA",
246 "AAAAAWABYAAAIjnI+py+0Po5x0gXvruEKHrF2BB1YiCWgbMFIYpsbyTNd2UwAAOw=="]
247 )(
248 "Underline",
249 "underline",
250 ["data:image/gif;base64,R0lGODlhFgAWAKECAAAAAF9vj/\x2f/\x2f/\x2f/\x2fyH5BAEAAAIALA",
251 "AAAAAWABYAAAIrlI+py+0Po5zUgAsEzvEeL4Ea15EiJJ5PSqJmuwKBEKgxVuXWtun+DwxCCgA",
252 "7"]
253 )(
254 "Left align",
255 "justifyleft",
256 ["data:image/gif;base64,R0lGODlhFgAWAID/AMDAwAAAACH5BAEAAAAALAAAAAAWAB",
257 "YAQAIghI+py+0Po5y02ouz3jL4D4JMGELkGYxo+qzl4nKyXAAAOw=="]
258 )(
259 "Center align",
260 "justifycenter",
261 ["data:image/gif;base64,R0lGODlhFgAWAID/AMDAwAAAACH5BAEAAAAALAAAAAAWAB",
262 "YAQAIfhI+py+0Po5y02ouz3jL4D4JOGI7kaZ5Bqn4sycVbAQA7"]
263 )(
264 "Right align",
265 "justifyright",
266 ["data:image/gif;base64,R0lGODlhFgAWAID/AMDAwAAAACH5BAEAAAAALAAAAAAWAB",
267 "YAQAIghI+py+0Po5y02ouz3jL4D4JQGDLkGYxouqzl43JyVgAAOw=="]
268 )(
269 "Numbered list",
270 "insertorderedlist",
271 ["data:image/gif;base64,R0lGODlhFgAWAMIGAAAAADljwliE35GjuaezxtHa7P/\x2f/\x2f",
272 "/\x2f/yH5BAEAAAcALAAAAAAWABYAAAM2eLrc/jDKSespwjoRFvggCBUBoTFBeq6QIAysQnRHaEO",
273 "zyaZ07Lu9lUBnC0UGQU1K52s6n5oEADs="]
274 )(
275 "Dotted list",
276 "insertunorderedlist",
277 ["data:image/gif;base64,R0lGODlhFgAWAMIGAAAAAB1ChF9vj1iE33mOrqezxv/\x2f/\x2f",
278 "/\x2f/yH5BAEAAAcALAAAAAAWABYAAAMyeLrc/jDKSesppNhGRlBAKIZRERBbqm6YtnbfMY7lud6",
279 "4UwiuKnigGQliQuWOyKQykgAAOw=="]
280 )(
281 "Quote",
282 "formatblock",
283 ["data:image/gif;base64,R0lGODlhFgAWAIQXAC1NqjFRjkBgmT9nqUJnsk9xrFJ7u2",
284 "R9qmKBt1iGzHmOrm6Sz4OXw3Odz4Cl2ZSnw6KxyqO306K63bG70bTB0rDI3bvI4P",
285 "/\x2f/\x2f/\x2f/\x2f/",
286 "/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f",
287 "/\x2f/\x2f/\x2fyH5BAEKAB8ALAAAAAAWABYAAAVP4CeOZGmeaKqubEs2Cekk",
288 "ErvEI1zZuOgYFlakECEZFi0GgTGKEBATFmJAVXweVOoKEQgABB9IQDCmrLpjETrQQlhHjINrT",
289 "q/b7/i8fp8PAQA7"]
290 )(
291 "Delete indentation",
292 "outdent",
293 ["data:image/gif;base64,R0lGODlhFgAWAMIHAAAAADljwliE35GjuaezxtDV3NHa7P",
294 "/\x2f/yH5BAEAAAcALAAAAAAWABYAAAM2eLrc/jDKCQG9F2i7u8agQgyK1z2EIBil+TWqEMxhMcz",
295 "sYVJ3e4ahk+sFnAgtxSQDqWw6n5cEADs="]
296 )(
297 "Add indentation",
298 "indent",
299 ["data:image/gif;base64,R0lGODlhFgAWAOMIAAAAADljwl9vj1iE35GjuaezxtDV3N",
300 "Ha7P/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f",
301 "/\x2f/\x2f/yH5BAEAAAgALAAAAAAWABYAAAQ7EMlJq704650",
302 "B/x8gemMpgugwHJNZXodKsO5oqUOgo5KhBwWESyMQsCRDHu9VOyk5TM9zSpFSr9gsJwIAOw=="
303 ]
304 )(
305 "Hyperlink",
306 "createlink",
307 ["data:image/gif;base64,R0lGODlhFgAWAOMKAB1ChDRLY19vj3mOrpGjuaezxrCztb",
308 "/I19Ha7Pv8/f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f",
309 "/yH5BAEKAA8ALAAAAAAWABYAAARY8MlJq704682",
310 "7/2BYIQVhHg9pEgVGIklyDEUBy/RlE4FQF4dCj2AQXAiJQDCWQCAEBwIioEMQBgSAFhDAGghG",
311 "i9XgHAhMNoSZgJkJei33UESv2+/4vD4TAQA7"]
312 )(
313 "Cut",
314 "cut",
315 ["data:image/gif;base64,R0lGODlhFgAWAIQSAB1ChBFNsRJTySJYwjljwkxwl19vj1",
316 "dusYODhl6MnHmOrpqbmpGjuaezxrCztcDCxL/I18rL1P/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f",
317 "/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/",
318 "/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f",
319 "yH5BAEAAB8ALAAAAAAWABYAAAVu4CeOZGmeaKqubDs6TNnE",
320 "bGNApNG0kbGMi5trwcA9GArXh+FAfBAw5UexUDAQESkRsfhJPwaH4YsEGAAJGisRGAQY7UCC9",
321 "ZAXBB+74LGCRxIEHwAHdWooDgGJcwpxDisQBQRjIgkDCVlfmZqbmiEAOw=="]
322 )(
323 "Copy",
324 "copy",
325 ["data:image/gif;base64,R0lGODlhFgAWAIQcAB1ChBFNsTRLYyJYwjljwl9vj1iE31",
326 "iGzF6MnHWX9HOdz5GjuYCl2YKl8ZOt4qezxqK63aK/9KPD+7DI3b/I17LM/MrL1MLY9NHa7OP",
327 "s++bx/Pv8/f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f",
328 "/yH5BAEAAB8ALAAAAAAWABYAAAWG4CeOZGmeaKqubOum1SQ/",
329 "kPVOW749BeVSus2CgrCxHptLBbOQxCSNCCaF1GUqwQbBd0JGJAyGJJiobE+LnCaDcXAaEoxhQ",
330 "ACgNw0FQx9kP+wmaRgYFBQNeAoGihCAJQsCkJAKOhgXEw8BLQYciooHf5o7EA+kC40qBKkAAA",
331 "Grpy+wsbKzIiEAOw=="]
332 )(
333 /* Paste, when activated via JS, has no effect in some (maybe all)
334 environments. Activated externally, e.g. keyboard, it works. */
335 "Paste (does not work in all environments)",
336 "paste",
337 ["data:image/gif;base64,R0lGODlhFgAWAIQUAD04KTRLY2tXQF9vj414WZWIbXmOrp",
338 "qbmpGjudClFaezxsa0cb/I1+3YitHa7PrkIPHvbuPs+/fvrvv8/f/\x2f/\x2f/\x2f",
339 "/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/",
340 "/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f",
341 "yH5BAEAAB8ALAAAAAAWABYAAAWN4CeOZGmeaKqubGsusPvB",
342 "SyFJjVDs6nJLB0khR4AkBCmfsCGBQAoCwjF5gwquVykSFbwZE+AwIBV0GhFog2EwIDchjwRiQ",
343 "o9E2Fx4XD5R+B0DDAEnBXBhBhN2DgwDAQFjJYVhCQYRfgoIDGiQJAWTCQMRiwwMfgicnVcAAA",
344 "MOaK+bLAOrtLUyt7i5uiUhADs="]
345 );
346
347 ////////////////////////////////////////////////////////////////////////
348 // The main editor area...
349 const oDoc = D.attr(D.div(), 'id', "wysiwygBox");
350 D.attr(oDoc, 'contenteditable', 'true');
351 D.append(outerContainer, oDoc);
352
353 /* Initialize the document editor */
354 function initDoc() {
355 initEventHandlers();
356 if (!isWysiwyg()) { setDocMode(true); }
357 }
358
359 function initEventHandlers() {
360 //console.debug("initEventHandlers()");
361 const handleDropDown = function() {
362 formatDoc(this.dataset.format,this[this.selectedIndex].value);
363 this.selectedIndex = 0;
364 };
365
366 const handleFormatButton = function() {
367 var extra;
368 switch (this.dataset.format) {
369 case 'createlink':
370 const sLnk = prompt('Target URL:','');
371 if(sLnk) extra = sLnk;
372 break;
373 case 'formatblock':
374 extra = 'blockquote';
375 break;
376 }
377 formatDoc(this.dataset.format, extra);
378 };
379
380 var i, controls = outerContainer.querySelectorAll('select.format');
381 for(i = 0; i < controls.length; i++) {
382 controls[i].addEventListener('change', handleDropDown, false);;
383 }
384 controls = outerContainer.querySelectorAll('.intLink');
385 for(i = 0; i < controls.length; i++) {
386 controls[i].addEventListener('click', handleFormatButton, false);
387 }
388 }
389
390 /* Return true if the document editor is in WYSIWYG mode. Return
391 ** false if it is in Markup mode */
392 function isWysiwyg() {
393 return radio0.checked;
394 }
395
396 /* Run the editing command if in WYSIWYG mode */
397 function formatDoc(sCmd, sValue) {
398 ioDoc.innerHTML = content){
399 try {
400 // First, try the W3C draft standard way, which has
401 // been working on all non-IE browsers for a while.
402 // It is also supported by IE11 and higher.
403 document.execCommand("styleWithCSS", false, false);
404 } catch (e) {
405 try {
406 // For IE9 or IE10, this should work.
407 document.execCommand("useCSS", 0, true);
408 } catch (e) {
409 // OK, that apparently did not work, do nothing.
410 }
411 }
412 document.execCommand(sCmd, false, sValue);
413 oDoc.focus();
414 }
415 }
416
417 /* Change the editing mode. Convert to markup if the argument
418 ** is true and wysiwyg if the argument is false. */
419 function setDocMode(bToMarkup, content) {
420 if(undefined===content){
421 content = bToMarkup ? oDoc.innerHTML : oDoc.innerText;
422 }
423 if(!setDocMode.linebreak){
424 setDocMode.linebreak = new RegExp("</p><p>","ig");
425 }
426 if(!setDocMode.toHide){
427 setDocMode.toHide = toolbars.querySelectorAll(
428 '#wysiwyg-toolBar1 > *:not(#wysiwygEditMode), '
429 +'#wysiwyg-toolBar2');
430 }
431 if (bToMarkup) {
432 /* WYSIWYG -> Markup */
433 // Legacy did this: content=content.replace(setDocMode.linebreak,"</p>\n\n<p>")
434 D.append(D.clearElement(oDoc), content)
435 oDoc.style.whInvoke this routine prior to submitting the HTML content back
436 ** to the server */
437 /*functio /* Return true if th=="pre-wrap"){setDocMode(0);}
438 document.getElementById("wysiwygValue").
--- src/fossil.page.wikiedit.js
+++ src/fossil.page.wikiedit.js
@@ -863,17 +863,14 @@
863863
misc: E('#wikiedit-tab-misc')
864864
//commit: E('#wikiedit-tab-commit')
865865
}
866866
};
867867
P.tabs = new F.TabManager(D.clearElement(P.e.tabContainer));
868
- P.tabs.e.container.insertBefore(
869
- /* Move the status bar between the tab buttons and
870
- tab panels. Seems to be the best fit in terms of
871
- functionality and visibility. */
872
- E('#fossil-status-bar'), P.tabs.e.tabs
873
- );
874
- P.tabs.e.container.insertBefore(P.e.editStatus, P.tabs.e.tabs);
868
+ /* Move the status bar between the tab buttons and
869
+ tab panels. Seems to be the best fit in terms of
870
+ functionality and visibility. */
871
+ P.tabs.addCustomWidget( E('#fossil-status-bar') ).addCustomWidget(P.e.editStatus);
875872
P.tabs.addEventListener(
876873
/* Set up some before-switch-to tab event tasks... */
877874
'before-switch-to', function(ev){
878875
const theTab = ev.detail, btnSlot = theTab.querySelector('.save-button-slot');
879876
if(btnSlot){
880877
--- src/fossil.page.wikiedit.js
+++ src/fossil.page.wikiedit.js
@@ -863,17 +863,14 @@
863 misc: E('#wikiedit-tab-misc')
864 //commit: E('#wikiedit-tab-commit')
865 }
866 };
867 P.tabs = new F.TabManager(D.clearElement(P.e.tabContainer));
868 P.tabs.e.container.insertBefore(
869 /* Move the status bar between the tab buttons and
870 tab panels. Seems to be the best fit in terms of
871 functionality and visibility. */
872 E('#fossil-status-bar'), P.tabs.e.tabs
873 );
874 P.tabs.e.container.insertBefore(P.e.editStatus, P.tabs.e.tabs);
875 P.tabs.addEventListener(
876 /* Set up some before-switch-to tab event tasks... */
877 'before-switch-to', function(ev){
878 const theTab = ev.detail, btnSlot = theTab.querySelector('.save-button-slot');
879 if(btnSlot){
880
--- src/fossil.page.wikiedit.js
+++ src/fossil.page.wikiedit.js
@@ -863,17 +863,14 @@
863 misc: E('#wikiedit-tab-misc')
864 //commit: E('#wikiedit-tab-commit')
865 }
866 };
867 P.tabs = new F.TabManager(D.clearElement(P.e.tabContainer));
868 /* Move the status bar between the tab buttons and
869 tab panels. Seems to be the best fit in terms of
870 functionality and visibility. */
871 P.tabs.addCustomWidget( E('#fossil-status-bar') ).addCustomWidget(P.e.editStatus);
 
 
 
872 P.tabs.addEventListener(
873 /* Set up some before-switch-to tab event tasks... */
874 'before-switch-to', function(ev){
875 const theTab = ev.detail, btnSlot = theTab.querySelector('.save-button-slot');
876 if(btnSlot){
877
--- src/fossil.tabs.js
+++ src/fossil.tabs.js
@@ -204,10 +204,20 @@
204204
*/
205205
addEventListener: function(eventName, callback){
206206
this.e.container.addEventListener(eventName, callback, false);
207207
return this;
208208
},
209
+
210
+ /**
211
+ Inserts the given DOM element immediately after the tab bar.
212
+ Intended for a status bar or similar always-visible component.
213
+ Returns this object.
214
+ */
215
+ addCustomWidget: function(e){
216
+ this.e.container.insertBefore(e, this.e.tabs);
217
+ return this;
218
+ },
209219
210220
/**
211221
If the given DOM element, unique selector, or integer (0-based
212222
tab number) is one of this object's tabs, the UI makes that tab
213223
the currently-visible one, firing any relevant events. Returns
214224
--- src/fossil.tabs.js
+++ src/fossil.tabs.js
@@ -204,10 +204,20 @@
204 */
205 addEventListener: function(eventName, callback){
206 this.e.container.addEventListener(eventName, callback, false);
207 return this;
208 },
 
 
 
 
 
 
 
 
 
 
209
210 /**
211 If the given DOM element, unique selector, or integer (0-based
212 tab number) is one of this object's tabs, the UI makes that tab
213 the currently-visible one, firing any relevant events. Returns
214
--- src/fossil.tabs.js
+++ src/fossil.tabs.js
@@ -204,10 +204,20 @@
204 */
205 addEventListener: function(eventName, callback){
206 this.e.container.addEventListener(eventName, callback, false);
207 return this;
208 },
209
210 /**
211 Inserts the given DOM element immediately after the tab bar.
212 Intended for a status bar or similar always-visible component.
213 Returns this object.
214 */
215 addCustomWidget: function(e){
216 this.e.container.insertBefore(e, this.e.tabs);
217 return this;
218 },
219
220 /**
221 If the given DOM element, unique selector, or integer (0-based
222 tab number) is one of this object's tabs, the UI makes that tab
223 the currently-visible one, firing any relevant events. Returns
224
--- src/main.mk
+++ src/main.mk
@@ -230,10 +230,11 @@
230230
$(SRCDIR)/fossil.dom.js \
231231
$(SRCDIR)/fossil.fetch.js \
232232
$(SRCDIR)/fossil.numbered-lines.js \
233233
$(SRCDIR)/fossil.page.fileedit.js \
234234
$(SRCDIR)/fossil.page.forumpost.js \
235
+ $(SRCDIR)/fossil.page.wikiedit-wysiwyg-legacy.js \
235236
$(SRCDIR)/fossil.page.wikiedit.js \
236237
$(SRCDIR)/fossil.popupwidget.js \
237238
$(SRCDIR)/fossil.storage.js \
238239
$(SRCDIR)/fossil.tabs.js \
239240
$(SRCDIR)/graph.js \
240241
--- src/main.mk
+++ src/main.mk
@@ -230,10 +230,11 @@
230 $(SRCDIR)/fossil.dom.js \
231 $(SRCDIR)/fossil.fetch.js \
232 $(SRCDIR)/fossil.numbered-lines.js \
233 $(SRCDIR)/fossil.page.fileedit.js \
234 $(SRCDIR)/fossil.page.forumpost.js \
 
235 $(SRCDIR)/fossil.page.wikiedit.js \
236 $(SRCDIR)/fossil.popupwidget.js \
237 $(SRCDIR)/fossil.storage.js \
238 $(SRCDIR)/fossil.tabs.js \
239 $(SRCDIR)/graph.js \
240
--- src/main.mk
+++ src/main.mk
@@ -230,10 +230,11 @@
230 $(SRCDIR)/fossil.dom.js \
231 $(SRCDIR)/fossil.fetch.js \
232 $(SRCDIR)/fossil.numbered-lines.js \
233 $(SRCDIR)/fossil.page.fileedit.js \
234 $(SRCDIR)/fossil.page.forumpost.js \
235 $(SRCDIR)/fossil.page.wikiedit-wysiwyg-legacy.js \
236 $(SRCDIR)/fossil.page.wikiedit.js \
237 $(SRCDIR)/fossil.popupwidget.js \
238 $(SRCDIR)/fossil.storage.js \
239 $(SRCDIR)/fossil.tabs.js \
240 $(SRCDIR)/graph.js \
241
--- src/style.fileedit.css
+++ src/style.fileedit.css
@@ -147,11 +147,11 @@
147147
body.fileedit #fileedit-stash-selector {
148148
margin: 0.25em;
149149
display: flex;
150150
flex-direction: row;
151151
flex-wrap: wrap;
152
- align-items: baseline;
152
+ align-items: center;
153153
}
154154
body.fileedit #fileedit-stash-selector select {
155155
margin: 0 1em;
156156
height: initial;
157157
font-family: monospace;
158158
--- src/style.fileedit.css
+++ src/style.fileedit.css
@@ -147,11 +147,11 @@
147 body.fileedit #fileedit-stash-selector {
148 margin: 0.25em;
149 display: flex;
150 flex-direction: row;
151 flex-wrap: wrap;
152 align-items: baseline;
153 }
154 body.fileedit #fileedit-stash-selector select {
155 margin: 0 1em;
156 height: initial;
157 font-family: monospace;
158
--- src/style.fileedit.css
+++ src/style.fileedit.css
@@ -147,11 +147,11 @@
147 body.fileedit #fileedit-stash-selector {
148 margin: 0.25em;
149 display: flex;
150 flex-direction: row;
151 flex-wrap: wrap;
152 align-items: center;
153 }
154 body.fileedit #fileedit-stash-selector select {
155 margin: 0 1em;
156 height: initial;
157 font-family: monospace;
158
--- src/style.wikiedit.css
+++ src/style.wikiedit.css
@@ -38,11 +38,11 @@
3838
vertical-align: middle;
3939
margin: 0.5em;
4040
}
4141
body.wikiedit .tab-container > .tabs > .tab-panel > .wikiedit-options > .input-with-label {
4242
vertical-align: middle;
43
- margin: 0.5em;
43
+ margin: 0 0.5em 0.25em 0.5em;
4444
}
4545
body.wikiedit label {
4646
display: inline; /* some skins set label display to block! */
4747
}
4848
body.wikiedit .wikiedit-options > div > * {
@@ -181,11 +181,11 @@
181181
body.wikiedit #wikiedit-stash-selector {
182182
margin: 0.25em;
183183
display: flex;
184184
flex-direction: row;
185185
flex-wrap: wrap;
186
- align-items: baseline;
186
+ align-items: center;
187187
}
188188
body.wikiedit #wikiedit-stash-selector select {
189189
margin: 0 1em 0 0.5em;
190190
height: initial;
191191
font-family: monospace;
192192
--- src/style.wikiedit.css
+++ src/style.wikiedit.css
@@ -38,11 +38,11 @@
38 vertical-align: middle;
39 margin: 0.5em;
40 }
41 body.wikiedit .tab-container > .tabs > .tab-panel > .wikiedit-options > .input-with-label {
42 vertical-align: middle;
43 margin: 0.5em;
44 }
45 body.wikiedit label {
46 display: inline; /* some skins set label display to block! */
47 }
48 body.wikiedit .wikiedit-options > div > * {
@@ -181,11 +181,11 @@
181 body.wikiedit #wikiedit-stash-selector {
182 margin: 0.25em;
183 display: flex;
184 flex-direction: row;
185 flex-wrap: wrap;
186 align-items: baseline;
187 }
188 body.wikiedit #wikiedit-stash-selector select {
189 margin: 0 1em 0 0.5em;
190 height: initial;
191 font-family: monospace;
192
--- src/style.wikiedit.css
+++ src/style.wikiedit.css
@@ -38,11 +38,11 @@
38 vertical-align: middle;
39 margin: 0.5em;
40 }
41 body.wikiedit .tab-container > .tabs > .tab-panel > .wikiedit-options > .input-with-label {
42 vertical-align: middle;
43 margin: 0 0.5em 0.25em 0.5em;
44 }
45 body.wikiedit label {
46 display: inline; /* some skins set label display to block! */
47 }
48 body.wikiedit .wikiedit-options > div > * {
@@ -181,11 +181,11 @@
181 body.wikiedit #wikiedit-stash-selector {
182 margin: 0.25em;
183 display: flex;
184 flex-direction: row;
185 flex-wrap: wrap;
186 align-items: center;
187 }
188 body.wikiedit #wikiedit-stash-selector select {
189 margin: 0 1em 0 0.5em;
190 height: initial;
191 font-family: monospace;
192
--- win/Makefile.mingw
+++ win/Makefile.mingw
@@ -642,10 +642,11 @@
642642
$(SRCDIR)/fossil.dom.js \
643643
$(SRCDIR)/fossil.fetch.js \
644644
$(SRCDIR)/fossil.numbered-lines.js \
645645
$(SRCDIR)/fossil.page.fileedit.js \
646646
$(SRCDIR)/fossil.page.forumpost.js \
647
+ $(SRCDIR)/fossil.page.wikiedit-wysiwyg-legacy.js \
647648
$(SRCDIR)/fossil.page.wikiedit.js \
648649
$(SRCDIR)/fossil.popupwidget.js \
649650
$(SRCDIR)/fossil.storage.js \
650651
$(SRCDIR)/fossil.tabs.js \
651652
$(SRCDIR)/graph.js \
652653
--- win/Makefile.mingw
+++ win/Makefile.mingw
@@ -642,10 +642,11 @@
642 $(SRCDIR)/fossil.dom.js \
643 $(SRCDIR)/fossil.fetch.js \
644 $(SRCDIR)/fossil.numbered-lines.js \
645 $(SRCDIR)/fossil.page.fileedit.js \
646 $(SRCDIR)/fossil.page.forumpost.js \
 
647 $(SRCDIR)/fossil.page.wikiedit.js \
648 $(SRCDIR)/fossil.popupwidget.js \
649 $(SRCDIR)/fossil.storage.js \
650 $(SRCDIR)/fossil.tabs.js \
651 $(SRCDIR)/graph.js \
652
--- win/Makefile.mingw
+++ win/Makefile.mingw
@@ -642,10 +642,11 @@
642 $(SRCDIR)/fossil.dom.js \
643 $(SRCDIR)/fossil.fetch.js \
644 $(SRCDIR)/fossil.numbered-lines.js \
645 $(SRCDIR)/fossil.page.fileedit.js \
646 $(SRCDIR)/fossil.page.forumpost.js \
647 $(SRCDIR)/fossil.page.wikiedit-wysiwyg-legacy.js \
648 $(SRCDIR)/fossil.page.wikiedit.js \
649 $(SRCDIR)/fossil.popupwidget.js \
650 $(SRCDIR)/fossil.storage.js \
651 $(SRCDIR)/fossil.tabs.js \
652 $(SRCDIR)/graph.js \
653
--- win/Makefile.msc
+++ win/Makefile.msc
@@ -563,10 +563,11 @@
563563
"$(SRCDIR)\fossil.dom.js" \
564564
"$(SRCDIR)\fossil.fetch.js" \
565565
"$(SRCDIR)\fossil.numbered-lines.js" \
566566
"$(SRCDIR)\fossil.page.fileedit.js" \
567567
"$(SRCDIR)\fossil.page.forumpost.js" \
568
+ "$(SRCDIR)\fossil.page.wikiedit-wysiwyg-legacy.js" \
568569
"$(SRCDIR)\fossil.page.wikiedit.js" \
569570
"$(SRCDIR)\fossil.popupwidget.js" \
570571
"$(SRCDIR)\fossil.storage.js" \
571572
"$(SRCDIR)\fossil.tabs.js" \
572573
"$(SRCDIR)\graph.js" \
@@ -1162,10 +1163,11 @@
11621163
echo "$(SRCDIR)\fossil.dom.js" >> $@
11631164
echo "$(SRCDIR)\fossil.fetch.js" >> $@
11641165
echo "$(SRCDIR)\fossil.numbered-lines.js" >> $@
11651166
echo "$(SRCDIR)\fossil.page.fileedit.js" >> $@
11661167
echo "$(SRCDIR)\fossil.page.forumpost.js" >> $@
1168
+ echo "$(SRCDIR)\fossil.page.wikiedit-wysiwyg-legacy.js" >> $@
11671169
echo "$(SRCDIR)\fossil.page.wikiedit.js" >> $@
11681170
echo "$(SRCDIR)\fossil.popupwidget.js" >> $@
11691171
echo "$(SRCDIR)\fossil.storage.js" >> $@
11701172
echo "$(SRCDIR)\fossil.tabs.js" >> $@
11711173
echo "$(SRCDIR)\graph.js" >> $@
11721174
--- win/Makefile.msc
+++ win/Makefile.msc
@@ -563,10 +563,11 @@
563 "$(SRCDIR)\fossil.dom.js" \
564 "$(SRCDIR)\fossil.fetch.js" \
565 "$(SRCDIR)\fossil.numbered-lines.js" \
566 "$(SRCDIR)\fossil.page.fileedit.js" \
567 "$(SRCDIR)\fossil.page.forumpost.js" \
 
568 "$(SRCDIR)\fossil.page.wikiedit.js" \
569 "$(SRCDIR)\fossil.popupwidget.js" \
570 "$(SRCDIR)\fossil.storage.js" \
571 "$(SRCDIR)\fossil.tabs.js" \
572 "$(SRCDIR)\graph.js" \
@@ -1162,10 +1163,11 @@
1162 echo "$(SRCDIR)\fossil.dom.js" >> $@
1163 echo "$(SRCDIR)\fossil.fetch.js" >> $@
1164 echo "$(SRCDIR)\fossil.numbered-lines.js" >> $@
1165 echo "$(SRCDIR)\fossil.page.fileedit.js" >> $@
1166 echo "$(SRCDIR)\fossil.page.forumpost.js" >> $@
 
1167 echo "$(SRCDIR)\fossil.page.wikiedit.js" >> $@
1168 echo "$(SRCDIR)\fossil.popupwidget.js" >> $@
1169 echo "$(SRCDIR)\fossil.storage.js" >> $@
1170 echo "$(SRCDIR)\fossil.tabs.js" >> $@
1171 echo "$(SRCDIR)\graph.js" >> $@
1172
--- win/Makefile.msc
+++ win/Makefile.msc
@@ -563,10 +563,11 @@
563 "$(SRCDIR)\fossil.dom.js" \
564 "$(SRCDIR)\fossil.fetch.js" \
565 "$(SRCDIR)\fossil.numbered-lines.js" \
566 "$(SRCDIR)\fossil.page.fileedit.js" \
567 "$(SRCDIR)\fossil.page.forumpost.js" \
568 "$(SRCDIR)\fossil.page.wikiedit-wysiwyg-legacy.js" \
569 "$(SRCDIR)\fossil.page.wikiedit.js" \
570 "$(SRCDIR)\fossil.popupwidget.js" \
571 "$(SRCDIR)\fossil.storage.js" \
572 "$(SRCDIR)\fossil.tabs.js" \
573 "$(SRCDIR)\graph.js" \
@@ -1162,10 +1163,11 @@
1163 echo "$(SRCDIR)\fossil.dom.js" >> $@
1164 echo "$(SRCDIR)\fossil.fetch.js" >> $@
1165 echo "$(SRCDIR)\fossil.numbered-lines.js" >> $@
1166 echo "$(SRCDIR)\fossil.page.fileedit.js" >> $@
1167 echo "$(SRCDIR)\fossil.page.forumpost.js" >> $@
1168 echo "$(SRCDIR)\fossil.page.wikiedit-wysiwyg-legacy.js" >> $@
1169 echo "$(SRCDIR)\fossil.page.wikiedit.js" >> $@
1170 echo "$(SRCDIR)\fossil.popupwidget.js" >> $@
1171 echo "$(SRCDIR)\fossil.storage.js" >> $@
1172 echo "$(SRCDIR)\fossil.tabs.js" >> $@
1173 echo "$(SRCDIR)\graph.js" >> $@
1174

Keyboard Shortcuts

Open search /
Next entry (timeline) j
Previous entry (timeline) k
Open focused entry Enter
Show this help ?
Toggle theme Top nav button