Markup Parser Mathematek

Diese Seite ist in einem Wikiänlichen Stil geschrieben,
wobei ich ein eigenes Markupformat verwende.
Die Seite ist in C++ geschrieben, und läuft auf
einem interaktiven C++ interpreter.

Parser und Lexer code

Ich benutze ein eigenes Markup, was für mich Optimiert
die beste Möglichkeit bietet schnell Text zu schreiben.

enum markupType {
 MU_UNDEF,
 MU_TYPECONTENT,
 MU_H4,
 MU_H3,
 MU_H2,
 MU_H1,
 MU_PRE,
 MU_P,
 MU_FUNCTION 
};
struct markupBlock {
 markupType type;
 string content;
};
bool markupIsType(string line) {
 return markupGetType(line) != MU_TYPECONTENT;
}
bool markupIsType(markupType mut) {
 return mut != MU_TYPECONTENT;
}
bool markupIsContent(markupType mut) {
 return mut == MU_TYPECONTENT;
}
markupType markupGetType(string line) {
 if(line == "!") {
  return MU_H1;
 } else if(line == "!!") {
  return MU_H2;
 } else if(line == "!!!") {
  return MU_H3;
 } else if(line == "!!!!") {
  return MU_H4;
 } else if(line == "\"") {
  return MU_PRE;
 } else if(line == "=") {
  return MU_FUNCTION;
 } else if(line == "") {
  return MU_P;
 }
 return MU_TYPECONTENT;
}
vector<void*> markupLex(string markup) {
 vector<void*> ret;
 markupBlock* entry;
 string content;
 bool iblock = false;
 string delim = "\n";
 int pos = 0;
 int nextpos = 0;
 markupType type;
 markupType pmut = MU_UNDEF;
 markupType mut = MU_UNDEF;
 markupType nmut = MU_UNDEF;
 while((pos = markup.find(delim)) != string::npos) {
  string token = markup.substr(0, pos+delim.length());
  mut = markupGetType(token.substr(0, token.length()-1));
  markup.erase(0, pos+delim.length());
  nextpos = markup.find(delim);
  string nexttoken = markup.substr(0, nextpos+delim.length());
  nmut = markupGetType(nexttoken.substr(0, nexttoken.length()-1));
  if(markupIsType(mut)) {
   type = mut;
  } else if(markupIsContent(mut)) { //After typedefinition
   content += token;
   if((pmut != MU_UNDEF e  markupIsType(nmut)) || nextpos == string::npos) {
    entry = new markupBlock;
    if(nextpos == string::npos) {
     content += markup.substr(0, markup.length()-1);
    }
    entry->type = type;
    entry->content = content;
    ret.push_back((void*)entry);
    content = "";
   }
  }
  pmut = mut;
 }
 return ret;
}
string markupParse(vector<void*> mulexed) {
 string ret;
 for(vector<void*>::iterator itr = mulexed.begin(); itr != mulexed.end(); ++itr) {
  markupBlock* mop = (markupBlock*)(*itr);
  switch(mop->type) {
   case MU_H1:
    ret += "<h1>" + removeNewline(mop->content) + "</h1>";
   break;
   case MU_H2:
    ret += "<h2>" + removeNewline(mop->content) + "</h2>";
   break;
   case MU_H3:
    ret += "<h3>" + removeNewline(mop->content) + "</h3>";
   break;
   case MU_H4:
    ret += "<h4>" + removeNewline(mop->content) + "</h4>";
   break;
   case MU_PRE:
    string escaped = mop->content;
    escaped = ReplaceString(escaped, "\"", """);
    escaped = ReplaceString(escaped, "'", "'");
    escaped = ReplaceString(escaped, "<", "<");
    escaped = ReplaceString(escaped, ">", ">");
    //escaped = ReplaceString(escaped, " ", "&");
    ret += "<pre>" + escaped + "</pre>";
   break;
   case MU_FUNCTION:
   break;
   case MU_P:
    string tmp = "<font>" + replaceNewline(mop->content, "</font><br/><font>") + "</font>";
    elementParse(tmp);
    ret += "<p>" + tmp + "</p>";
   break;
   default:
   break;
  }
 }
 return ret;
}

Status dieser Seite

Ich Arbeite hin und wieder an der Seite weiter.
Im Augenblick bin ich einen großen Schritt weiter gekommen,
und nun fange ich an mehrere Einträge zu schreiben um die Seite mit leben zu füllen.