From d7044d310387d3752774831c1a8a768c0ca1ed67 Mon Sep 17 00:00:00 2001 From: deva Date: Tue, 29 Mar 2011 10:04:47 +0000 Subject: Examples in docs. --- client/docgen/highlight.cc | 172 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 172 insertions(+) create mode 100644 client/docgen/highlight.cc (limited to 'client/docgen/highlight.cc') diff --git a/client/docgen/highlight.cc b/client/docgen/highlight.cc new file mode 100644 index 0000000..0857320 --- /dev/null +++ b/client/docgen/highlight.cc @@ -0,0 +1,172 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set et sw=2 ts=2: */ +/*************************************************************************** + * highlight.cc + * + * Tue Mar 29 09:12:06 CEST 2011 + * Copyright 2011 Bent Bisballe Nyeng + * deva@aasimon.org + ****************************************************************************/ + +/* + * This file is part of Pracro. + * + * Pracro is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * Pracro is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Pracro; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + */ +#include "highlight.h" + +#include + +typedef enum { + none, + intag, + instring, + inname, + inattribute +} xml_state_t; + +static bool isChar(QChar c) +{ + return + (c >= 'a' && c <= 'z') || + (c >= 'A' && c <= 'Z') || + c == '_'; +} + +static QString highlight_xml(QString code) +{ + QString out; + xml_state_t state = none; + bool hasname = false; + + QString::iterator c = code.begin(); + while(c != code.end()) { + if(*c == '<') { + out += "<"; + state = intag; + hasname = false; + } else if(state == intag && *c == '>') { + out += ">"; + state = none; + } else if(state == intag && *c == '/') { + out += "/"; + + } else if(state == intag && hasname == false && isChar(*c)) { + state = inname; + hasname = true; + out += "" + QString(*c); + } else if(state == inname && isChar(*c)) { + out += *c; + } else if(state == inname) { + out += "" + QString(*c); + state = intag; + + } else if(state == intag && hasname == true && isChar(*c)) { + state = inattribute; + out += "" + QString(*c); + } else if(state == inattribute && isChar(*c)) { + out += *c; + } else if(state == inattribute) { + out += "" + QString(*c); + state = intag; + + } else if(state == intag && *c == '\"') { + state = instring; + out += """; + } else if(state == instring && *c == '\"') { + state = intag; + out += """; + } else if(state == instring) { + out += *c; + + } else out += *c; + c++; + } + + /* + QXmlStreamWriter w(&e->code); + w.writeCharacters(line + "\n"); + */ + + return out; +} + +static bool isLuaChar(QChar c) +{ + return + (c >= 'a' && c <= 'z') || + (c >= 'A' && c <= 'Z') || + c == '_'; +} + +static bool isKeyword(QString code) +{ + return code == "if" || + code == "then" || + code == "else" || + code == "end" || + code == "this" || + code == "function" || + code == "local" || + code == "and" || + code == "or" || + code == "not"; +} + +static QString highlight_lua(QString code) +{ + QString out; + QString word; + + bool instring = false; + + QString::iterator c = code.begin(); + while(c != code.end()) { + if(isLuaChar(*c)) { + word += *c; + } else { + if(instring && *c == '\'') { + out += word + "'"; + instring = false; + } else if(instring) { + out += word + QString(*c); + } else if(isKeyword(word)) { + out += ""+word+"" + QString(*c); + } else if(*c == '(') { + out += ""+word+"" + QString(*c); + } else if(instring == false && *c == '\'') { + out += word + "'"; + instring = true; + } else { + out += word + QString(*c); + } + word = ""; + } + + c++; + } + + return out; +} + +QString highlight(QString code, lang_t lang) +{ + switch(lang) { + case lua: + return highlight_lua(code); + case xml: + return highlight_xml(code); + } +} -- cgit v1.2.3