Hello Stephan, > Yep adding data-* is not that straightforward… If you want I can try > to create a patch with that functionality alone (a subset of the > diff I send you earlier). > > Yes, please.
Here you go ! For the records, this patch enables the use of data-* attributes in the Fossil wiki parser. Samuel
--- src/wikiformat.c +++ src/wikiformat.c @@ -46,28 +46,29 @@ #define ATTR_CLASS 7 #define ATTR_CLEAR 8 #define ATTR_COLOR 9 #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 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 ATTR_DATA 12 +#define ATTR_FACE 13 +#define ATTR_HEIGHT 14 +#define ATTR_HREF 15 +#define ATTR_HSPACE 16 +#define ATTR_ID 17 +#define ATTR_LINKS 18 +#define ATTR_NAME 19 +#define ATTR_ROWSPAN 20 +#define ATTR_SIZE 21 +#define ATTR_SRC 22 +#define ATTR_START 23 +#define ATTR_STYLE 24 +#define ATTR_TARGET 25 +#define ATTR_TYPE 26 +#define ATTR_VALIGN 27 +#define ATTR_VALUE 28 +#define ATTR_VSPACE 29 +#define ATTR_WIDTH 30 #define AMSK_ALIGN 0x00000001 #define AMSK_ALT 0x00000002 #define AMSK_BGCOLOR 0x00000004 #define AMSK_BORDER 0x00000008 #define AMSK_CELLPADDING 0x00000010 @@ -75,28 +76,30 @@ #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 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 +#define AMSK_DATA 0x00000800 +#define AMSK_FACE 0x00001000 +#define AMSK_HEIGHT 0x00002000 +#define AMSK_HREF 0x00004000 +#define AMSK_HSPACE 0x00008000 +#define AMSK_ID 0x00010000 +#define AMSK_LINKS 0x00020000 +#define AMSK_NAME 0x00040000 +#define AMSK_ROWSPAN 0x00080000 +#define AMSK_SIZE 0x00100000 +#define AMSK_SRC 0x00200000 +#define AMSK_START 0x00400000 +#define AMSK_STYLE 0x00800000 +#define AMSK_TARGET 0x01000000 +#define AMSK_TYPE 0x02000000 +#define AMSK_VALIGN 0x04000000 +#define AMSK_VALUE 0x08000000 +#define AMSK_VSPACE 0x10000000 +#define AMSK_WIDTH 0x20000000 + static const struct AllowedAttribute { const char *zName; unsigned int iMask; } aAttribute[] = { @@ -110,10 +113,11 @@ { "class", AMSK_CLASS, }, { "clear", AMSK_CLEAR, }, { "color", AMSK_COLOR, }, { "colspan", AMSK_COLSPAN, }, { "compact", AMSK_COMPACT, }, + { "data", AMSK_DATA, }, { "face", AMSK_FACE, }, { "height", AMSK_HEIGHT, }, { "href", AMSK_HREF, }, { "hspace", AMSK_HSPACE, }, { "id", AMSK_ID, }, @@ -739,10 +743,12 @@ unsigned char iCode; /* MARKUP_* */ unsigned char nAttr; /* Number of attributes */ unsigned short iType; /* MUTYPE_* */ struct { unsigned char iACode; /* ATTR_* */ + char *zDataAttr; /* Data attribute name. Might be NULL */ + char cTermAttr; /* Original argument termination character */ char *zValue; /* Argument to this attribute. Might be NULL */ char cTerm; /* Original argument termination character */ } aAttr[10]; }; @@ -787,24 +793,37 @@ p->nAttr = 1; if( c=='>' ) return; } while( fossil_isspace(z[i]) ){ i++; } while( c!='>' && p->nAttr<8 && fossil_isalpha(z[i]) ){ - int attrOk; /* True to preserver attribute. False to ignore it */ + int attrOk; /* True to preserve attribute. False to ignore it */ + char *attrEnd = 0; + c = 0; j = 0; while( fossil_isalnum(z[i]) ){ if( j<sizeof(zTag)-1 ) zTag[j++] = fossil_tolower(z[i]); i++; } zTag[j] = 0; p->aAttr[p->nAttr].iACode = iACode = findAttr(zTag); - attrOk = iACode!=0 && (seen & aAttribute[iACode].iMask)==0; + attrOk = iACode!=0 && ((seen & aAttribute[iACode].iMask)==0 || iACode == ATTR_DATA); + if( iACode==ATTR_DATA){ /* Handle the data-* attributes */ + if( z[i]!='-' ) { + attrOk = iACode = 0; + }else{ + p->aAttr[p->nAttr].zDataAttr = &z[i]; + while( (z[i]=='-') || fossil_isalpha(z[i]) ){ i++; } + p->aAttr[p->nAttr].cTermAttr = c = z[i]; + attrEnd = &z[i]; + } + }else{ + p->aAttr[p->nAttr].zDataAttr = 0; + } while( fossil_isspace(z[i]) ){ z++; } if( z[i]!='=' ){ p->aAttr[p->nAttr].zValue = 0; p->aAttr[p->nAttr].cTerm = 0; - c = 0; }else{ i++; while( fossil_isspace(z[i]) ){ z++; } if( z[i]=='"' ){ i++; @@ -823,10 +842,13 @@ p->aAttr[p->nAttr].cTerm = c = z[i]; z[i] = 0; } i++; } + if( attrEnd!=0 ){ + *attrEnd = 0; + } if( attrOk ){ seen |= aAttribute[iACode].iMask; p->nAttr++; } while( fossil_isspace(z[i]) ){ i++; } @@ -842,11 +864,16 @@ if( p->endTag ){ blob_appendf(pOut, "</%s>", aMarkup[p->iCode].zName); }else{ blob_appendf(pOut, "<%s", aMarkup[p->iCode].zName); for(i=0; i<p->nAttr; i++){ + if( p->aAttr[i].iACode==ATTR_DATA ) { + const char *zDataAttr = p->aAttr[i].zDataAttr; + blob_appendf(pOut, " %s%s", aAttribute[p->aAttr[i].iACode].zName, zDataAttr); + }else{ blob_appendf(pOut, " %s", aAttribute[p->aAttr[i].iACode].zName); + } if( p->aAttr[i].zValue ){ const char *zVal = p->aAttr[i].zValue; if( p->aAttr[i].iACode==ATTR_SRC && zVal[0]=='/' ){ blob_appendf(pOut, "=\"%s%s\"", g.zTop, zVal); }else{ @@ -871,10 +898,15 @@ for(i=0; i<p->nAttr; i++){ char *z = p->aAttr[i].zValue; if( z==0 ) continue; n = strlen(z); z[n] = p->aAttr[i].cTerm; + if(p->aAttr[i].iACode == ATTR_DATA ){ + n = 0; /* Look for the "\000" inserted at the end of the attribute name */ + while (z[n] != 0) { n--;} + z[n] = p->aAttr[i].cTermAttr; + } } } /* ** Return the value of attribute attrId. Return NULL if there is no
<<attachment: samuel_debionne.vcf>>
_______________________________________________ fossil-users mailing list fossil-users@lists.fossil-scm.org http://lists.fossil-scm.org:8080/cgi-bin/mailman/listinfo/fossil-users