#include<iostream>
#include "merc.h"
struct colourConType
{ char *name;
char colour;
};
struct colourConType colourConvert[] =
{ { "hl-default", 'w' },
{ "hl-code", 'w' },
{ "hl-brackets", 'c' },
{ "hl-comment", 'w' },
{ "hl-quotes", 'w' },
{ "hl-string", 'r' },
{ "hl-identifier",'D' },
{ "hl-builtin", 'y' },
{ "hl-reserved", 'W' },
{ "hl-inlinedoc", 'b' },
{ "hl-var", 'b' },
{ "hl-url", 'M' },
{ "hl-special", 'w' },
{ "hl-number", 'B' },
{ "hl-inlinetags",'C' },
{ "hl-main", 'D' },
{ "hl-gutter", 'w' },
{ "hl-table", 'g' },
{ "hl-prepro", 'r' },
{ NULL, 'R' },
};
// &Entity; <Entity lalala>
char *readTillTag(char *tag, char *blob)
{ char wholeTag[MSL];
while(*blob != '\0')
{ if(*blob == '<' || *blob == '&' )
{ blob = grabNextEntity(blob, wholeTag, *blob);
if(!strcasecmp(tag, wholeTag) )
return blob;
}
++blob;
}
return blob;
}
char *grabNextEntity(char *blob, char *tag, char prelim)
{ char delim;
tag[0] = '\0';
if( prelim == '<' )
delim = '>';
else if( prelim == '&' )
delim = ';';
else
{ logfp(LOG_BUG, "grabNextEntity: Bad prelimiter - %c", prelim);
return blob;
}
*blob++;//Get rid of the prelimiter
while(*blob != '\0' )
{ if(*blob == delim)
break;
*tag = *blob;
++tag;
++blob;
}
*tag = '\0';
++blob; //Hack off the delimiter
return blob;
}
char *parseHtmlString(char *blob)
{ char wholeTag[MSL], *ptr;
char choppedTag[MSL];
char *newBlob, *start;
newBlob = (char *)calloc(strlen(blob), sizeof(*newBlob));
start = &newBlob[0];
blob = readTillTag("/pre", blob);
while( *blob != '\0' )
{ if(*blob == '<' || *blob == '&' )
{ blob = grabNextEntity(blob, wholeTag, *blob);
//wholeTag is just that, but without the prelimiter or delimiter
//So <span class="hl-prepro"> becomes 'span class="h1-prepro"'
ptr = wholeTag;
ptr = one_argument(ptr, choppedTag);
if(choppedTag[0] == '\0' )
{ logfp(LOG_BUG, "parseHtmlString: choppedTag is empty.");
continue;
}
if(!strcasecmp(choppedTag, "span") )
{ char colourTag[MSL];
bool found = false;
//ptr should be class="lalala" soo.
one_argument(ptr+6, colourTag);
for(int i = 0; colourConvert[i].name != NULL ; ++i)
{ if(!strcasecmp(colourTag, colourConvert[i].name) )
{ *newBlob = '{';
++newBlob;
*newBlob = colourConvert[i].colour;
++newBlob;
found = true;
break;
}
}
if(!found)
logfp(LOG_BUG, "parseHtmlString: Bad colourTag! %s", colourTag);
continue;
}
if(!strcasecmp(choppedTag, "/span" ) )
{ *newBlob = '{';
++newBlob;
*newBlob = 'x';
++newBlob;
continue;
}
if(!strcasecmp(choppedTag, "quot") )
{ *newBlob = '"';
++newBlob;
continue;
}
if(!strcasecmp(choppedTag, "lt") )
{ *newBlob = '<';
++newBlob;
continue;
}
if(!strcasecmp(choppedTag, "gt" ) )
{ *newBlob = '>';
++newBlob;
continue;
}
if(!strcasecmp(choppedTag, "amp" ) )
{ *newBlob = '&';
++newBlob;
continue;
}
continue;
}
*newBlob = *blob;
if(*newBlob == '{')
{ ++newBlob;
*newBlob = 'c';
++newBlob;
*newBlob = '{';
++newBlob;
*newBlob = '{';
}
++blob; ++newBlob;
}
*newBlob = '\0';
return start;
}