49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
|
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
|
+
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
|
#define ATTR_COLSPAN 10
#define ATTR_COMPACT 11
#define ATTR_FACE 12
#define ATTR_HEIGHT 13
#define ATTR_HREF 14
#define ATTR_HSPACE 15
#define ATTR_ID 16
#define ATTR_LINKS 17
#define ATTR_NAME 17
#define ATTR_ROWSPAN 18
#define ATTR_SIZE 19
#define ATTR_SRC 20
#define ATTR_START 21
#define ATTR_STYLE 22
#define ATTR_TARGET 23
#define ATTR_TYPE 24
#define ATTR_VALIGN 25
#define ATTR_VALUE 26
#define ATTR_VSPACE 27
#define ATTR_WIDTH 28
#define ATTR_NAME 18
#define ATTR_ROWSPAN 19
#define ATTR_SIZE 20
#define ATTR_SRC 21
#define ATTR_START 22
#define ATTR_STYLE 23
#define ATTR_TARGET 24
#define ATTR_TYPE 25
#define ATTR_VALIGN 26
#define ATTR_VALUE 27
#define ATTR_VSPACE 28
#define ATTR_WIDTH 29
#define AMSK_ALIGN 0x00000001
#define AMSK_ALT 0x00000002
#define AMSK_BGCOLOR 0x00000004
#define AMSK_BORDER 0x00000008
#define AMSK_CELLPADDING 0x00000010
#define AMSK_CELLSPACING 0x00000020
#define AMSK_CLASS 0x00000040
#define AMSK_CLEAR 0x00000080
#define AMSK_COLOR 0x00000100
#define AMSK_COLSPAN 0x00000200
#define AMSK_COMPACT 0x00000400
#define AMSK_FACE 0x00000800
#define AMSK_HEIGHT 0x00001000
#define AMSK_HREF 0x00002000
#define AMSK_HSPACE 0x00004000
#define AMSK_ID 0x00008000
#define AMSK_LINKS 0x00010000
#define AMSK_NAME 0x00010000
#define AMSK_ROWSPAN 0x00020000
#define AMSK_SIZE 0x00040000
#define AMSK_SRC 0x00080000
#define AMSK_START 0x00100000
#define AMSK_STYLE 0x00200000
#define AMSK_TARGET 0x00400000
#define AMSK_TYPE 0x00800000
#define AMSK_VALIGN 0x01000000
#define AMSK_VALUE 0x02000000
#define AMSK_VSPACE 0x04000000
#define AMSK_WIDTH 0x08000000
#define AMSK_NAME 0x00020000
#define AMSK_ROWSPAN 0x00040000
#define AMSK_SIZE 0x00080000
#define AMSK_SRC 0x00100000
#define AMSK_START 0x00200000
#define AMSK_STYLE 0x00400000
#define AMSK_TARGET 0x00800000
#define AMSK_TYPE 0x01000000
#define AMSK_VALIGN 0x02000000
#define AMSK_VALUE 0x04000000
#define AMSK_VSPACE 0x08000000
#define AMSK_WIDTH 0x10000000
static const struct AllowedAttribute {
const char *zName;
unsigned int iMask;
} aAttribute[] = {
{ 0, 0 },
{ "align", AMSK_ALIGN, },
|
111
112
113
114
115
116
117
118
119
120
121
122
123
124
|
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
|
+
|
{ "colspan", AMSK_COLSPAN, },
{ "compact", AMSK_COMPACT, },
{ "face", AMSK_FACE, },
{ "height", AMSK_HEIGHT, },
{ "href", AMSK_HREF, },
{ "hspace", AMSK_HSPACE, },
{ "id", AMSK_ID, },
{ "links", AMSK_LINKS, },
{ "name", AMSK_NAME, },
{ "rowspan", AMSK_ROWSPAN, },
{ "size", AMSK_SIZE, },
{ "src", AMSK_SRC, },
{ "start", AMSK_START, },
{ "style", AMSK_STYLE, },
{ "target", AMSK_TARGET, },
|
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
|
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
|
+
+
+
+
+
+
+
+
+
+
+
-
+
|
if( j<sizeof(zTag)-1 ) zTag[j++] = fossil_tolower(z[i]);
i++;
}
zTag[j] = 0;
p->iCode = findTag(zTag);
p->iType = aMarkup[p->iCode].iType;
p->nAttr = 0;
c = 0;
if( z[i]=='-' ){
p->aAttr[0].iACode = iACode = ATTR_ID;
i++;
p->aAttr[0].zValue = &z[i];
while( fossil_isalnum(z[i]) ){ i++; }
p->aAttr[0].cTerm = c = z[i];
z[i++] = 0;
p->nAttr = 1;
if( c=='>' ) return;
}
while( fossil_isspace(z[i]) ){ i++; }
while( p->nAttr<8 && fossil_isalpha(z[i]) ){
while( c!='>' && p->nAttr<8 && fossil_isalpha(z[i]) ){
int attrOk; /* True to preserver attribute. False to ignore it */
j = 0;
while( fossil_isalnum(z[i]) ){
if( j<sizeof(zTag)-1 ) zTag[j++] = fossil_tolower(z[i]);
i++;
}
zTag[j] = 0;
|
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
|
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
|
-
+
+
+
+
+
|
|| strncmp(zTarget, "https:", 6)==0
|| strncmp(zTarget, "ftp:", 4)==0
|| strncmp(zTarget, "mailto:", 7)==0
){
blob_appendf(p->pOut, "<a href=\"%s\">", zTarget);
}else if( zTarget[0]=='/' ){
blob_appendf(p->pOut, "<a href=\"%s%h\">", g.zTop, zTarget);
}else if( zTarget[0]=='.' || zTarget[0]=='#' ){
}else if( zTarget[0]=='.'
&& (zTarget[1]=='/' || (zTarget[1]=='.' && zTarget[2]=='/'))
&& (p->state & WIKI_LINKSONLY)==0 ){
blob_appendf(p->pOut, "<a href=\"%h\">", zTarget);
}else if( zTarget[0]=='#' ){
blob_appendf(p->pOut, "<a href=\"%h\">", zTarget);
}else if( is_valid_uuid(zTarget) ){
int isClosed = 0;
if( is_ticket(zTarget, &isClosed) ){
/* Special display processing for tickets. Display the hyperlink
** as crossed out if the ticket is closed.
*/
|
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
|
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
|
-
-
+
+
-
|
}
case TOKEN_MARKUP: {
const char *zId;
int iDiv;
parseMarkup(&markup, z);
/* Markup of the form </div id=ID> where there is a matching
** ID somewhere on the stack. Exit the verbatim if were are in
** it. Pop the stack up to the matching <div>. Discard the
** ID somewhere on the stack. Exit any contained verbatim.
** Pop the stack up to the matching <div>. Discard the </div>
** </div>
*/
if( markup.iCode==MARKUP_DIV && markup.endTag &&
(zId = markupId(&markup))!=0 &&
(iDiv = findTagWithId(p, MARKUP_DIV, zId))>=0
){
if( p->inVerbatim ){
p->inVerbatim = 0;
|
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
|
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
|
-
+
-
-
-
-
-
-
+
+
+
-
+
+
+
|
p->zVerbatimId = 0;
p->inVerbatim = 1;
p->preVerbState = p->state;
p->state &= ~ALLOW_WIKI;
for(ii=0; ii<markup.nAttr; ii++){
if( markup.aAttr[ii].iACode == ATTR_ID ){
p->zVerbatimId = markup.aAttr[ii].zValue;
}else if( markup.aAttr[ii].iACode == ATTR_TYPE ){
}else if( markup.aAttr[ii].iACode==ATTR_TYPE ){
if( fossil_stricmp(markup.aAttr[ii].zValue, "allow-links")==0 ){
p->state |= ALLOW_LINKS;
}else{
blob_appendf(p->pOut, "<pre name='code' class='%s'>",
markup.aAttr[ii].zValue);
vAttrDidAppend=1;
blob_appendf(p->pOut, "<pre name='code' class='%s'>",
markup.aAttr[ii].zValue);
vAttrDidAppend=1;
}
}else if( markup.aAttr[ii].iACode==ATTR_LINKS
&& !is_false(markup.aAttr[ii].zValue) ){
p->state |= ALLOW_LINKS;
}
}
if( !vAttrDidAppend ) {
endAutoParagraph(p);
blob_append(p->pOut, "<pre class='verbatim'>",-1);
}
p->wantAutoParagraph = 0;
|