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

Reply via email to