Fossil SCM

Added several harmless HTML element types to the whitelist, mainly HTML5 semantic things, plus ones needed for structured fallback from AVIF to WebP to JPEG based on browser capabilities. Added this whitelist to the /md_rules doc for the first time; it was previously only in /wiki_rules, which merely needed small additions to cover the changes.

wyoung 2026-06-21 01:16 UTC trunk
Commit f40b9c10335d4abe06509460d298cacbeb7dec92f2126aba7857988ad60f69e3
+37 -2
--- src/markdown.md
+++ src/markdown.md
@@ -184,15 +184,50 @@
184184
>```
185185
> Character **^** is not part of a label, it is part of the syntax.
186186
> Both a footnote's text and a fragment to which a footnote applies
187187
> are subject to further interpretation as Markdown sources.
188188
189
+## Safe HTML ##
190
+
191
+> Markdown documents may contain raw HTML, filtered to allow the following:
192
+>
193
+> <a> <abbr> <address> <article> <aside>
194
+> <b> <big> <blockquote> <br> <caption>
195
+> <center> <cite> <code> <col> <colgroup>
196
+> <dd> <del> <details> <dfn> <div> <dl>
197
+> <dt> <em> <figcaption> <figure> <font>
198
+> <footer> <h1> <h2> <h3> <h4> <h5>
199
+> <h6> <header> <hr> <i> <img> <ins>
200
+> <kbd> <label> <li> <mark> <meter> <nav>
201
+> <nobr> <nowiki> <ol> <p> <picture> <pre>
202
+> <progress> <q> <s> <samp> <section> <small>
203
+> <source> <span> <strike> <strong> <sub>
204
+> <summary> <sup> <table> <tbody> <td>
205
+> <tfoot> <th> <thead> <time> <title> <tr>
206
+> <tt> <u> <ul> <var> <wbr> <verbatim>
207
+>
208
+> Any other tag is sent through to the output in a way that causes it to be
209
+> visibly called out as disallowed. This is the same whitelist as for
210
+> [Fossil Wiki](/wiki_rules) markup.
211
+>
212
+> Fossil-specific elements **<nowiki>** and **<verbatim>** disable
213
+> wiki and Markdown processing within their spans; see
214
+> [Wiki formatting rules](/wiki_rules) for details.
215
+>
216
+> Only a fixed set of attributes is permitted (for example **id**,
217
+> **class**, **style**, **href**, **src**, **srcset**, **alt**, **type**,
218
+> **datetime**, and **value**). Event handlers, **javascript:** URLs, and
219
+> similar constructs are stripped.
220
+>
221
+> Repository administrators may allow additional unsafe HTML (such as
222
+> **<script>** and **<form>**) in some contexts using the
223
+> [safe-html setting](/help/safe-html) on the Admin/Wiki page.
224
+
189225
## Miscellaneous ##
190226
191227
> * In-line images are made using **\!\[alt-text\]\(image-URL\)**.
192
-> * Use HTML for advanced formatting such as forms, noting that certain
193
-> tags are [disallowed in some contexts](/help/safe-html).
228
+> * Use HTML for advanced formatting; see [Safe HTML](#safe-html) above.
194229
> * **\<!--** HTML-style comments **-->** are supported.
195230
> * Escape special characters (ex: **\[** **\(** **\|** **\***)
196231
> using backslash (ex: **\\\[** **\\\(** **\\\|** **\\\***).
197232
> * A line consisting of **---**, **\*\*\***, or **\_\_\_** is a horizontal
198233
> rule. Spaces and extra **-**/**\***/**_** are allowed.
199234
--- src/markdown.md
+++ src/markdown.md
@@ -184,15 +184,50 @@
184 >```
185 > Character **^** is not part of a label, it is part of the syntax.
186 > Both a footnote's text and a fragment to which a footnote applies
187 > are subject to further interpretation as Markdown sources.
188
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
189 ## Miscellaneous ##
190
191 > * In-line images are made using **\!\[alt-text\]\(image-URL\)**.
192 > * Use HTML for advanced formatting such as forms, noting that certain
193 > tags are [disallowed in some contexts](/help/safe-html).
194 > * **\<!--** HTML-style comments **-->** are supported.
195 > * Escape special characters (ex: **\[** **\(** **\|** **\***)
196 > using backslash (ex: **\\\[** **\\\(** **\\\|** **\\\***).
197 > * A line consisting of **---**, **\*\*\***, or **\_\_\_** is a horizontal
198 > rule. Spaces and extra **-**/**\***/**_** are allowed.
199
--- src/markdown.md
+++ src/markdown.md
@@ -184,15 +184,50 @@
184 >```
185 > Character **^** is not part of a label, it is part of the syntax.
186 > Both a footnote's text and a fragment to which a footnote applies
187 > are subject to further interpretation as Markdown sources.
188
189 ## Safe HTML ##
190
191 > Markdown documents may contain raw HTML, filtered to allow the following:
192 >
193 > &lt;a&gt; &lt;abbr&gt; &lt;address&gt; &lt;article&gt; &lt;aside&gt;
194 > &lt;b&gt; &lt;big&gt; &lt;blockquote&gt; &lt;br&gt; &lt;caption&gt;
195 > &lt;center&gt; &lt;cite&gt; &lt;code&gt; &lt;col&gt; &lt;colgroup&gt;
196 > &lt;dd&gt; &lt;del&gt; &lt;details&gt; &lt;dfn&gt; &lt;div&gt; &lt;dl&gt;
197 > &lt;dt&gt; &lt;em&gt; &lt;figcaption&gt; &lt;figure&gt; &lt;font&gt;
198 > &lt;footer&gt; &lt;h1&gt; &lt;h2&gt; &lt;h3&gt; &lt;h4&gt; &lt;h5&gt;
199 > &lt;h6&gt; &lt;header&gt; &lt;hr&gt; &lt;i&gt; &lt;img&gt; &lt;ins&gt;
200 > &lt;kbd&gt; &lt;label&gt; &lt;li&gt; &lt;mark&gt; &lt;meter&gt; &lt;nav&gt;
201 > &lt;nobr&gt; &lt;nowiki&gt; &lt;ol&gt; &lt;p&gt; &lt;picture&gt; &lt;pre&gt;
202 > &lt;progress&gt; &lt;q&gt; &lt;s&gt; &lt;samp&gt; &lt;section&gt; &lt;small&gt;
203 > &lt;source&gt; &lt;span&gt; &lt;strike&gt; &lt;strong&gt; &lt;sub&gt;
204 > &lt;summary&gt; &lt;sup&gt; &lt;table&gt; &lt;tbody&gt; &lt;td&gt;
205 > &lt;tfoot&gt; &lt;th&gt; &lt;thead&gt; &lt;time&gt; &lt;title&gt; &lt;tr&gt;
206 > &lt;tt&gt; &lt;u&gt; &lt;ul&gt; &lt;var&gt; &lt;wbr&gt; &lt;verbatim&gt;
207 >
208 > Any other tag is sent through to the output in a way that causes it to be
209 > visibly called out as disallowed. This is the same whitelist as for
210 > [Fossil Wiki](/wiki_rules) markup.
211 >
212 > Fossil-specific elements **&lt;nowiki&gt;** and **&lt;verbatim&gt;** disable
213 > wiki and Markdown processing within their spans; see
214 > [Wiki formatting rules](/wiki_rules) for details.
215 >
216 > Only a fixed set of attributes is permitted (for example **id**,
217 > **class**, **style**, **href**, **src**, **srcset**, **alt**, **type**,
218 > **datetime**, and **value**). Event handlers, **javascript:** URLs, and
219 > similar constructs are stripped.
220 >
221 > Repository administrators may allow additional unsafe HTML (such as
222 > **&lt;script&gt;** and **&lt;form&gt;**) in some contexts using the
223 > [safe-html setting](/help/safe-html) on the Admin/Wiki page.
224
225 ## Miscellaneous ##
226
227 > * In-line images are made using **\!\[alt-text\]\(image-URL\)**.
228 > * Use HTML for advanced formatting; see [Safe HTML](#safe-html) above.
 
229 > * **\<!--** HTML-style comments **-->** are supported.
230 > * Escape special characters (ex: **\[** **\(** **\|** **\***)
231 > using backslash (ex: **\\\[** **\\\(** **\\\|** **\\\***).
232 > * A line consisting of **---**, **\*\*\***, or **\_\_\_** is a horizontal
233 > rule. Spaces and extra **-**/**\***/**_** are allowed.
234
+25 -15
--- src/wiki.wiki
+++ src/wiki.wiki
@@ -55,28 +55,38 @@
5555
<nowiki>[#anchor-name],</nowiki> providing you have added the necessary
5656
"&lt;a name='anchor-name'&gt;&lt;/a&gt;" tag to your wiki page.
5757
5858
6. <b>HTML.</b>
5959
The following standard HTML elements may be used:
60
- &lt;a&gt; &lt;address&gt; &lt;article&gt; &lt;aside&gt; &lt;b&gt;
61
- &lt;big&gt; &lt;blockquote&gt; &lt;br&gt; &lt;center&gt; &lt;cite&gt;
62
- &lt;code&gt; &lt;col&gt; &lt;colgroup&gt; &lt;dd&gt;
63
- &lt;del&gt; &lt;dfn&gt;
64
- &lt;div&gt; &lt;dl&gt; &lt;dt&gt; &lt;em&gt; &lt;font&gt; &lt;footer&gt;
65
- &lt;ins&gt;
66
- &lt;h1&gt; &lt;h2&gt; &lt;h3&gt; &lt;h4&gt; &lt;h5&gt; &lt;h6&gt;
67
- &lt;header&gt; &lt;hr&gt; &lt;i&gt; &lt;img&gt; &lt;kbd&gt; &lt;li&gt;
68
- &lt;nav&gt; &lt;nobr&gt; &lt;nowiki&gt; &lt;ol&gt; &lt;p&gt; &lt;pre&gt;
69
- &lt;s&gt; &lt;samp&gt; &lt;section&gt; &lt;small&gt; &lt;span&gt;
70
- &lt;strike&gt; &lt;strong&gt; &lt;sub&gt; &lt;sup&gt; &lt;table&gt;
71
- &lt;tbody&gt; &lt;td&gt; &lt;tfoot&gt; &lt;th&gt; &lt;thead&gt;
72
- &lt;title&gt; &lt;tr&gt; &lt;tt&gt; &lt;u&gt; &lt;ul&gt; &lt;var&gt;
73
- &lt;verbatim&gt;. There are two non-standard elements available:
74
- &lt;verbatim&gt; and &lt;nowiki&gt;. No other elements are allowed.
60
+ &lt;a&gt; &lt;abbr&gt; &lt;address&gt; &lt;article&gt; &lt;aside&gt;
61
+ &lt;b&gt; &lt;big&gt; &lt;blockquote&gt; &lt;br&gt; &lt;caption&gt;
62
+ &lt;center&gt; &lt;cite&gt; &lt;code&gt; &lt;col&gt; &lt;colgroup&gt;
63
+ &lt;dd&gt; &lt;del&gt; &lt;details&gt; &lt;dfn&gt; &lt;div&gt; &lt;dl&gt;
64
+ &lt;dt&gt; &lt;em&gt; &lt;figcaption&gt; &lt;figure&gt; &lt;font&gt;
65
+ &lt;footer&gt; &lt;h1&gt; &lt;h2&gt; &lt;h3&gt; &lt;h4&gt; &lt;h5&gt;
66
+ &lt;h6&gt; &lt;header&gt; &lt;hr&gt; &lt;i&gt; &lt;img&gt; &lt;ins&gt;
67
+ &lt;kbd&gt; &lt;label&gt; &lt;li&gt; &lt;mark&gt; &lt;meter&gt; &lt;nav&gt;
68
+ &lt;nobr&gt; &lt;nowiki&gt; &lt;ol&gt; &lt;p&gt; &lt;picture&gt; &lt;pre&gt;
69
+ &lt;progress&gt; &lt;q&gt; &lt;s&gt; &lt;samp&gt; &lt;section&gt; &lt;small&gt;
70
+ &lt;source&gt; &lt;span&gt; &lt;strike&gt; &lt;strong&gt; &lt;sub&gt;
71
+ &lt;summary&gt; &lt;sup&gt; &lt;table&gt; &lt;tbody&gt; &lt;td&gt;
72
+ &lt;tfoot&gt; &lt;th&gt; &lt;thead&gt; &lt;time&gt; &lt;title&gt; &lt;tr&gt;
73
+ &lt;tt&gt; &lt;u&gt; &lt;ul&gt; &lt;var&gt; &lt;wbr&gt; &lt;verbatim&gt;.
74
+ There are two non-standard elements available: &lt;verbatim&gt; and
75
+ &lt;nowiki&gt;. No other elements are allowed.
7576
All attributes are checked and only a few benign attributes are
7677
allowed on each element. In particular, any attributes that specify
7778
javascript or CSS are elided.
79
+ Use &lt;picture&gt; and &lt;source&gt; with <tt>type=</tt> and
80
+ <tt>srcset=</tt> to offer WebP or AVIF images with a JPEG or PNG
81
+ fallback, for example:
82
+ <pre>&lt;picture&gt;
83
+ &lt;source type="image/webp" srcset="/raw/doc/trunk/www/hero.webp"&gt;
84
+ &lt;img src="/raw/doc/trunk/www/hero.jpg" alt="Diagram"&gt;
85
+&lt;/picture&gt;</pre>
86
+ A single-format image such as WebP may also be referenced directly
87
+ with &lt;img src="..."&gt;.
7888
7989
7. <b>Special Markup.</b>
8090
The &lt;nowiki&gt; tag disables all wiki formatting rules through
8191
the matching &lt;/nowiki&gt; element. The &lt;verbatim&gt; tag works
8292
like &lt;pre&gt; with the addition that it also disables all wiki
8393
--- src/wiki.wiki
+++ src/wiki.wiki
@@ -55,28 +55,38 @@
55 <nowiki>[#anchor-name],</nowiki> providing you have added the necessary
56 "&lt;a name='anchor-name'&gt;&lt;/a&gt;" tag to your wiki page.
57
58 6. <b>HTML.</b>
59 The following standard HTML elements may be used:
60 &lt;a&gt; &lt;address&gt; &lt;article&gt; &lt;aside&gt; &lt;b&gt;
61 &lt;big&gt; &lt;blockquote&gt; &lt;br&gt; &lt;center&gt; &lt;cite&gt;
62 &lt;code&gt; &lt;col&gt; &lt;colgroup&gt; &lt;dd&gt;
63 &lt;del&gt; &lt;dfn&gt;
64 &lt;div&gt; &lt;dl&gt; &lt;dt&gt; &lt;em&gt; &lt;font&gt; &lt;footer&gt;
65 &lt;ins&gt;
66 &lt;h1&gt; &lt;h2&gt; &lt;h3&gt; &lt;h4&gt; &lt;h5&gt; &lt;h6&gt;
67 &lt;header&gt; &lt;hr&gt; &lt;i&gt; &lt;img&gt; &lt;kbd&gt; &lt;li&gt;
68 &lt;nav&gt; &lt;nobr&gt; &lt;nowiki&gt; &lt;ol&gt; &lt;p&gt; &lt;pre&gt;
69 &lt;s&gt; &lt;samp&gt; &lt;section&gt; &lt;small&gt; &lt;span&gt;
70 &lt;strike&gt; &lt;strong&gt; &lt;sub&gt; &lt;sup&gt; &lt;table&gt;
71 &lt;tbody&gt; &lt;td&gt; &lt;tfoot&gt; &lt;th&gt; &lt;thead&gt;
72 &lt;title&gt; &lt;tr&gt; &lt;tt&gt; &lt;u&gt; &lt;ul&gt; &lt;var&gt;
73 &lt;verbatim&gt;. There are two non-standard elements available:
74 &lt;verbatim&gt; and &lt;nowiki&gt;. No other elements are allowed.
 
75 All attributes are checked and only a few benign attributes are
76 allowed on each element. In particular, any attributes that specify
77 javascript or CSS are elided.
 
 
 
 
 
 
 
 
 
78
79 7. <b>Special Markup.</b>
80 The &lt;nowiki&gt; tag disables all wiki formatting rules through
81 the matching &lt;/nowiki&gt; element. The &lt;verbatim&gt; tag works
82 like &lt;pre&gt; with the addition that it also disables all wiki
83
--- src/wiki.wiki
+++ src/wiki.wiki
@@ -55,28 +55,38 @@
55 <nowiki>[#anchor-name],</nowiki> providing you have added the necessary
56 "&lt;a name='anchor-name'&gt;&lt;/a&gt;" tag to your wiki page.
57
58 6. <b>HTML.</b>
59 The following standard HTML elements may be used:
60 &lt;a&gt; &lt;abbr&gt; &lt;address&gt; &lt;article&gt; &lt;aside&gt;
61 &lt;b&gt; &lt;big&gt; &lt;blockquote&gt; &lt;br&gt; &lt;caption&gt;
62 &lt;center&gt; &lt;cite&gt; &lt;code&gt; &lt;col&gt; &lt;colgroup&gt;
63 &lt;dd&gt; &lt;del&gt; &lt;details&gt; &lt;dfn&gt; &lt;div&gt; &lt;dl&gt;
64 &lt;dt&gt; &lt;em&gt; &lt;figcaption&gt; &lt;figure&gt; &lt;font&gt;
65 &lt;footer&gt; &lt;h1&gt; &lt;h2&gt; &lt;h3&gt; &lt;h4&gt; &lt;h5&gt;
66 &lt;h6&gt; &lt;header&gt; &lt;hr&gt; &lt;i&gt; &lt;img&gt; &lt;ins&gt;
67 &lt;kbd&gt; &lt;label&gt; &lt;li&gt; &lt;mark&gt; &lt;meter&gt; &lt;nav&gt;
68 &lt;nobr&gt; &lt;nowiki&gt; &lt;ol&gt; &lt;p&gt; &lt;picture&gt; &lt;pre&gt;
69 &lt;progress&gt; &lt;q&gt; &lt;s&gt; &lt;samp&gt; &lt;section&gt; &lt;small&gt;
70 &lt;source&gt; &lt;span&gt; &lt;strike&gt; &lt;strong&gt; &lt;sub&gt;
71 &lt;summary&gt; &lt;sup&gt; &lt;table&gt; &lt;tbody&gt; &lt;td&gt;
72 &lt;tfoot&gt; &lt;th&gt; &lt;thead&gt; &lt;time&gt; &lt;title&gt; &lt;tr&gt;
73 &lt;tt&gt; &lt;u&gt; &lt;ul&gt; &lt;var&gt; &lt;wbr&gt; &lt;verbatim&gt;.
74 There are two non-standard elements available: &lt;verbatim&gt; and
75 &lt;nowiki&gt;. No other elements are allowed.
76 All attributes are checked and only a few benign attributes are
77 allowed on each element. In particular, any attributes that specify
78 javascript or CSS are elided.
79 Use &lt;picture&gt; and &lt;source&gt; with <tt>type=</tt> and
80 <tt>srcset=</tt> to offer WebP or AVIF images with a JPEG or PNG
81 fallback, for example:
82 <pre>&lt;picture&gt;
83 &lt;source type="image/webp" srcset="/raw/doc/trunk/www/hero.webp"&gt;
84 &lt;img src="/raw/doc/trunk/www/hero.jpg" alt="Diagram"&gt;
85 &lt;/picture&gt;</pre>
86 A single-format image such as WebP may also be referenced directly
87 with &lt;img src="..."&gt;.
88
89 7. <b>Special Markup.</b>
90 The &lt;nowiki&gt; tag disables all wiki formatting rules through
91 the matching &lt;/nowiki&gt; element. The &lt;verbatim&gt; tag works
92 like &lt;pre&gt; with the addition that it also disables all wiki
93
+76 -6
--- src/wikiformat.c
+++ src/wikiformat.c
@@ -68,25 +68,36 @@
6868
ATTR_ALT,
6969
ATTR_BGCOLOR,
7070
ATTR_BORDER,
7171
ATTR_CELLPADDING,
7272
ATTR_CELLSPACING,
73
+ ATTR_CITE,
7374
ATTR_CLASS,
7475
ATTR_CLEAR,
7576
ATTR_COLOR,
7677
ATTR_COLSPAN,
7778
ATTR_COMPACT,
79
+ ATTR_DATETIME,
7880
ATTR_FACE,
81
+ ATTR_FOR,
7982
ATTR_HEIGHT,
83
+ ATTR_HIGH,
8084
ATTR_HREF,
8185
ATTR_HSPACE,
8286
ATTR_ID,
8387
ATTR_LINKS,
88
+ ATTR_LOW,
89
+ ATTR_MAX,
90
+ ATTR_MEDIA,
91
+ ATTR_MIN,
8492
ATTR_NAME,
93
+ ATTR_OPTIMUM,
8594
ATTR_ROWSPAN,
8695
ATTR_SIZE,
96
+ ATTR_SIZES,
8797
ATTR_SRC,
98
+ ATTR_SRCSET,
8899
ATTR_START,
89100
ATTR_STYLE,
90101
ATTR_TARGET,
91102
ATTR_TITLE,
92103
ATTR_TYPE,
@@ -124,11 +135,13 @@
124135
AMSK_TITLE = 0x01000000,
125136
AMSK_TYPE = 0x02000000,
126137
AMSK_VALIGN = 0x04000000,
127138
AMSK_VALUE = 0x08000000,
128139
AMSK_VSPACE = 0x10000000,
129
- AMSK_WIDTH = 0x20000000
140
+ AMSK_WIDTH = 0x20000000,
141
+ AMSK_CITE = 0x40000000,
142
+ AMSK_DATETIME = 0x80000000
130143
};
131144
132145
static const struct AllowedAttribute {
133146
const char *zName;
134147
unsigned int iMask;
@@ -141,25 +154,36 @@
141154
{ "alt", AMSK_ALT },
142155
{ "bgcolor", AMSK_BGCOLOR },
143156
{ "border", AMSK_BORDER },
144157
{ "cellpadding", AMSK_CELLPADDING },
145158
{ "cellspacing", AMSK_CELLSPACING },
159
+ { "cite", AMSK_CITE },
146160
{ "class", AMSK_CLASS },
147161
{ "clear", AMSK_CLEAR },
148162
{ "color", AMSK_COLOR },
149163
{ "colspan", AMSK_COLSPAN },
150164
{ "compact", AMSK_COMPACT },
165
+ { "datetime", AMSK_DATETIME },
151166
{ "face", AMSK_FACE },
167
+ { "for", 0 },
152168
{ "height", AMSK_HEIGHT },
169
+ { "high", 0 },
153170
{ "href", AMSK_HREF },
154171
{ "hspace", AMSK_HSPACE },
155172
{ "id", AMSK_ID },
156173
{ "links", AMSK_LINKS },
174
+ { "low", 0 },
175
+ { "max", 0 },
176
+ { "media", 0 },
177
+ { "min", 0 },
157178
{ "name", AMSK_NAME },
179
+ { "optimum", 0 },
158180
{ "rowspan", AMSK_ROWSPAN },
159181
{ "size", AMSK_SIZE },
182
+ { "sizes", 0 },
160183
{ "src", AMSK_SRC },
184
+ { "srcset", 0 },
161185
{ "start", AMSK_START },
162186
{ "style", AMSK_STYLE },
163187
{ "target", AMSK_TARGET },
164188
{ "title", AMSK_TITLE },
165189
{ "type", AMSK_TYPE },
@@ -209,10 +233,11 @@
209233
MARKUP_HTML5_ASIDE,
210234
MARKUP_B,
211235
MARKUP_BIG,
212236
MARKUP_BLOCKQUOTE,
213237
MARKUP_BR,
238
+ MARKUP_CAPTION,
214239
MARKUP_CENTER,
215240
MARKUP_CITE,
216241
MARKUP_CODE,
217242
MARKUP_COL,
218243
MARKUP_COLGROUP,
@@ -222,10 +247,12 @@
222247
MARKUP_DFN,
223248
MARKUP_DIV,
224249
MARKUP_DL,
225250
MARKUP_DT,
226251
MARKUP_EM,
252
+ MARKUP_FIGCAPTION,
253
+ MARKUP_FIGURE,
227254
MARKUP_FONT,
228255
MARKUP_HTML5_FOOTER,
229256
MARKUP_H1,
230257
MARKUP_H2,
231258
MARKUP_H3,
@@ -236,21 +263,28 @@
236263
MARKUP_HR,
237264
MARKUP_I,
238265
MARKUP_IMG,
239266
MARKUP_INS,
240267
MARKUP_KBD,
268
+ MARKUP_LABEL,
241269
MARKUP_LI,
270
+ MARKUP_MARK,
271
+ MARKUP_METER,
242272
MARKUP_HTML5_NAV,
243273
MARKUP_NOBR,
244274
MARKUP_NOWIKI,
245275
MARKUP_OL,
246276
MARKUP_P,
277
+ MARKUP_PICTURE,
247278
MARKUP_PRE,
279
+ MARKUP_PROGRESS,
280
+ MARKUP_Q,
248281
MARKUP_S,
249282
MARKUP_SAMP,
250283
MARKUP_HTML5_SECTION,
251284
MARKUP_SMALL,
285
+ MARKUP_SOURCE,
252286
MARKUP_SPAN,
253287
MARKUP_STRIKE,
254288
MARKUP_STRONG,
255289
MARKUP_SUB,
256290
MARKUP_SUMMARY,
@@ -259,16 +293,18 @@
259293
MARKUP_TBODY,
260294
MARKUP_TD,
261295
MARKUP_TFOOT,
262296
MARKUP_TH,
263297
MARKUP_THEAD,
298
+ MARKUP_TIME,
264299
MARKUP_TITLE,
265300
MARKUP_TR,
266301
MARKUP_TT,
267302
MARKUP_U,
268303
MARKUP_UL,
269304
MARKUP_VAR,
305
+ MARKUP_WBR,
270306
MARKUP_VERBATIM
271307
};
272308
273309
/*
274310
** The various markup is divided into the following types:
@@ -316,10 +352,12 @@
316352
AMSK_ID|AMSK_CLASS|AMSK_STYLE },
317353
{ "b", MARKUP_B, MUTYPE_FONT, AMSK_STYLE },
318354
{ "big", MARKUP_BIG, MUTYPE_FONT, AMSK_STYLE },
319355
{ "blockquote", MARKUP_BLOCKQUOTE, MUTYPE_BLOCK, AMSK_STYLE },
320356
{ "br", MARKUP_BR, MUTYPE_SINGLE, AMSK_CLEAR },
357
+ { "caption", MARKUP_CAPTION, MUTYPE_BLOCK,
358
+ AMSK_ID|AMSK_CLASS|AMSK_STYLE },
321359
{ "center", MARKUP_CENTER, MUTYPE_BLOCK, AMSK_STYLE },
322360
{ "cite", MARKUP_CITE, MUTYPE_FONT, AMSK_STYLE },
323361
{ "code", MARKUP_CODE, MUTYPE_FONT, AMSK_STYLE },
324362
{ "col", MARKUP_COL, MUTYPE_SINGLE,
325363
AMSK_ALIGN|AMSK_CLASS|AMSK_COLSPAN|AMSK_WIDTH|AMSK_STYLE },
@@ -334,10 +372,14 @@
334372
AMSK_ID|AMSK_CLASS|AMSK_STYLE },
335373
{ "dl", MARKUP_DL, MUTYPE_LIST,
336374
AMSK_COMPACT|AMSK_STYLE },
337375
{ "dt", MARKUP_DT, MUTYPE_LI, AMSK_STYLE },
338376
{ "em", MARKUP_EM, MUTYPE_FONT, AMSK_STYLE },
377
+ { "figcaption", MARKUP_FIGCAPTION, MUTYPE_BLOCK,
378
+ AMSK_ID|AMSK_CLASS|AMSK_STYLE },
379
+ { "figure", MARKUP_FIGURE, MUTYPE_BLOCK,
380
+ AMSK_ID|AMSK_CLASS|AMSK_STYLE },
339381
{ "font", MARKUP_FONT, MUTYPE_FONT,
340382
AMSK_COLOR|AMSK_FACE|AMSK_SIZE|AMSK_STYLE },
341383
{ "footer", MARKUP_HTML5_FOOTER, MUTYPE_BLOCK,
342384
AMSK_ID|AMSK_CLASS|AMSK_STYLE },
343385
{ "h1", MARKUP_H1, MUTYPE_BLOCK,
@@ -358,29 +400,43 @@
358400
AMSK_ALIGN|AMSK_COLOR|AMSK_SIZE|AMSK_WIDTH|
359401
AMSK_STYLE|AMSK_CLASS },
360402
{ "i", MARKUP_I, MUTYPE_FONT, AMSK_STYLE },
361403
{ "img", MARKUP_IMG, MUTYPE_SINGLE,
362404
AMSK_ALIGN|AMSK_ALT|AMSK_BORDER|AMSK_HEIGHT|
363
- AMSK_HSPACE|AMSK_SRC|AMSK_VSPACE|AMSK_WIDTH|AMSK_STYLE },
405
+ AMSK_HSPACE|AMSK_SRC|AMSK_VSPACE|AMSK_WIDTH|AMSK_STYLE },
364406
{ "ins", MARKUP_INS, MUTYPE_FONT, AMSK_STYLE },
365407
{ "kbd", MARKUP_KBD, MUTYPE_FONT, AMSK_STYLE },
408
+ { "label", MARKUP_LABEL, MUTYPE_FONT,
409
+ AMSK_ID|AMSK_CLASS|AMSK_STYLE },
366410
{ "li", MARKUP_LI, MUTYPE_LI,
367411
AMSK_TYPE|AMSK_VALUE|AMSK_STYLE },
412
+ { "mark", MARKUP_MARK, MUTYPE_FONT,
413
+ AMSK_ID|AMSK_CLASS|AMSK_STYLE },
414
+ { "meter", MARKUP_METER, MUTYPE_FONT,
415
+ AMSK_ID|AMSK_CLASS|AMSK_STYLE|AMSK_VALUE },
368416
{ "nav", MARKUP_HTML5_NAV, MUTYPE_BLOCK,
369417
AMSK_ID|AMSK_CLASS|AMSK_STYLE },
370418
{ "nobr", MARKUP_NOBR, MUTYPE_FONT, 0 },
371419
{ "nowiki", MARKUP_NOWIKI, MUTYPE_SPECIAL, 0 },
372420
{ "ol", MARKUP_OL, MUTYPE_LIST,
373421
AMSK_START|AMSK_TYPE|AMSK_COMPACT|AMSK_STYLE },
374422
{ "p", MARKUP_P, MUTYPE_BLOCK,
375423
AMSK_ALIGN|AMSK_CLASS|AMSK_STYLE },
424
+ { "picture", MARKUP_PICTURE, MUTYPE_BLOCK,
425
+ AMSK_ID|AMSK_CLASS|AMSK_STYLE },
376426
{ "pre", MARKUP_PRE, MUTYPE_BLOCK, AMSK_STYLE },
427
+ { "progress", MARKUP_PROGRESS, MUTYPE_FONT,
428
+ AMSK_ID|AMSK_CLASS|AMSK_STYLE|AMSK_VALUE },
429
+ { "q", MARKUP_Q, MUTYPE_FONT,
430
+ AMSK_CLASS|AMSK_STYLE|AMSK_CITE },
377431
{ "s", MARKUP_S, MUTYPE_FONT, AMSK_STYLE },
378432
{ "samp", MARKUP_SAMP, MUTYPE_FONT, AMSK_STYLE },
379433
{ "section", MARKUP_HTML5_SECTION, MUTYPE_BLOCK,
380434
AMSK_ID|AMSK_CLASS|AMSK_STYLE },
381435
{ "small", MARKUP_SMALL, MUTYPE_FONT, AMSK_STYLE },
436
+ { "source", MARKUP_SOURCE, MUTYPE_SINGLE,
437
+ AMSK_TYPE|AMSK_ID|AMSK_CLASS|AMSK_STYLE },
382438
{ "span", MARKUP_SPAN, MUTYPE_BLOCK,
383439
AMSK_ALIGN|AMSK_CLASS|AMSK_STYLE },
384440
{ "strike", MARKUP_STRIKE, MUTYPE_FONT, AMSK_STYLE },
385441
{ "strong", MARKUP_STRONG, MUTYPE_FONT, AMSK_STYLE },
386442
{ "sub", MARKUP_SUB, MUTYPE_FONT, AMSK_STYLE },
@@ -401,18 +457,21 @@
401457
{ "th", MARKUP_TH, MUTYPE_TD,
402458
AMSK_ALIGN|AMSK_BGCOLOR|AMSK_COLSPAN|
403459
AMSK_ROWSPAN|AMSK_VALIGN|AMSK_CLASS|AMSK_STYLE },
404460
{ "thead", MARKUP_THEAD, MUTYPE_BLOCK,
405461
AMSK_ALIGN|AMSK_CLASS|AMSK_STYLE },
462
+ { "time", MARKUP_TIME, MUTYPE_FONT,
463
+ AMSK_DATETIME|AMSK_ID|AMSK_CLASS|AMSK_STYLE|AMSK_TITLE },
406464
{ "title", MARKUP_TITLE, MUTYPE_BLOCK, 0 },
407465
{ "tr", MARKUP_TR, MUTYPE_TR,
408466
AMSK_ALIGN|AMSK_BGCOLOR|AMSK_VALIGN|AMSK_CLASS|AMSK_STYLE },
409467
{ "tt", MARKUP_TT, MUTYPE_FONT, AMSK_STYLE },
410468
{ "u", MARKUP_U, MUTYPE_FONT, AMSK_STYLE },
411469
{ "ul", MARKUP_UL, MUTYPE_LIST,
412470
AMSK_TYPE|AMSK_COMPACT|AMSK_STYLE },
413471
{ "var", MARKUP_VAR, MUTYPE_FONT, AMSK_STYLE },
472
+ { "wbr", MARKUP_WBR, MUTYPE_SINGLE, 0 },
414473
{ "verbatim", MARKUP_VERBATIM, MUTYPE_SPECIAL,
415474
AMSK_ID|AMSK_TYPE },
416475
};
417476
418477
void show_allowed_wiki_markup( void ){
@@ -816,10 +875,21 @@
816875
unsigned char iACode; /* ATTR_* */
817876
char *zValue; /* Argument to this attribute. Might be NULL */
818877
char cTerm; /* Original argument termination character */
819878
} aAttr[10];
820879
};
880
+
881
+/*
882
+** Return true if attribute iACode has already been parsed into p.
883
+*/
884
+static int markupHasAttr(const ParsedMarkup *p, int iACode){
885
+ int i;
886
+ for(i=0; i<p->nAttr; i++){
887
+ if( p->aAttr[i].iACode==iACode ) return 1;
888
+ }
889
+ return 0;
890
+}
821891
822892
/*
823893
** z[] is an HTML markup element - something that begins with '<'.
824894
** Parse this element into the p structure.
825895
**
@@ -868,11 +938,11 @@
868938
if( j<(int)sizeof(zTag)-1 ) zTag[j++] = fossil_tolower(z[i]);
869939
i++;
870940
}
871941
zTag[j] = 0;
872942
p->aAttr[p->nAttr].iACode = iACode = findAttr(zTag);
873
- attrOk = iACode!=0 && (seen & aAttribute[iACode].iMask)==0;
943
+ attrOk = iACode!=0 && !markupHasAttr(p, iACode);
874944
while( fossil_isspace(z[i]) ){ z++; }
875945
if( z[i]!='=' ){
876946
p->aAttr[p->nAttr].zValue = 0;
877947
p->aAttr[p->nAttr].cTerm = 0;
878948
c = 0;
@@ -904,11 +974,11 @@
904974
}
905975
}
906976
i++;
907977
}
908978
if( attrOk ){
909
- seen |= aAttribute[iACode].iMask;
979
+ if( aAttribute[iACode].iMask ) seen |= aAttribute[iACode].iMask;
910980
p->nAttr++;
911981
}
912982
while( fossil_isspace(z[i]) ){ i++; }
913983
if( z[i]==0 || z[i]=='>' || (z[i]=='/' && z[i+1]=='>') ) break;
914984
}
@@ -1712,11 +1782,11 @@
17121782
break;
17131783
}
17141784
case TOKEN_MARKUP: {
17151785
const char *zId;
17161786
int iDiv;
1717
- int mAttr = parseMarkup(&markup, z);
1787
+ (void)parseMarkup(&markup, z);
17181788
17191789
/* Convert <title> to <h1 align='center'> */
17201790
if( markup.iCode==MARKUP_TITLE && !p->inVerbatim ){
17211791
markup.iCode = MARKUP_H1;
17221792
markup.nAttr = 1;
@@ -1801,11 +1871,11 @@
18011871
popStackToTag(p, markup.iCode);
18021872
}else
18031873
18041874
/* Push <div> markup onto the stack together with the id=ID attribute.
18051875
*/
1806
- if( markup.iCode==MARKUP_DIV && (mAttr & ATTR_ID)!=0 ){
1876
+ if( markup.iCode==MARKUP_DIV && attributeValue(&markup, ATTR_ID)!=0 ){
18071877
pushStackWithId(p, markup.iCode, markupId(&markup),
18081878
(p->state & ALLOW_WIKI)!=0);
18091879
}else
18101880
18111881
/* Enter <verbatim> processing. With verbatim enabled, all other
18121882
--- src/wikiformat.c
+++ src/wikiformat.c
@@ -68,25 +68,36 @@
68 ATTR_ALT,
69 ATTR_BGCOLOR,
70 ATTR_BORDER,
71 ATTR_CELLPADDING,
72 ATTR_CELLSPACING,
 
73 ATTR_CLASS,
74 ATTR_CLEAR,
75 ATTR_COLOR,
76 ATTR_COLSPAN,
77 ATTR_COMPACT,
 
78 ATTR_FACE,
 
79 ATTR_HEIGHT,
 
80 ATTR_HREF,
81 ATTR_HSPACE,
82 ATTR_ID,
83 ATTR_LINKS,
 
 
 
 
84 ATTR_NAME,
 
85 ATTR_ROWSPAN,
86 ATTR_SIZE,
 
87 ATTR_SRC,
 
88 ATTR_START,
89 ATTR_STYLE,
90 ATTR_TARGET,
91 ATTR_TITLE,
92 ATTR_TYPE,
@@ -124,11 +135,13 @@
124 AMSK_TITLE = 0x01000000,
125 AMSK_TYPE = 0x02000000,
126 AMSK_VALIGN = 0x04000000,
127 AMSK_VALUE = 0x08000000,
128 AMSK_VSPACE = 0x10000000,
129 AMSK_WIDTH = 0x20000000
 
 
130 };
131
132 static const struct AllowedAttribute {
133 const char *zName;
134 unsigned int iMask;
@@ -141,25 +154,36 @@
141 { "alt", AMSK_ALT },
142 { "bgcolor", AMSK_BGCOLOR },
143 { "border", AMSK_BORDER },
144 { "cellpadding", AMSK_CELLPADDING },
145 { "cellspacing", AMSK_CELLSPACING },
 
146 { "class", AMSK_CLASS },
147 { "clear", AMSK_CLEAR },
148 { "color", AMSK_COLOR },
149 { "colspan", AMSK_COLSPAN },
150 { "compact", AMSK_COMPACT },
 
151 { "face", AMSK_FACE },
 
152 { "height", AMSK_HEIGHT },
 
153 { "href", AMSK_HREF },
154 { "hspace", AMSK_HSPACE },
155 { "id", AMSK_ID },
156 { "links", AMSK_LINKS },
 
 
 
 
157 { "name", AMSK_NAME },
 
158 { "rowspan", AMSK_ROWSPAN },
159 { "size", AMSK_SIZE },
 
160 { "src", AMSK_SRC },
 
161 { "start", AMSK_START },
162 { "style", AMSK_STYLE },
163 { "target", AMSK_TARGET },
164 { "title", AMSK_TITLE },
165 { "type", AMSK_TYPE },
@@ -209,10 +233,11 @@
209 MARKUP_HTML5_ASIDE,
210 MARKUP_B,
211 MARKUP_BIG,
212 MARKUP_BLOCKQUOTE,
213 MARKUP_BR,
 
214 MARKUP_CENTER,
215 MARKUP_CITE,
216 MARKUP_CODE,
217 MARKUP_COL,
218 MARKUP_COLGROUP,
@@ -222,10 +247,12 @@
222 MARKUP_DFN,
223 MARKUP_DIV,
224 MARKUP_DL,
225 MARKUP_DT,
226 MARKUP_EM,
 
 
227 MARKUP_FONT,
228 MARKUP_HTML5_FOOTER,
229 MARKUP_H1,
230 MARKUP_H2,
231 MARKUP_H3,
@@ -236,21 +263,28 @@
236 MARKUP_HR,
237 MARKUP_I,
238 MARKUP_IMG,
239 MARKUP_INS,
240 MARKUP_KBD,
 
241 MARKUP_LI,
 
 
242 MARKUP_HTML5_NAV,
243 MARKUP_NOBR,
244 MARKUP_NOWIKI,
245 MARKUP_OL,
246 MARKUP_P,
 
247 MARKUP_PRE,
 
 
248 MARKUP_S,
249 MARKUP_SAMP,
250 MARKUP_HTML5_SECTION,
251 MARKUP_SMALL,
 
252 MARKUP_SPAN,
253 MARKUP_STRIKE,
254 MARKUP_STRONG,
255 MARKUP_SUB,
256 MARKUP_SUMMARY,
@@ -259,16 +293,18 @@
259 MARKUP_TBODY,
260 MARKUP_TD,
261 MARKUP_TFOOT,
262 MARKUP_TH,
263 MARKUP_THEAD,
 
264 MARKUP_TITLE,
265 MARKUP_TR,
266 MARKUP_TT,
267 MARKUP_U,
268 MARKUP_UL,
269 MARKUP_VAR,
 
270 MARKUP_VERBATIM
271 };
272
273 /*
274 ** The various markup is divided into the following types:
@@ -316,10 +352,12 @@
316 AMSK_ID|AMSK_CLASS|AMSK_STYLE },
317 { "b", MARKUP_B, MUTYPE_FONT, AMSK_STYLE },
318 { "big", MARKUP_BIG, MUTYPE_FONT, AMSK_STYLE },
319 { "blockquote", MARKUP_BLOCKQUOTE, MUTYPE_BLOCK, AMSK_STYLE },
320 { "br", MARKUP_BR, MUTYPE_SINGLE, AMSK_CLEAR },
 
 
321 { "center", MARKUP_CENTER, MUTYPE_BLOCK, AMSK_STYLE },
322 { "cite", MARKUP_CITE, MUTYPE_FONT, AMSK_STYLE },
323 { "code", MARKUP_CODE, MUTYPE_FONT, AMSK_STYLE },
324 { "col", MARKUP_COL, MUTYPE_SINGLE,
325 AMSK_ALIGN|AMSK_CLASS|AMSK_COLSPAN|AMSK_WIDTH|AMSK_STYLE },
@@ -334,10 +372,14 @@
334 AMSK_ID|AMSK_CLASS|AMSK_STYLE },
335 { "dl", MARKUP_DL, MUTYPE_LIST,
336 AMSK_COMPACT|AMSK_STYLE },
337 { "dt", MARKUP_DT, MUTYPE_LI, AMSK_STYLE },
338 { "em", MARKUP_EM, MUTYPE_FONT, AMSK_STYLE },
 
 
 
 
339 { "font", MARKUP_FONT, MUTYPE_FONT,
340 AMSK_COLOR|AMSK_FACE|AMSK_SIZE|AMSK_STYLE },
341 { "footer", MARKUP_HTML5_FOOTER, MUTYPE_BLOCK,
342 AMSK_ID|AMSK_CLASS|AMSK_STYLE },
343 { "h1", MARKUP_H1, MUTYPE_BLOCK,
@@ -358,29 +400,43 @@
358 AMSK_ALIGN|AMSK_COLOR|AMSK_SIZE|AMSK_WIDTH|
359 AMSK_STYLE|AMSK_CLASS },
360 { "i", MARKUP_I, MUTYPE_FONT, AMSK_STYLE },
361 { "img", MARKUP_IMG, MUTYPE_SINGLE,
362 AMSK_ALIGN|AMSK_ALT|AMSK_BORDER|AMSK_HEIGHT|
363 AMSK_HSPACE|AMSK_SRC|AMSK_VSPACE|AMSK_WIDTH|AMSK_STYLE },
364 { "ins", MARKUP_INS, MUTYPE_FONT, AMSK_STYLE },
365 { "kbd", MARKUP_KBD, MUTYPE_FONT, AMSK_STYLE },
 
 
366 { "li", MARKUP_LI, MUTYPE_LI,
367 AMSK_TYPE|AMSK_VALUE|AMSK_STYLE },
 
 
 
 
368 { "nav", MARKUP_HTML5_NAV, MUTYPE_BLOCK,
369 AMSK_ID|AMSK_CLASS|AMSK_STYLE },
370 { "nobr", MARKUP_NOBR, MUTYPE_FONT, 0 },
371 { "nowiki", MARKUP_NOWIKI, MUTYPE_SPECIAL, 0 },
372 { "ol", MARKUP_OL, MUTYPE_LIST,
373 AMSK_START|AMSK_TYPE|AMSK_COMPACT|AMSK_STYLE },
374 { "p", MARKUP_P, MUTYPE_BLOCK,
375 AMSK_ALIGN|AMSK_CLASS|AMSK_STYLE },
 
 
376 { "pre", MARKUP_PRE, MUTYPE_BLOCK, AMSK_STYLE },
 
 
 
 
377 { "s", MARKUP_S, MUTYPE_FONT, AMSK_STYLE },
378 { "samp", MARKUP_SAMP, MUTYPE_FONT, AMSK_STYLE },
379 { "section", MARKUP_HTML5_SECTION, MUTYPE_BLOCK,
380 AMSK_ID|AMSK_CLASS|AMSK_STYLE },
381 { "small", MARKUP_SMALL, MUTYPE_FONT, AMSK_STYLE },
 
 
382 { "span", MARKUP_SPAN, MUTYPE_BLOCK,
383 AMSK_ALIGN|AMSK_CLASS|AMSK_STYLE },
384 { "strike", MARKUP_STRIKE, MUTYPE_FONT, AMSK_STYLE },
385 { "strong", MARKUP_STRONG, MUTYPE_FONT, AMSK_STYLE },
386 { "sub", MARKUP_SUB, MUTYPE_FONT, AMSK_STYLE },
@@ -401,18 +457,21 @@
401 { "th", MARKUP_TH, MUTYPE_TD,
402 AMSK_ALIGN|AMSK_BGCOLOR|AMSK_COLSPAN|
403 AMSK_ROWSPAN|AMSK_VALIGN|AMSK_CLASS|AMSK_STYLE },
404 { "thead", MARKUP_THEAD, MUTYPE_BLOCK,
405 AMSK_ALIGN|AMSK_CLASS|AMSK_STYLE },
 
 
406 { "title", MARKUP_TITLE, MUTYPE_BLOCK, 0 },
407 { "tr", MARKUP_TR, MUTYPE_TR,
408 AMSK_ALIGN|AMSK_BGCOLOR|AMSK_VALIGN|AMSK_CLASS|AMSK_STYLE },
409 { "tt", MARKUP_TT, MUTYPE_FONT, AMSK_STYLE },
410 { "u", MARKUP_U, MUTYPE_FONT, AMSK_STYLE },
411 { "ul", MARKUP_UL, MUTYPE_LIST,
412 AMSK_TYPE|AMSK_COMPACT|AMSK_STYLE },
413 { "var", MARKUP_VAR, MUTYPE_FONT, AMSK_STYLE },
 
414 { "verbatim", MARKUP_VERBATIM, MUTYPE_SPECIAL,
415 AMSK_ID|AMSK_TYPE },
416 };
417
418 void show_allowed_wiki_markup( void ){
@@ -816,10 +875,21 @@
816 unsigned char iACode; /* ATTR_* */
817 char *zValue; /* Argument to this attribute. Might be NULL */
818 char cTerm; /* Original argument termination character */
819 } aAttr[10];
820 };
 
 
 
 
 
 
 
 
 
 
 
821
822 /*
823 ** z[] is an HTML markup element - something that begins with '<'.
824 ** Parse this element into the p structure.
825 **
@@ -868,11 +938,11 @@
868 if( j<(int)sizeof(zTag)-1 ) zTag[j++] = fossil_tolower(z[i]);
869 i++;
870 }
871 zTag[j] = 0;
872 p->aAttr[p->nAttr].iACode = iACode = findAttr(zTag);
873 attrOk = iACode!=0 && (seen & aAttribute[iACode].iMask)==0;
874 while( fossil_isspace(z[i]) ){ z++; }
875 if( z[i]!='=' ){
876 p->aAttr[p->nAttr].zValue = 0;
877 p->aAttr[p->nAttr].cTerm = 0;
878 c = 0;
@@ -904,11 +974,11 @@
904 }
905 }
906 i++;
907 }
908 if( attrOk ){
909 seen |= aAttribute[iACode].iMask;
910 p->nAttr++;
911 }
912 while( fossil_isspace(z[i]) ){ i++; }
913 if( z[i]==0 || z[i]=='>' || (z[i]=='/' && z[i+1]=='>') ) break;
914 }
@@ -1712,11 +1782,11 @@
1712 break;
1713 }
1714 case TOKEN_MARKUP: {
1715 const char *zId;
1716 int iDiv;
1717 int mAttr = parseMarkup(&markup, z);
1718
1719 /* Convert <title> to <h1 align='center'> */
1720 if( markup.iCode==MARKUP_TITLE && !p->inVerbatim ){
1721 markup.iCode = MARKUP_H1;
1722 markup.nAttr = 1;
@@ -1801,11 +1871,11 @@
1801 popStackToTag(p, markup.iCode);
1802 }else
1803
1804 /* Push <div> markup onto the stack together with the id=ID attribute.
1805 */
1806 if( markup.iCode==MARKUP_DIV && (mAttr & ATTR_ID)!=0 ){
1807 pushStackWithId(p, markup.iCode, markupId(&markup),
1808 (p->state & ALLOW_WIKI)!=0);
1809 }else
1810
1811 /* Enter <verbatim> processing. With verbatim enabled, all other
1812
--- src/wikiformat.c
+++ src/wikiformat.c
@@ -68,25 +68,36 @@
68 ATTR_ALT,
69 ATTR_BGCOLOR,
70 ATTR_BORDER,
71 ATTR_CELLPADDING,
72 ATTR_CELLSPACING,
73 ATTR_CITE,
74 ATTR_CLASS,
75 ATTR_CLEAR,
76 ATTR_COLOR,
77 ATTR_COLSPAN,
78 ATTR_COMPACT,
79 ATTR_DATETIME,
80 ATTR_FACE,
81 ATTR_FOR,
82 ATTR_HEIGHT,
83 ATTR_HIGH,
84 ATTR_HREF,
85 ATTR_HSPACE,
86 ATTR_ID,
87 ATTR_LINKS,
88 ATTR_LOW,
89 ATTR_MAX,
90 ATTR_MEDIA,
91 ATTR_MIN,
92 ATTR_NAME,
93 ATTR_OPTIMUM,
94 ATTR_ROWSPAN,
95 ATTR_SIZE,
96 ATTR_SIZES,
97 ATTR_SRC,
98 ATTR_SRCSET,
99 ATTR_START,
100 ATTR_STYLE,
101 ATTR_TARGET,
102 ATTR_TITLE,
103 ATTR_TYPE,
@@ -124,11 +135,13 @@
135 AMSK_TITLE = 0x01000000,
136 AMSK_TYPE = 0x02000000,
137 AMSK_VALIGN = 0x04000000,
138 AMSK_VALUE = 0x08000000,
139 AMSK_VSPACE = 0x10000000,
140 AMSK_WIDTH = 0x20000000,
141 AMSK_CITE = 0x40000000,
142 AMSK_DATETIME = 0x80000000
143 };
144
145 static const struct AllowedAttribute {
146 const char *zName;
147 unsigned int iMask;
@@ -141,25 +154,36 @@
154 { "alt", AMSK_ALT },
155 { "bgcolor", AMSK_BGCOLOR },
156 { "border", AMSK_BORDER },
157 { "cellpadding", AMSK_CELLPADDING },
158 { "cellspacing", AMSK_CELLSPACING },
159 { "cite", AMSK_CITE },
160 { "class", AMSK_CLASS },
161 { "clear", AMSK_CLEAR },
162 { "color", AMSK_COLOR },
163 { "colspan", AMSK_COLSPAN },
164 { "compact", AMSK_COMPACT },
165 { "datetime", AMSK_DATETIME },
166 { "face", AMSK_FACE },
167 { "for", 0 },
168 { "height", AMSK_HEIGHT },
169 { "high", 0 },
170 { "href", AMSK_HREF },
171 { "hspace", AMSK_HSPACE },
172 { "id", AMSK_ID },
173 { "links", AMSK_LINKS },
174 { "low", 0 },
175 { "max", 0 },
176 { "media", 0 },
177 { "min", 0 },
178 { "name", AMSK_NAME },
179 { "optimum", 0 },
180 { "rowspan", AMSK_ROWSPAN },
181 { "size", AMSK_SIZE },
182 { "sizes", 0 },
183 { "src", AMSK_SRC },
184 { "srcset", 0 },
185 { "start", AMSK_START },
186 { "style", AMSK_STYLE },
187 { "target", AMSK_TARGET },
188 { "title", AMSK_TITLE },
189 { "type", AMSK_TYPE },
@@ -209,10 +233,11 @@
233 MARKUP_HTML5_ASIDE,
234 MARKUP_B,
235 MARKUP_BIG,
236 MARKUP_BLOCKQUOTE,
237 MARKUP_BR,
238 MARKUP_CAPTION,
239 MARKUP_CENTER,
240 MARKUP_CITE,
241 MARKUP_CODE,
242 MARKUP_COL,
243 MARKUP_COLGROUP,
@@ -222,10 +247,12 @@
247 MARKUP_DFN,
248 MARKUP_DIV,
249 MARKUP_DL,
250 MARKUP_DT,
251 MARKUP_EM,
252 MARKUP_FIGCAPTION,
253 MARKUP_FIGURE,
254 MARKUP_FONT,
255 MARKUP_HTML5_FOOTER,
256 MARKUP_H1,
257 MARKUP_H2,
258 MARKUP_H3,
@@ -236,21 +263,28 @@
263 MARKUP_HR,
264 MARKUP_I,
265 MARKUP_IMG,
266 MARKUP_INS,
267 MARKUP_KBD,
268 MARKUP_LABEL,
269 MARKUP_LI,
270 MARKUP_MARK,
271 MARKUP_METER,
272 MARKUP_HTML5_NAV,
273 MARKUP_NOBR,
274 MARKUP_NOWIKI,
275 MARKUP_OL,
276 MARKUP_P,
277 MARKUP_PICTURE,
278 MARKUP_PRE,
279 MARKUP_PROGRESS,
280 MARKUP_Q,
281 MARKUP_S,
282 MARKUP_SAMP,
283 MARKUP_HTML5_SECTION,
284 MARKUP_SMALL,
285 MARKUP_SOURCE,
286 MARKUP_SPAN,
287 MARKUP_STRIKE,
288 MARKUP_STRONG,
289 MARKUP_SUB,
290 MARKUP_SUMMARY,
@@ -259,16 +293,18 @@
293 MARKUP_TBODY,
294 MARKUP_TD,
295 MARKUP_TFOOT,
296 MARKUP_TH,
297 MARKUP_THEAD,
298 MARKUP_TIME,
299 MARKUP_TITLE,
300 MARKUP_TR,
301 MARKUP_TT,
302 MARKUP_U,
303 MARKUP_UL,
304 MARKUP_VAR,
305 MARKUP_WBR,
306 MARKUP_VERBATIM
307 };
308
309 /*
310 ** The various markup is divided into the following types:
@@ -316,10 +352,12 @@
352 AMSK_ID|AMSK_CLASS|AMSK_STYLE },
353 { "b", MARKUP_B, MUTYPE_FONT, AMSK_STYLE },
354 { "big", MARKUP_BIG, MUTYPE_FONT, AMSK_STYLE },
355 { "blockquote", MARKUP_BLOCKQUOTE, MUTYPE_BLOCK, AMSK_STYLE },
356 { "br", MARKUP_BR, MUTYPE_SINGLE, AMSK_CLEAR },
357 { "caption", MARKUP_CAPTION, MUTYPE_BLOCK,
358 AMSK_ID|AMSK_CLASS|AMSK_STYLE },
359 { "center", MARKUP_CENTER, MUTYPE_BLOCK, AMSK_STYLE },
360 { "cite", MARKUP_CITE, MUTYPE_FONT, AMSK_STYLE },
361 { "code", MARKUP_CODE, MUTYPE_FONT, AMSK_STYLE },
362 { "col", MARKUP_COL, MUTYPE_SINGLE,
363 AMSK_ALIGN|AMSK_CLASS|AMSK_COLSPAN|AMSK_WIDTH|AMSK_STYLE },
@@ -334,10 +372,14 @@
372 AMSK_ID|AMSK_CLASS|AMSK_STYLE },
373 { "dl", MARKUP_DL, MUTYPE_LIST,
374 AMSK_COMPACT|AMSK_STYLE },
375 { "dt", MARKUP_DT, MUTYPE_LI, AMSK_STYLE },
376 { "em", MARKUP_EM, MUTYPE_FONT, AMSK_STYLE },
377 { "figcaption", MARKUP_FIGCAPTION, MUTYPE_BLOCK,
378 AMSK_ID|AMSK_CLASS|AMSK_STYLE },
379 { "figure", MARKUP_FIGURE, MUTYPE_BLOCK,
380 AMSK_ID|AMSK_CLASS|AMSK_STYLE },
381 { "font", MARKUP_FONT, MUTYPE_FONT,
382 AMSK_COLOR|AMSK_FACE|AMSK_SIZE|AMSK_STYLE },
383 { "footer", MARKUP_HTML5_FOOTER, MUTYPE_BLOCK,
384 AMSK_ID|AMSK_CLASS|AMSK_STYLE },
385 { "h1", MARKUP_H1, MUTYPE_BLOCK,
@@ -358,29 +400,43 @@
400 AMSK_ALIGN|AMSK_COLOR|AMSK_SIZE|AMSK_WIDTH|
401 AMSK_STYLE|AMSK_CLASS },
402 { "i", MARKUP_I, MUTYPE_FONT, AMSK_STYLE },
403 { "img", MARKUP_IMG, MUTYPE_SINGLE,
404 AMSK_ALIGN|AMSK_ALT|AMSK_BORDER|AMSK_HEIGHT|
405 AMSK_HSPACE|AMSK_SRC|AMSK_VSPACE|AMSK_WIDTH|AMSK_STYLE },
406 { "ins", MARKUP_INS, MUTYPE_FONT, AMSK_STYLE },
407 { "kbd", MARKUP_KBD, MUTYPE_FONT, AMSK_STYLE },
408 { "label", MARKUP_LABEL, MUTYPE_FONT,
409 AMSK_ID|AMSK_CLASS|AMSK_STYLE },
410 { "li", MARKUP_LI, MUTYPE_LI,
411 AMSK_TYPE|AMSK_VALUE|AMSK_STYLE },
412 { "mark", MARKUP_MARK, MUTYPE_FONT,
413 AMSK_ID|AMSK_CLASS|AMSK_STYLE },
414 { "meter", MARKUP_METER, MUTYPE_FONT,
415 AMSK_ID|AMSK_CLASS|AMSK_STYLE|AMSK_VALUE },
416 { "nav", MARKUP_HTML5_NAV, MUTYPE_BLOCK,
417 AMSK_ID|AMSK_CLASS|AMSK_STYLE },
418 { "nobr", MARKUP_NOBR, MUTYPE_FONT, 0 },
419 { "nowiki", MARKUP_NOWIKI, MUTYPE_SPECIAL, 0 },
420 { "ol", MARKUP_OL, MUTYPE_LIST,
421 AMSK_START|AMSK_TYPE|AMSK_COMPACT|AMSK_STYLE },
422 { "p", MARKUP_P, MUTYPE_BLOCK,
423 AMSK_ALIGN|AMSK_CLASS|AMSK_STYLE },
424 { "picture", MARKUP_PICTURE, MUTYPE_BLOCK,
425 AMSK_ID|AMSK_CLASS|AMSK_STYLE },
426 { "pre", MARKUP_PRE, MUTYPE_BLOCK, AMSK_STYLE },
427 { "progress", MARKUP_PROGRESS, MUTYPE_FONT,
428 AMSK_ID|AMSK_CLASS|AMSK_STYLE|AMSK_VALUE },
429 { "q", MARKUP_Q, MUTYPE_FONT,
430 AMSK_CLASS|AMSK_STYLE|AMSK_CITE },
431 { "s", MARKUP_S, MUTYPE_FONT, AMSK_STYLE },
432 { "samp", MARKUP_SAMP, MUTYPE_FONT, AMSK_STYLE },
433 { "section", MARKUP_HTML5_SECTION, MUTYPE_BLOCK,
434 AMSK_ID|AMSK_CLASS|AMSK_STYLE },
435 { "small", MARKUP_SMALL, MUTYPE_FONT, AMSK_STYLE },
436 { "source", MARKUP_SOURCE, MUTYPE_SINGLE,
437 AMSK_TYPE|AMSK_ID|AMSK_CLASS|AMSK_STYLE },
438 { "span", MARKUP_SPAN, MUTYPE_BLOCK,
439 AMSK_ALIGN|AMSK_CLASS|AMSK_STYLE },
440 { "strike", MARKUP_STRIKE, MUTYPE_FONT, AMSK_STYLE },
441 { "strong", MARKUP_STRONG, MUTYPE_FONT, AMSK_STYLE },
442 { "sub", MARKUP_SUB, MUTYPE_FONT, AMSK_STYLE },
@@ -401,18 +457,21 @@
457 { "th", MARKUP_TH, MUTYPE_TD,
458 AMSK_ALIGN|AMSK_BGCOLOR|AMSK_COLSPAN|
459 AMSK_ROWSPAN|AMSK_VALIGN|AMSK_CLASS|AMSK_STYLE },
460 { "thead", MARKUP_THEAD, MUTYPE_BLOCK,
461 AMSK_ALIGN|AMSK_CLASS|AMSK_STYLE },
462 { "time", MARKUP_TIME, MUTYPE_FONT,
463 AMSK_DATETIME|AMSK_ID|AMSK_CLASS|AMSK_STYLE|AMSK_TITLE },
464 { "title", MARKUP_TITLE, MUTYPE_BLOCK, 0 },
465 { "tr", MARKUP_TR, MUTYPE_TR,
466 AMSK_ALIGN|AMSK_BGCOLOR|AMSK_VALIGN|AMSK_CLASS|AMSK_STYLE },
467 { "tt", MARKUP_TT, MUTYPE_FONT, AMSK_STYLE },
468 { "u", MARKUP_U, MUTYPE_FONT, AMSK_STYLE },
469 { "ul", MARKUP_UL, MUTYPE_LIST,
470 AMSK_TYPE|AMSK_COMPACT|AMSK_STYLE },
471 { "var", MARKUP_VAR, MUTYPE_FONT, AMSK_STYLE },
472 { "wbr", MARKUP_WBR, MUTYPE_SINGLE, 0 },
473 { "verbatim", MARKUP_VERBATIM, MUTYPE_SPECIAL,
474 AMSK_ID|AMSK_TYPE },
475 };
476
477 void show_allowed_wiki_markup( void ){
@@ -816,10 +875,21 @@
875 unsigned char iACode; /* ATTR_* */
876 char *zValue; /* Argument to this attribute. Might be NULL */
877 char cTerm; /* Original argument termination character */
878 } aAttr[10];
879 };
880
881 /*
882 ** Return true if attribute iACode has already been parsed into p.
883 */
884 static int markupHasAttr(const ParsedMarkup *p, int iACode){
885 int i;
886 for(i=0; i<p->nAttr; i++){
887 if( p->aAttr[i].iACode==iACode ) return 1;
888 }
889 return 0;
890 }
891
892 /*
893 ** z[] is an HTML markup element - something that begins with '<'.
894 ** Parse this element into the p structure.
895 **
@@ -868,11 +938,11 @@
938 if( j<(int)sizeof(zTag)-1 ) zTag[j++] = fossil_tolower(z[i]);
939 i++;
940 }
941 zTag[j] = 0;
942 p->aAttr[p->nAttr].iACode = iACode = findAttr(zTag);
943 attrOk = iACode!=0 && !markupHasAttr(p, iACode);
944 while( fossil_isspace(z[i]) ){ z++; }
945 if( z[i]!='=' ){
946 p->aAttr[p->nAttr].zValue = 0;
947 p->aAttr[p->nAttr].cTerm = 0;
948 c = 0;
@@ -904,11 +974,11 @@
974 }
975 }
976 i++;
977 }
978 if( attrOk ){
979 if( aAttribute[iACode].iMask ) seen |= aAttribute[iACode].iMask;
980 p->nAttr++;
981 }
982 while( fossil_isspace(z[i]) ){ i++; }
983 if( z[i]==0 || z[i]=='>' || (z[i]=='/' && z[i+1]=='>') ) break;
984 }
@@ -1712,11 +1782,11 @@
1782 break;
1783 }
1784 case TOKEN_MARKUP: {
1785 const char *zId;
1786 int iDiv;
1787 (void)parseMarkup(&markup, z);
1788
1789 /* Convert <title> to <h1 align='center'> */
1790 if( markup.iCode==MARKUP_TITLE && !p->inVerbatim ){
1791 markup.iCode = MARKUP_H1;
1792 markup.nAttr = 1;
@@ -1801,11 +1871,11 @@
1871 popStackToTag(p, markup.iCode);
1872 }else
1873
1874 /* Push <div> markup onto the stack together with the id=ID attribute.
1875 */
1876 if( markup.iCode==MARKUP_DIV && attributeValue(&markup, ATTR_ID)!=0 ){
1877 pushStackWithId(p, markup.iCode, markupId(&markup),
1878 (p->state & ALLOW_WIKI)!=0);
1879 }else
1880
1881 /* Enter <verbatim> processing. With verbatim enabled, all other
1882

Keyboard Shortcuts

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