Fossil SCM

Expanded the set of "safe HTML" elements to include several harmless ones added to HTML5, which are useful in MD/wiki docs.

wyoung 2026-06-21 14:53 UTC trunk merge
Commit 6436ecf91132f81244cc6cd26896c55c130b138e1fa2f83e8c20dd6ec7662acc
3 files changed +37 -2 +16 -15 +115 -43
+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
+16 -15
--- src/wiki.wiki
+++ src/wiki.wiki
@@ -55,25 +55,26 @@
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.
7879
7980
7. <b>Special Markup.</b>
8081
--- src/wiki.wiki
+++ src/wiki.wiki
@@ -55,25 +55,26 @@
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
--- src/wiki.wiki
+++ src/wiki.wiki
@@ -55,25 +55,26 @@
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
80 7. <b>Special Markup.</b>
81
+115 -43
--- src/wikiformat.c
+++ src/wikiformat.c
@@ -68,25 +68,37 @@
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_OPEN,
94
+ ATTR_OPTIMUM,
8595
ATTR_ROWSPAN,
8696
ATTR_SIZE,
97
+ ATTR_SIZES,
8798
ATTR_SRC,
99
+ ATTR_SRCSET,
88100
ATTR_START,
89101
ATTR_STYLE,
90102
ATTR_TARGET,
91103
ATTR_TITLE,
92104
ATTR_TYPE,
@@ -94,46 +106,48 @@
94106
ATTR_VALUE,
95107
ATTR_VSPACE,
96108
ATTR_WIDTH
97109
};
98110
99
-enum amsk_t {
100
- AMSK_ALIGN = 0x00000001,
101
- AMSK_ALT = 0x00000002,
102
- AMSK_BGCOLOR = 0x00000004,
103
- AMSK_BORDER = 0x00000008,
104
- AMSK_CELLPADDING = 0x00000010,
105
- AMSK_CELLSPACING = 0x00000020,
106
- AMSK_CLASS = 0x00000040,
107
- AMSK_CLEAR = 0x00000080,
108
- AMSK_COLOR = 0x00000100,
109
- AMSK_COLSPAN = 0x00000200,
110
- AMSK_COMPACT = 0x00000400,
111
- AMSK_FACE = 0x00000800,
112
- AMSK_HEIGHT = 0x00001000,
113
- AMSK_HREF = 0x00002000,
114
- AMSK_HSPACE = 0x00004000,
115
- AMSK_ID = 0x00008000,
116
- AMSK_LINKS = 0x00010000,
117
- AMSK_NAME = 0x00020000,
118
- AMSK_ROWSPAN = 0x00040000,
119
- AMSK_SIZE = 0x00080000,
120
- AMSK_SRC = 0x00100000,
121
- AMSK_START = 0x00200000,
122
- AMSK_STYLE = 0x00400000,
123
- AMSK_TARGET = 0x00800000,
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
-};
111
+typedef uint64_t amsk_t;
112
+#define AMSK_ALIGN ((amsk_t)1 << 0)
113
+#define AMSK_ALT ((amsk_t)1 << 1)
114
+#define AMSK_BGCOLOR ((amsk_t)1 << 2)
115
+#define AMSK_BORDER ((amsk_t)1 << 3)
116
+#define AMSK_CELLPADDING ((amsk_t)1 << 4)
117
+#define AMSK_CELLSPACING ((amsk_t)1 << 5)
118
+#define AMSK_CLASS ((amsk_t)1 << 6)
119
+#define AMSK_CLEAR ((amsk_t)1 << 7)
120
+#define AMSK_COLOR ((amsk_t)1 << 8)
121
+#define AMSK_COLSPAN ((amsk_t)1 << 9)
122
+#define AMSK_COMPACT ((amsk_t)1 << 10)
123
+#define AMSK_FACE ((amsk_t)1 << 11)
124
+#define AMSK_HEIGHT ((amsk_t)1 << 12)
125
+#define AMSK_HREF ((amsk_t)1 << 13)
126
+#define AMSK_HSPACE ((amsk_t)1 << 14)
127
+#define AMSK_ID ((amsk_t)1 << 15)
128
+#define AMSK_LINKS ((amsk_t)1 << 16)
129
+#define AMSK_NAME ((amsk_t)1 << 17)
130
+#define AMSK_OPEN ((amsk_t)1 << 18)
131
+#define AMSK_ROWSPAN ((amsk_t)1 << 19)
132
+#define AMSK_SIZE ((amsk_t)1 << 20)
133
+#define AMSK_SRC ((amsk_t)1 << 21)
134
+#define AMSK_START ((amsk_t)1 << 22)
135
+#define AMSK_STYLE ((amsk_t)1 << 23)
136
+#define AMSK_TARGET ((amsk_t)1 << 24)
137
+#define AMSK_TITLE ((amsk_t)1 << 25)
138
+#define AMSK_TYPE ((amsk_t)1 << 26)
139
+#define AMSK_VALIGN ((amsk_t)1 << 27)
140
+#define AMSK_VALUE ((amsk_t)1 << 28)
141
+#define AMSK_VSPACE ((amsk_t)1 << 29)
142
+#define AMSK_WIDTH ((amsk_t)1 << 30)
143
+#define AMSK_CITE ((amsk_t)1 << 31)
144
+#define AMSK_DATETIME ((amsk_t)1 << 32)
131145
132146
static const struct AllowedAttribute {
133147
const char *zName;
134
- unsigned int iMask;
148
+ amsk_t iMask;
135149
} aAttribute[] = {
136150
/* These indexes MUST line up with their
137151
corresponding allowed_attr_t enum values.
138152
*/
139153
{ 0, 0 },
@@ -141,25 +155,37 @@
141155
{ "alt", AMSK_ALT },
142156
{ "bgcolor", AMSK_BGCOLOR },
143157
{ "border", AMSK_BORDER },
144158
{ "cellpadding", AMSK_CELLPADDING },
145159
{ "cellspacing", AMSK_CELLSPACING },
160
+ { "cite", AMSK_CITE },
146161
{ "class", AMSK_CLASS },
147162
{ "clear", AMSK_CLEAR },
148163
{ "color", AMSK_COLOR },
149164
{ "colspan", AMSK_COLSPAN },
150165
{ "compact", AMSK_COMPACT },
166
+ { "datetime", AMSK_DATETIME },
151167
{ "face", AMSK_FACE },
168
+ { "for", 0 },
152169
{ "height", AMSK_HEIGHT },
170
+ { "high", 0 },
153171
{ "href", AMSK_HREF },
154172
{ "hspace", AMSK_HSPACE },
155173
{ "id", AMSK_ID },
156174
{ "links", AMSK_LINKS },
175
+ { "low", 0 },
176
+ { "max", 0 },
177
+ { "media", 0 },
178
+ { "min", 0 },
157179
{ "name", AMSK_NAME },
180
+ { "open", AMSK_OPEN },
181
+ { "optimum", 0 },
158182
{ "rowspan", AMSK_ROWSPAN },
159183
{ "size", AMSK_SIZE },
184
+ { "sizes", 0 },
160185
{ "src", AMSK_SRC },
186
+ { "srcset", 0 },
161187
{ "start", AMSK_START },
162188
{ "style", AMSK_STYLE },
163189
{ "target", AMSK_TARGET },
164190
{ "title", AMSK_TITLE },
165191
{ "type", AMSK_TYPE },
@@ -209,10 +235,11 @@
209235
MARKUP_HTML5_ASIDE,
210236
MARKUP_B,
211237
MARKUP_BIG,
212238
MARKUP_BLOCKQUOTE,
213239
MARKUP_BR,
240
+ MARKUP_CAPTION,
214241
MARKUP_CENTER,
215242
MARKUP_CITE,
216243
MARKUP_CODE,
217244
MARKUP_COL,
218245
MARKUP_COLGROUP,
@@ -222,10 +249,12 @@
222249
MARKUP_DFN,
223250
MARKUP_DIV,
224251
MARKUP_DL,
225252
MARKUP_DT,
226253
MARKUP_EM,
254
+ MARKUP_FIGCAPTION,
255
+ MARKUP_FIGURE,
227256
MARKUP_FONT,
228257
MARKUP_HTML5_FOOTER,
229258
MARKUP_H1,
230259
MARKUP_H2,
231260
MARKUP_H3,
@@ -236,21 +265,28 @@
236265
MARKUP_HR,
237266
MARKUP_I,
238267
MARKUP_IMG,
239268
MARKUP_INS,
240269
MARKUP_KBD,
270
+ MARKUP_LABEL,
241271
MARKUP_LI,
272
+ MARKUP_MARK,
273
+ MARKUP_METER,
242274
MARKUP_HTML5_NAV,
243275
MARKUP_NOBR,
244276
MARKUP_NOWIKI,
245277
MARKUP_OL,
246278
MARKUP_P,
279
+ MARKUP_PICTURE,
247280
MARKUP_PRE,
281
+ MARKUP_PROGRESS,
282
+ MARKUP_Q,
248283
MARKUP_S,
249284
MARKUP_SAMP,
250285
MARKUP_HTML5_SECTION,
251286
MARKUP_SMALL,
287
+ MARKUP_SOURCE,
252288
MARKUP_SPAN,
253289
MARKUP_STRIKE,
254290
MARKUP_STRONG,
255291
MARKUP_SUB,
256292
MARKUP_SUMMARY,
@@ -259,16 +295,18 @@
259295
MARKUP_TBODY,
260296
MARKUP_TD,
261297
MARKUP_TFOOT,
262298
MARKUP_TH,
263299
MARKUP_THEAD,
300
+ MARKUP_TIME,
264301
MARKUP_TITLE,
265302
MARKUP_TR,
266303
MARKUP_TT,
267304
MARKUP_U,
268305
MARKUP_UL,
269306
MARKUP_VAR,
307
+ MARKUP_WBR,
270308
MARKUP_VERBATIM
271309
};
272310
273311
/*
274312
** The various markup is divided into the following types:
@@ -299,11 +337,11 @@
299337
300338
static const struct AllowedMarkup {
301339
const char *zName; /* Name of the markup */
302340
char iCode; /* The MARKUP_* code */
303341
short int iType; /* The MUTYPE_* code */
304
- int allowedAttr; /* Allowed attributes on this markup */
342
+ amsk_t allowedAttr; /* Allowed attributes on this markup */
305343
} aMarkup[] = {
306344
{ 0, MARKUP_INVALID, 0, 0 },
307345
{ "a", MARKUP_A, MUTYPE_HYPERLINK,
308346
AMSK_HREF|AMSK_NAME|AMSK_CLASS|AMSK_TARGET|AMSK_STYLE|
309347
AMSK_TITLE},
@@ -316,10 +354,12 @@
316354
AMSK_ID|AMSK_CLASS|AMSK_STYLE },
317355
{ "b", MARKUP_B, MUTYPE_FONT, AMSK_STYLE },
318356
{ "big", MARKUP_BIG, MUTYPE_FONT, AMSK_STYLE },
319357
{ "blockquote", MARKUP_BLOCKQUOTE, MUTYPE_BLOCK, AMSK_STYLE },
320358
{ "br", MARKUP_BR, MUTYPE_SINGLE, AMSK_CLEAR },
359
+ { "caption", MARKUP_CAPTION, MUTYPE_BLOCK,
360
+ AMSK_ID|AMSK_CLASS|AMSK_STYLE },
321361
{ "center", MARKUP_CENTER, MUTYPE_BLOCK, AMSK_STYLE },
322362
{ "cite", MARKUP_CITE, MUTYPE_FONT, AMSK_STYLE },
323363
{ "code", MARKUP_CODE, MUTYPE_FONT, AMSK_STYLE },
324364
{ "col", MARKUP_COL, MUTYPE_SINGLE,
325365
AMSK_ALIGN|AMSK_CLASS|AMSK_COLSPAN|AMSK_WIDTH|AMSK_STYLE },
@@ -326,18 +366,22 @@
326366
{ "colgroup", MARKUP_COLGROUP, MUTYPE_BLOCK,
327367
AMSK_ALIGN|AMSK_CLASS|AMSK_COLSPAN|AMSK_WIDTH|AMSK_STYLE},
328368
{ "dd", MARKUP_DD, MUTYPE_LI, AMSK_STYLE },
329369
{ "del", MARKUP_DEL, MUTYPE_FONT, AMSK_STYLE },
330370
{ "details", MARKUP_DETAILS, MUTYPE_BLOCK,
331
- AMSK_ID|AMSK_CLASS|AMSK_STYLE },
371
+ AMSK_ID|AMSK_CLASS|AMSK_STYLE|AMSK_OPEN },
332372
{ "dfn", MARKUP_DFN, MUTYPE_FONT, AMSK_STYLE },
333373
{ "div", MARKUP_DIV, MUTYPE_BLOCK,
334374
AMSK_ID|AMSK_CLASS|AMSK_STYLE },
335375
{ "dl", MARKUP_DL, MUTYPE_LIST,
336376
AMSK_COMPACT|AMSK_STYLE },
337377
{ "dt", MARKUP_DT, MUTYPE_LI, AMSK_STYLE },
338378
{ "em", MARKUP_EM, MUTYPE_FONT, AMSK_STYLE },
379
+ { "figcaption", MARKUP_FIGCAPTION, MUTYPE_BLOCK,
380
+ AMSK_ID|AMSK_CLASS|AMSK_STYLE },
381
+ { "figure", MARKUP_FIGURE, MUTYPE_BLOCK,
382
+ AMSK_ID|AMSK_CLASS|AMSK_STYLE },
339383
{ "font", MARKUP_FONT, MUTYPE_FONT,
340384
AMSK_COLOR|AMSK_FACE|AMSK_SIZE|AMSK_STYLE },
341385
{ "footer", MARKUP_HTML5_FOOTER, MUTYPE_BLOCK,
342386
AMSK_ID|AMSK_CLASS|AMSK_STYLE },
343387
{ "h1", MARKUP_H1, MUTYPE_BLOCK,
@@ -358,29 +402,43 @@
358402
AMSK_ALIGN|AMSK_COLOR|AMSK_SIZE|AMSK_WIDTH|
359403
AMSK_STYLE|AMSK_CLASS },
360404
{ "i", MARKUP_I, MUTYPE_FONT, AMSK_STYLE },
361405
{ "img", MARKUP_IMG, MUTYPE_SINGLE,
362406
AMSK_ALIGN|AMSK_ALT|AMSK_BORDER|AMSK_HEIGHT|
363
- AMSK_HSPACE|AMSK_SRC|AMSK_VSPACE|AMSK_WIDTH|AMSK_STYLE },
407
+ AMSK_HSPACE|AMSK_SRC|AMSK_VSPACE|AMSK_WIDTH|AMSK_STYLE },
364408
{ "ins", MARKUP_INS, MUTYPE_FONT, AMSK_STYLE },
365409
{ "kbd", MARKUP_KBD, MUTYPE_FONT, AMSK_STYLE },
410
+ { "label", MARKUP_LABEL, MUTYPE_FONT,
411
+ AMSK_ID|AMSK_CLASS|AMSK_STYLE },
366412
{ "li", MARKUP_LI, MUTYPE_LI,
367413
AMSK_TYPE|AMSK_VALUE|AMSK_STYLE },
414
+ { "mark", MARKUP_MARK, MUTYPE_FONT,
415
+ AMSK_ID|AMSK_CLASS|AMSK_STYLE },
416
+ { "meter", MARKUP_METER, MUTYPE_FONT,
417
+ AMSK_ID|AMSK_CLASS|AMSK_STYLE|AMSK_VALUE },
368418
{ "nav", MARKUP_HTML5_NAV, MUTYPE_BLOCK,
369419
AMSK_ID|AMSK_CLASS|AMSK_STYLE },
370420
{ "nobr", MARKUP_NOBR, MUTYPE_FONT, 0 },
371421
{ "nowiki", MARKUP_NOWIKI, MUTYPE_SPECIAL, 0 },
372422
{ "ol", MARKUP_OL, MUTYPE_LIST,
373423
AMSK_START|AMSK_TYPE|AMSK_COMPACT|AMSK_STYLE },
374424
{ "p", MARKUP_P, MUTYPE_BLOCK,
375425
AMSK_ALIGN|AMSK_CLASS|AMSK_STYLE },
426
+ { "picture", MARKUP_PICTURE, MUTYPE_BLOCK,
427
+ AMSK_ID|AMSK_CLASS|AMSK_STYLE },
376428
{ "pre", MARKUP_PRE, MUTYPE_BLOCK, AMSK_STYLE },
429
+ { "progress", MARKUP_PROGRESS, MUTYPE_FONT,
430
+ AMSK_ID|AMSK_CLASS|AMSK_STYLE|AMSK_VALUE },
431
+ { "q", MARKUP_Q, MUTYPE_FONT,
432
+ AMSK_CLASS|AMSK_STYLE|AMSK_CITE },
377433
{ "s", MARKUP_S, MUTYPE_FONT, AMSK_STYLE },
378434
{ "samp", MARKUP_SAMP, MUTYPE_FONT, AMSK_STYLE },
379435
{ "section", MARKUP_HTML5_SECTION, MUTYPE_BLOCK,
380436
AMSK_ID|AMSK_CLASS|AMSK_STYLE },
381437
{ "small", MARKUP_SMALL, MUTYPE_FONT, AMSK_STYLE },
438
+ { "source", MARKUP_SOURCE, MUTYPE_SINGLE,
439
+ AMSK_TYPE|AMSK_ID|AMSK_CLASS|AMSK_STYLE },
382440
{ "span", MARKUP_SPAN, MUTYPE_BLOCK,
383441
AMSK_ALIGN|AMSK_CLASS|AMSK_STYLE },
384442
{ "strike", MARKUP_STRIKE, MUTYPE_FONT, AMSK_STYLE },
385443
{ "strong", MARKUP_STRONG, MUTYPE_FONT, AMSK_STYLE },
386444
{ "sub", MARKUP_SUB, MUTYPE_FONT, AMSK_STYLE },
@@ -401,18 +459,21 @@
401459
{ "th", MARKUP_TH, MUTYPE_TD,
402460
AMSK_ALIGN|AMSK_BGCOLOR|AMSK_COLSPAN|
403461
AMSK_ROWSPAN|AMSK_VALIGN|AMSK_CLASS|AMSK_STYLE },
404462
{ "thead", MARKUP_THEAD, MUTYPE_BLOCK,
405463
AMSK_ALIGN|AMSK_CLASS|AMSK_STYLE },
464
+ { "time", MARKUP_TIME, MUTYPE_FONT,
465
+ AMSK_DATETIME|AMSK_ID|AMSK_CLASS|AMSK_STYLE|AMSK_TITLE },
406466
{ "title", MARKUP_TITLE, MUTYPE_BLOCK, 0 },
407467
{ "tr", MARKUP_TR, MUTYPE_TR,
408468
AMSK_ALIGN|AMSK_BGCOLOR|AMSK_VALIGN|AMSK_CLASS|AMSK_STYLE },
409469
{ "tt", MARKUP_TT, MUTYPE_FONT, AMSK_STYLE },
410470
{ "u", MARKUP_U, MUTYPE_FONT, AMSK_STYLE },
411471
{ "ul", MARKUP_UL, MUTYPE_LIST,
412472
AMSK_TYPE|AMSK_COMPACT|AMSK_STYLE },
413473
{ "var", MARKUP_VAR, MUTYPE_FONT, AMSK_STYLE },
474
+ { "wbr", MARKUP_WBR, MUTYPE_SINGLE, 0 },
414475
{ "verbatim", MARKUP_VERBATIM, MUTYPE_SPECIAL,
415476
AMSK_ID|AMSK_TYPE },
416477
};
417478
418479
void show_allowed_wiki_markup( void ){
@@ -816,23 +877,34 @@
816877
unsigned char iACode; /* ATTR_* */
817878
char *zValue; /* Argument to this attribute. Might be NULL */
818879
char cTerm; /* Original argument termination character */
819880
} aAttr[10];
820881
};
882
+
883
+/*
884
+** Return true if attribute iACode has already been parsed into p.
885
+*/
886
+static int markupHasAttr(const ParsedMarkup *p, int iACode){
887
+ int i;
888
+ for(i=0; i<p->nAttr; i++){
889
+ if( p->aAttr[i].iACode==iACode ) return 1;
890
+ }
891
+ return 0;
892
+}
821893
822894
/*
823895
** z[] is an HTML markup element - something that begins with '<'.
824896
** Parse this element into the p structure.
825897
**
826898
** The content of z[] might be modified by converting characters
827899
** to lowercase and by inserting some "\000" characters.
828900
*/
829
-static int parseMarkup(ParsedMarkup *p, char *z){
901
+static amsk_t parseMarkup(ParsedMarkup *p, char *z){
830902
int i, j, c;
831903
int iACode;
832904
char *zValue;
833
- int seen = 0;
905
+ amsk_t seen = 0;
834906
char zTag[100];
835907
836908
if( z[1]=='/' ){
837909
p->endTag = 1;
838910
i = 2;
@@ -868,11 +940,11 @@
868940
if( j<(int)sizeof(zTag)-1 ) zTag[j++] = fossil_tolower(z[i]);
869941
i++;
870942
}
871943
zTag[j] = 0;
872944
p->aAttr[p->nAttr].iACode = iACode = findAttr(zTag);
873
- attrOk = iACode!=0 && (seen & aAttribute[iACode].iMask)==0;
945
+ attrOk = iACode!=0 && !markupHasAttr(p, iACode);
874946
while( fossil_isspace(z[i]) ){ z++; }
875947
if( z[i]!='=' ){
876948
p->aAttr[p->nAttr].zValue = 0;
877949
p->aAttr[p->nAttr].cTerm = 0;
878950
c = 0;
@@ -904,11 +976,11 @@
904976
}
905977
}
906978
i++;
907979
}
908980
if( attrOk ){
909
- seen |= aAttribute[iACode].iMask;
981
+ if( aAttribute[iACode].iMask ) seen |= aAttribute[iACode].iMask;
910982
p->nAttr++;
911983
}
912984
while( fossil_isspace(z[i]) ){ i++; }
913985
if( z[i]==0 || z[i]=='>' || (z[i]=='/' && z[i+1]=='>') ) break;
914986
}
@@ -1712,17 +1784,17 @@
17121784
break;
17131785
}
17141786
case TOKEN_MARKUP: {
17151787
const char *zId;
17161788
int iDiv;
1717
- int mAttr = parseMarkup(&markup, z);
1789
+ (void)parseMarkup(&markup, z);
17181790
17191791
/* Convert <title> to <h1 align='center'> */
17201792
if( markup.iCode==MARKUP_TITLE && !p->inVerbatim ){
17211793
markup.iCode = MARKUP_H1;
17221794
markup.nAttr = 1;
1723
- markup.aAttr[0].iACode = AMSK_ALIGN;
1795
+ markup.aAttr[0].iACode = ATTR_ALIGN;
17241796
markup.aAttr[0].zValue = "center";
17251797
markup.aAttr[0].cTerm = 0;
17261798
}
17271799
17281800
/* Markup of the form </div id=ID> where there is a matching
@@ -1801,11 +1873,11 @@
18011873
popStackToTag(p, markup.iCode);
18021874
}else
18031875
18041876
/* Push <div> markup onto the stack together with the id=ID attribute.
18051877
*/
1806
- if( markup.iCode==MARKUP_DIV && (mAttr & ATTR_ID)!=0 ){
1878
+ if( markup.iCode==MARKUP_DIV && attributeValue(&markup, ATTR_ID)!=0 ){
18071879
pushStackWithId(p, markup.iCode, markupId(&markup),
18081880
(p->state & ALLOW_WIKI)!=0);
18091881
}else
18101882
18111883
/* Enter <verbatim> processing. With verbatim enabled, all other
18121884
--- src/wikiformat.c
+++ src/wikiformat.c
@@ -68,25 +68,37 @@
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,
@@ -94,46 +106,48 @@
94 ATTR_VALUE,
95 ATTR_VSPACE,
96 ATTR_WIDTH
97 };
98
99 enum amsk_t {
100 AMSK_ALIGN = 0x00000001,
101 AMSK_ALT = 0x00000002,
102 AMSK_BGCOLOR = 0x00000004,
103 AMSK_BORDER = 0x00000008,
104 AMSK_CELLPADDING = 0x00000010,
105 AMSK_CELLSPACING = 0x00000020,
106 AMSK_CLASS = 0x00000040,
107 AMSK_CLEAR = 0x00000080,
108 AMSK_COLOR = 0x00000100,
109 AMSK_COLSPAN = 0x00000200,
110 AMSK_COMPACT = 0x00000400,
111 AMSK_FACE = 0x00000800,
112 AMSK_HEIGHT = 0x00001000,
113 AMSK_HREF = 0x00002000,
114 AMSK_HSPACE = 0x00004000,
115 AMSK_ID = 0x00008000,
116 AMSK_LINKS = 0x00010000,
117 AMSK_NAME = 0x00020000,
118 AMSK_ROWSPAN = 0x00040000,
119 AMSK_SIZE = 0x00080000,
120 AMSK_SRC = 0x00100000,
121 AMSK_START = 0x00200000,
122 AMSK_STYLE = 0x00400000,
123 AMSK_TARGET = 0x00800000,
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;
135 } aAttribute[] = {
136 /* These indexes MUST line up with their
137 corresponding allowed_attr_t enum values.
138 */
139 { 0, 0 },
@@ -141,25 +155,37 @@
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 +235,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 +249,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 +265,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 +295,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:
@@ -299,11 +337,11 @@
299
300 static const struct AllowedMarkup {
301 const char *zName; /* Name of the markup */
302 char iCode; /* The MARKUP_* code */
303 short int iType; /* The MUTYPE_* code */
304 int allowedAttr; /* Allowed attributes on this markup */
305 } aMarkup[] = {
306 { 0, MARKUP_INVALID, 0, 0 },
307 { "a", MARKUP_A, MUTYPE_HYPERLINK,
308 AMSK_HREF|AMSK_NAME|AMSK_CLASS|AMSK_TARGET|AMSK_STYLE|
309 AMSK_TITLE},
@@ -316,10 +354,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 },
@@ -326,18 +366,22 @@
326 { "colgroup", MARKUP_COLGROUP, MUTYPE_BLOCK,
327 AMSK_ALIGN|AMSK_CLASS|AMSK_COLSPAN|AMSK_WIDTH|AMSK_STYLE},
328 { "dd", MARKUP_DD, MUTYPE_LI, AMSK_STYLE },
329 { "del", MARKUP_DEL, MUTYPE_FONT, AMSK_STYLE },
330 { "details", MARKUP_DETAILS, MUTYPE_BLOCK,
331 AMSK_ID|AMSK_CLASS|AMSK_STYLE },
332 { "dfn", MARKUP_DFN, MUTYPE_FONT, AMSK_STYLE },
333 { "div", MARKUP_DIV, MUTYPE_BLOCK,
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 +402,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 +459,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,23 +877,34 @@
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 **
826 ** The content of z[] might be modified by converting characters
827 ** to lowercase and by inserting some "\000" characters.
828 */
829 static int parseMarkup(ParsedMarkup *p, char *z){
830 int i, j, c;
831 int iACode;
832 char *zValue;
833 int seen = 0;
834 char zTag[100];
835
836 if( z[1]=='/' ){
837 p->endTag = 1;
838 i = 2;
@@ -868,11 +940,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 +976,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,17 +1784,17 @@
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;
1723 markup.aAttr[0].iACode = AMSK_ALIGN;
1724 markup.aAttr[0].zValue = "center";
1725 markup.aAttr[0].cTerm = 0;
1726 }
1727
1728 /* Markup of the form </div id=ID> where there is a matching
@@ -1801,11 +1873,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,37 @@
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_OPEN,
94 ATTR_OPTIMUM,
95 ATTR_ROWSPAN,
96 ATTR_SIZE,
97 ATTR_SIZES,
98 ATTR_SRC,
99 ATTR_SRCSET,
100 ATTR_START,
101 ATTR_STYLE,
102 ATTR_TARGET,
103 ATTR_TITLE,
104 ATTR_TYPE,
@@ -94,46 +106,48 @@
106 ATTR_VALUE,
107 ATTR_VSPACE,
108 ATTR_WIDTH
109 };
110
111 typedef uint64_t amsk_t;
112 #define AMSK_ALIGN ((amsk_t)1 << 0)
113 #define AMSK_ALT ((amsk_t)1 << 1)
114 #define AMSK_BGCOLOR ((amsk_t)1 << 2)
115 #define AMSK_BORDER ((amsk_t)1 << 3)
116 #define AMSK_CELLPADDING ((amsk_t)1 << 4)
117 #define AMSK_CELLSPACING ((amsk_t)1 << 5)
118 #define AMSK_CLASS ((amsk_t)1 << 6)
119 #define AMSK_CLEAR ((amsk_t)1 << 7)
120 #define AMSK_COLOR ((amsk_t)1 << 8)
121 #define AMSK_COLSPAN ((amsk_t)1 << 9)
122 #define AMSK_COMPACT ((amsk_t)1 << 10)
123 #define AMSK_FACE ((amsk_t)1 << 11)
124 #define AMSK_HEIGHT ((amsk_t)1 << 12)
125 #define AMSK_HREF ((amsk_t)1 << 13)
126 #define AMSK_HSPACE ((amsk_t)1 << 14)
127 #define AMSK_ID ((amsk_t)1 << 15)
128 #define AMSK_LINKS ((amsk_t)1 << 16)
129 #define AMSK_NAME ((amsk_t)1 << 17)
130 #define AMSK_OPEN ((amsk_t)1 << 18)
131 #define AMSK_ROWSPAN ((amsk_t)1 << 19)
132 #define AMSK_SIZE ((amsk_t)1 << 20)
133 #define AMSK_SRC ((amsk_t)1 << 21)
134 #define AMSK_START ((amsk_t)1 << 22)
135 #define AMSK_STYLE ((amsk_t)1 << 23)
136 #define AMSK_TARGET ((amsk_t)1 << 24)
137 #define AMSK_TITLE ((amsk_t)1 << 25)
138 #define AMSK_TYPE ((amsk_t)1 << 26)
139 #define AMSK_VALIGN ((amsk_t)1 << 27)
140 #define AMSK_VALUE ((amsk_t)1 << 28)
141 #define AMSK_VSPACE ((amsk_t)1 << 29)
142 #define AMSK_WIDTH ((amsk_t)1 << 30)
143 #define AMSK_CITE ((amsk_t)1 << 31)
144 #define AMSK_DATETIME ((amsk_t)1 << 32)
145
146 static const struct AllowedAttribute {
147 const char *zName;
148 amsk_t iMask;
149 } aAttribute[] = {
150 /* These indexes MUST line up with their
151 corresponding allowed_attr_t enum values.
152 */
153 { 0, 0 },
@@ -141,25 +155,37 @@
155 { "alt", AMSK_ALT },
156 { "bgcolor", AMSK_BGCOLOR },
157 { "border", AMSK_BORDER },
158 { "cellpadding", AMSK_CELLPADDING },
159 { "cellspacing", AMSK_CELLSPACING },
160 { "cite", AMSK_CITE },
161 { "class", AMSK_CLASS },
162 { "clear", AMSK_CLEAR },
163 { "color", AMSK_COLOR },
164 { "colspan", AMSK_COLSPAN },
165 { "compact", AMSK_COMPACT },
166 { "datetime", AMSK_DATETIME },
167 { "face", AMSK_FACE },
168 { "for", 0 },
169 { "height", AMSK_HEIGHT },
170 { "high", 0 },
171 { "href", AMSK_HREF },
172 { "hspace", AMSK_HSPACE },
173 { "id", AMSK_ID },
174 { "links", AMSK_LINKS },
175 { "low", 0 },
176 { "max", 0 },
177 { "media", 0 },
178 { "min", 0 },
179 { "name", AMSK_NAME },
180 { "open", AMSK_OPEN },
181 { "optimum", 0 },
182 { "rowspan", AMSK_ROWSPAN },
183 { "size", AMSK_SIZE },
184 { "sizes", 0 },
185 { "src", AMSK_SRC },
186 { "srcset", 0 },
187 { "start", AMSK_START },
188 { "style", AMSK_STYLE },
189 { "target", AMSK_TARGET },
190 { "title", AMSK_TITLE },
191 { "type", AMSK_TYPE },
@@ -209,10 +235,11 @@
235 MARKUP_HTML5_ASIDE,
236 MARKUP_B,
237 MARKUP_BIG,
238 MARKUP_BLOCKQUOTE,
239 MARKUP_BR,
240 MARKUP_CAPTION,
241 MARKUP_CENTER,
242 MARKUP_CITE,
243 MARKUP_CODE,
244 MARKUP_COL,
245 MARKUP_COLGROUP,
@@ -222,10 +249,12 @@
249 MARKUP_DFN,
250 MARKUP_DIV,
251 MARKUP_DL,
252 MARKUP_DT,
253 MARKUP_EM,
254 MARKUP_FIGCAPTION,
255 MARKUP_FIGURE,
256 MARKUP_FONT,
257 MARKUP_HTML5_FOOTER,
258 MARKUP_H1,
259 MARKUP_H2,
260 MARKUP_H3,
@@ -236,21 +265,28 @@
265 MARKUP_HR,
266 MARKUP_I,
267 MARKUP_IMG,
268 MARKUP_INS,
269 MARKUP_KBD,
270 MARKUP_LABEL,
271 MARKUP_LI,
272 MARKUP_MARK,
273 MARKUP_METER,
274 MARKUP_HTML5_NAV,
275 MARKUP_NOBR,
276 MARKUP_NOWIKI,
277 MARKUP_OL,
278 MARKUP_P,
279 MARKUP_PICTURE,
280 MARKUP_PRE,
281 MARKUP_PROGRESS,
282 MARKUP_Q,
283 MARKUP_S,
284 MARKUP_SAMP,
285 MARKUP_HTML5_SECTION,
286 MARKUP_SMALL,
287 MARKUP_SOURCE,
288 MARKUP_SPAN,
289 MARKUP_STRIKE,
290 MARKUP_STRONG,
291 MARKUP_SUB,
292 MARKUP_SUMMARY,
@@ -259,16 +295,18 @@
295 MARKUP_TBODY,
296 MARKUP_TD,
297 MARKUP_TFOOT,
298 MARKUP_TH,
299 MARKUP_THEAD,
300 MARKUP_TIME,
301 MARKUP_TITLE,
302 MARKUP_TR,
303 MARKUP_TT,
304 MARKUP_U,
305 MARKUP_UL,
306 MARKUP_VAR,
307 MARKUP_WBR,
308 MARKUP_VERBATIM
309 };
310
311 /*
312 ** The various markup is divided into the following types:
@@ -299,11 +337,11 @@
337
338 static const struct AllowedMarkup {
339 const char *zName; /* Name of the markup */
340 char iCode; /* The MARKUP_* code */
341 short int iType; /* The MUTYPE_* code */
342 amsk_t allowedAttr; /* Allowed attributes on this markup */
343 } aMarkup[] = {
344 { 0, MARKUP_INVALID, 0, 0 },
345 { "a", MARKUP_A, MUTYPE_HYPERLINK,
346 AMSK_HREF|AMSK_NAME|AMSK_CLASS|AMSK_TARGET|AMSK_STYLE|
347 AMSK_TITLE},
@@ -316,10 +354,12 @@
354 AMSK_ID|AMSK_CLASS|AMSK_STYLE },
355 { "b", MARKUP_B, MUTYPE_FONT, AMSK_STYLE },
356 { "big", MARKUP_BIG, MUTYPE_FONT, AMSK_STYLE },
357 { "blockquote", MARKUP_BLOCKQUOTE, MUTYPE_BLOCK, AMSK_STYLE },
358 { "br", MARKUP_BR, MUTYPE_SINGLE, AMSK_CLEAR },
359 { "caption", MARKUP_CAPTION, MUTYPE_BLOCK,
360 AMSK_ID|AMSK_CLASS|AMSK_STYLE },
361 { "center", MARKUP_CENTER, MUTYPE_BLOCK, AMSK_STYLE },
362 { "cite", MARKUP_CITE, MUTYPE_FONT, AMSK_STYLE },
363 { "code", MARKUP_CODE, MUTYPE_FONT, AMSK_STYLE },
364 { "col", MARKUP_COL, MUTYPE_SINGLE,
365 AMSK_ALIGN|AMSK_CLASS|AMSK_COLSPAN|AMSK_WIDTH|AMSK_STYLE },
@@ -326,18 +366,22 @@
366 { "colgroup", MARKUP_COLGROUP, MUTYPE_BLOCK,
367 AMSK_ALIGN|AMSK_CLASS|AMSK_COLSPAN|AMSK_WIDTH|AMSK_STYLE},
368 { "dd", MARKUP_DD, MUTYPE_LI, AMSK_STYLE },
369 { "del", MARKUP_DEL, MUTYPE_FONT, AMSK_STYLE },
370 { "details", MARKUP_DETAILS, MUTYPE_BLOCK,
371 AMSK_ID|AMSK_CLASS|AMSK_STYLE|AMSK_OPEN },
372 { "dfn", MARKUP_DFN, MUTYPE_FONT, AMSK_STYLE },
373 { "div", MARKUP_DIV, MUTYPE_BLOCK,
374 AMSK_ID|AMSK_CLASS|AMSK_STYLE },
375 { "dl", MARKUP_DL, MUTYPE_LIST,
376 AMSK_COMPACT|AMSK_STYLE },
377 { "dt", MARKUP_DT, MUTYPE_LI, AMSK_STYLE },
378 { "em", MARKUP_EM, MUTYPE_FONT, AMSK_STYLE },
379 { "figcaption", MARKUP_FIGCAPTION, MUTYPE_BLOCK,
380 AMSK_ID|AMSK_CLASS|AMSK_STYLE },
381 { "figure", MARKUP_FIGURE, MUTYPE_BLOCK,
382 AMSK_ID|AMSK_CLASS|AMSK_STYLE },
383 { "font", MARKUP_FONT, MUTYPE_FONT,
384 AMSK_COLOR|AMSK_FACE|AMSK_SIZE|AMSK_STYLE },
385 { "footer", MARKUP_HTML5_FOOTER, MUTYPE_BLOCK,
386 AMSK_ID|AMSK_CLASS|AMSK_STYLE },
387 { "h1", MARKUP_H1, MUTYPE_BLOCK,
@@ -358,29 +402,43 @@
402 AMSK_ALIGN|AMSK_COLOR|AMSK_SIZE|AMSK_WIDTH|
403 AMSK_STYLE|AMSK_CLASS },
404 { "i", MARKUP_I, MUTYPE_FONT, AMSK_STYLE },
405 { "img", MARKUP_IMG, MUTYPE_SINGLE,
406 AMSK_ALIGN|AMSK_ALT|AMSK_BORDER|AMSK_HEIGHT|
407 AMSK_HSPACE|AMSK_SRC|AMSK_VSPACE|AMSK_WIDTH|AMSK_STYLE },
408 { "ins", MARKUP_INS, MUTYPE_FONT, AMSK_STYLE },
409 { "kbd", MARKUP_KBD, MUTYPE_FONT, AMSK_STYLE },
410 { "label", MARKUP_LABEL, MUTYPE_FONT,
411 AMSK_ID|AMSK_CLASS|AMSK_STYLE },
412 { "li", MARKUP_LI, MUTYPE_LI,
413 AMSK_TYPE|AMSK_VALUE|AMSK_STYLE },
414 { "mark", MARKUP_MARK, MUTYPE_FONT,
415 AMSK_ID|AMSK_CLASS|AMSK_STYLE },
416 { "meter", MARKUP_METER, MUTYPE_FONT,
417 AMSK_ID|AMSK_CLASS|AMSK_STYLE|AMSK_VALUE },
418 { "nav", MARKUP_HTML5_NAV, MUTYPE_BLOCK,
419 AMSK_ID|AMSK_CLASS|AMSK_STYLE },
420 { "nobr", MARKUP_NOBR, MUTYPE_FONT, 0 },
421 { "nowiki", MARKUP_NOWIKI, MUTYPE_SPECIAL, 0 },
422 { "ol", MARKUP_OL, MUTYPE_LIST,
423 AMSK_START|AMSK_TYPE|AMSK_COMPACT|AMSK_STYLE },
424 { "p", MARKUP_P, MUTYPE_BLOCK,
425 AMSK_ALIGN|AMSK_CLASS|AMSK_STYLE },
426 { "picture", MARKUP_PICTURE, MUTYPE_BLOCK,
427 AMSK_ID|AMSK_CLASS|AMSK_STYLE },
428 { "pre", MARKUP_PRE, MUTYPE_BLOCK, AMSK_STYLE },
429 { "progress", MARKUP_PROGRESS, MUTYPE_FONT,
430 AMSK_ID|AMSK_CLASS|AMSK_STYLE|AMSK_VALUE },
431 { "q", MARKUP_Q, MUTYPE_FONT,
432 AMSK_CLASS|AMSK_STYLE|AMSK_CITE },
433 { "s", MARKUP_S, MUTYPE_FONT, AMSK_STYLE },
434 { "samp", MARKUP_SAMP, MUTYPE_FONT, AMSK_STYLE },
435 { "section", MARKUP_HTML5_SECTION, MUTYPE_BLOCK,
436 AMSK_ID|AMSK_CLASS|AMSK_STYLE },
437 { "small", MARKUP_SMALL, MUTYPE_FONT, AMSK_STYLE },
438 { "source", MARKUP_SOURCE, MUTYPE_SINGLE,
439 AMSK_TYPE|AMSK_ID|AMSK_CLASS|AMSK_STYLE },
440 { "span", MARKUP_SPAN, MUTYPE_BLOCK,
441 AMSK_ALIGN|AMSK_CLASS|AMSK_STYLE },
442 { "strike", MARKUP_STRIKE, MUTYPE_FONT, AMSK_STYLE },
443 { "strong", MARKUP_STRONG, MUTYPE_FONT, AMSK_STYLE },
444 { "sub", MARKUP_SUB, MUTYPE_FONT, AMSK_STYLE },
@@ -401,18 +459,21 @@
459 { "th", MARKUP_TH, MUTYPE_TD,
460 AMSK_ALIGN|AMSK_BGCOLOR|AMSK_COLSPAN|
461 AMSK_ROWSPAN|AMSK_VALIGN|AMSK_CLASS|AMSK_STYLE },
462 { "thead", MARKUP_THEAD, MUTYPE_BLOCK,
463 AMSK_ALIGN|AMSK_CLASS|AMSK_STYLE },
464 { "time", MARKUP_TIME, MUTYPE_FONT,
465 AMSK_DATETIME|AMSK_ID|AMSK_CLASS|AMSK_STYLE|AMSK_TITLE },
466 { "title", MARKUP_TITLE, MUTYPE_BLOCK, 0 },
467 { "tr", MARKUP_TR, MUTYPE_TR,
468 AMSK_ALIGN|AMSK_BGCOLOR|AMSK_VALIGN|AMSK_CLASS|AMSK_STYLE },
469 { "tt", MARKUP_TT, MUTYPE_FONT, AMSK_STYLE },
470 { "u", MARKUP_U, MUTYPE_FONT, AMSK_STYLE },
471 { "ul", MARKUP_UL, MUTYPE_LIST,
472 AMSK_TYPE|AMSK_COMPACT|AMSK_STYLE },
473 { "var", MARKUP_VAR, MUTYPE_FONT, AMSK_STYLE },
474 { "wbr", MARKUP_WBR, MUTYPE_SINGLE, 0 },
475 { "verbatim", MARKUP_VERBATIM, MUTYPE_SPECIAL,
476 AMSK_ID|AMSK_TYPE },
477 };
478
479 void show_allowed_wiki_markup( void ){
@@ -816,23 +877,34 @@
877 unsigned char iACode; /* ATTR_* */
878 char *zValue; /* Argument to this attribute. Might be NULL */
879 char cTerm; /* Original argument termination character */
880 } aAttr[10];
881 };
882
883 /*
884 ** Return true if attribute iACode has already been parsed into p.
885 */
886 static int markupHasAttr(const ParsedMarkup *p, int iACode){
887 int i;
888 for(i=0; i<p->nAttr; i++){
889 if( p->aAttr[i].iACode==iACode ) return 1;
890 }
891 return 0;
892 }
893
894 /*
895 ** z[] is an HTML markup element - something that begins with '<'.
896 ** Parse this element into the p structure.
897 **
898 ** The content of z[] might be modified by converting characters
899 ** to lowercase and by inserting some "\000" characters.
900 */
901 static amsk_t parseMarkup(ParsedMarkup *p, char *z){
902 int i, j, c;
903 int iACode;
904 char *zValue;
905 amsk_t seen = 0;
906 char zTag[100];
907
908 if( z[1]=='/' ){
909 p->endTag = 1;
910 i = 2;
@@ -868,11 +940,11 @@
940 if( j<(int)sizeof(zTag)-1 ) zTag[j++] = fossil_tolower(z[i]);
941 i++;
942 }
943 zTag[j] = 0;
944 p->aAttr[p->nAttr].iACode = iACode = findAttr(zTag);
945 attrOk = iACode!=0 && !markupHasAttr(p, iACode);
946 while( fossil_isspace(z[i]) ){ z++; }
947 if( z[i]!='=' ){
948 p->aAttr[p->nAttr].zValue = 0;
949 p->aAttr[p->nAttr].cTerm = 0;
950 c = 0;
@@ -904,11 +976,11 @@
976 }
977 }
978 i++;
979 }
980 if( attrOk ){
981 if( aAttribute[iACode].iMask ) seen |= aAttribute[iACode].iMask;
982 p->nAttr++;
983 }
984 while( fossil_isspace(z[i]) ){ i++; }
985 if( z[i]==0 || z[i]=='>' || (z[i]=='/' && z[i+1]=='>') ) break;
986 }
@@ -1712,17 +1784,17 @@
1784 break;
1785 }
1786 case TOKEN_MARKUP: {
1787 const char *zId;
1788 int iDiv;
1789 (void)parseMarkup(&markup, z);
1790
1791 /* Convert <title> to <h1 align='center'> */
1792 if( markup.iCode==MARKUP_TITLE && !p->inVerbatim ){
1793 markup.iCode = MARKUP_H1;
1794 markup.nAttr = 1;
1795 markup.aAttr[0].iACode = ATTR_ALIGN;
1796 markup.aAttr[0].zValue = "center";
1797 markup.aAttr[0].cTerm = 0;
1798 }
1799
1800 /* Markup of the form </div id=ID> where there is a matching
@@ -1801,11 +1873,11 @@
1873 popStackToTag(p, markup.iCode);
1874 }else
1875
1876 /* Push <div> markup onto the stack together with the id=ID attribute.
1877 */
1878 if( markup.iCode==MARKUP_DIV && attributeValue(&markup, ATTR_ID)!=0 ){
1879 pushStackWithId(p, markup.iCode, markupId(&markup),
1880 (p->state & ALLOW_WIKI)!=0);
1881 }else
1882
1883 /* Enter <verbatim> processing. With verbatim enabled, all other
1884

Keyboard Shortcuts

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