#! /usr/local/bin/pike
// stolen from cvsview_mk2~.pike, by jhs@roxen.com
// mangled by rjb@bobo.fuw.edu.pl
// Modified at 08/07/2005
// Réindentation du fichier, gestion d'erreur si fichier manquant.
// Insertion d'un doctype.
#pragma strict_types
string encode_c(string file) {
string result = "";
array(Parser.C.Token) tokenized = Parser.C.tokenize(Parser.C.split(file));
foreach(Parser.C.hide_whitespaces(tokenized), Parser.C.Token token) {
string color = 0;
string token_text = (string)token;
switch(token_text) {
case "char": case "long": case "union":
case "double": case "short": case "unsigned":
case "enum": case "signed": case "void":
case "float": case "struct": case "int": case "typedef": color = "1"; break;
case "{": case "}": case "(": case ")": case "[": case "]":
color = "2"; break;
case "break": case "default": case "for": case "return":
case "case": case "do": case "goto": case "switch":
case "continue":case "else": case "if": case "while":
color = "3"; break;
case "auto": case "extern": case "static":
case "const": case "register":case "volatile":
color = "4"; break;
}
if(token_text[0]=='#') {
color = "5";
}
else if((< "//", "/*" >)[token_text[0..1]]) {
color = "6";
}
else if(token_text[0]=='"' && token_text[-1]=='"') {
color = "7";
}
if(color) {
result += sprintf("\0%s%s\1%s", color, token->text, color);
}
else {
result += token->text;
}
result += token->trailing_whitespaces;
}
return result;
}
string encode_pike(string file) {
string result = "";
array(Parser.Pike.Token) tokenized;
tokenized = Parser.Pike.tokenize(Parser.Pike.split(file));
foreach(Parser.Pike.hide_whitespaces(tokenized), Parser.Pike.Token token) {
string color = 0;
string token_text = (string)token;
switch(token_text) {
case "array": case "function":case "multiset":case "typedef":
case "constant":case "int": case "object": case "void":
case "enum": case "mapping": case "program":
case "float": case "mixed": case "string":
color = "1"; break;
case "{": case "}": case "(": case ")": case "[": case "]":
color = "2"; break;
case "break": case "do": case "if": case "switch":
case "case": case "else": case "inherit": case "typeof":
case "catch": case "for": case "lambda": case "while":
case "class": case "foreach": case "predef":
case "continue":case "gauge": case "return":
case "default": case "import": case "sscanf":
color = "3"; break;
case "inline": case "private": case "protected":
case "nomask": case "public": case "static":
color = "4"; break;
}
if(token_text[0]=='#') {
color = "5";
}
else if((< "//", "/*" >)[token_text[0..1]]) {
color = "6";
}
else if(token_text[0]=='"' && token_text[-1]=='"') {
color = "7";
}
if(color) {
result += sprintf("\0%s%s\1%s", color, token->text, color);
}
else {
result += token->text;
}
result += token->trailing_whitespaces;
}
return result;
}
string encode_colors(string file, string filename) {
if((has_suffix(filename, ".pike") || has_suffix(filename, ".pmod"))) return encode_pike(file);
if((has_suffix(filename, ".c") ||
has_suffix(filename, ".h"))) return encode_c(file);
error("Lack rule to colorize file "+filename+"\n");
}
string font(string c) { return sprintf("<font color=\"%s\">", c); }
string decode_colors(string file) {
return replace(file, ({ "\0" + 1, "\1" + 1,
"\0" + 2, "\1" + 2,
"\0" + 3, "\1" + 3,
"\0" + 4, "\1" + 4,
"\0" + 5, "\1" + 5,
"\0" + 6, "\1" + 6,
"\0" + 7, "\1" + 7 }),
/* type */ ({ font("darkred") + "<b>", "</b></font>",
/* bracket */ font("black"), "</font>",
/* command */ font("darkblue"), "</font>",
/* modifier*/ font("darkgreen"), "</font>",
/* CPP */ font("darkblue"), "</font>",
/* comment */ font("#5555AA") + "<i>", "</i></font>",
/* string */ font("green"), "</font>" }));
}
string qh(string text) {
return replace(text, "<>&"/"", "< > &" / " ");
}
/*OBSOLETE: Renvoie le html sur stdout du fichier pike de conversion
int _test() {
write("<html><head><title>" + basename(__FILE__) + "</title></head>" +
"<body bgcolor=\"#fffffa\" text=\"#000000\"><pre>\n" +
decode_colors(encode_colors(qh(Stdio.read_file(__FILE__)), __FILE__+".pike")) +
"</pre></body></html>");
return 0;
}
*/
int main(int ac, array(string) av) {
/*Pas assez d'arguments*/
if(ac==1) {
}
foreach(av[1..], string filename) {
string tmp;
if(has_suffix(filename, ".html"))
continue;
if(!(tmp=Stdio.read_file(filename))) {
werror("Can't read file: " + filename + " ... skipping\n");
continue;
}
if(!has_suffix(filename, ".pike")&&!has_suffix(filename, ".pmod") &&! has_suffix(filename,".c") &&! has_suffix(filename, ".h")) { // make pike the default
tmp = decode_colors(encode_colors(qh(tmp), filename+".pike"));
}
else {
tmp = decode_colors(encode_colors(qh(tmp), filename));
}
tmp = sprintf("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n"+
"<html>\n\t<head>\n\t<title>rjb's pike code: %s</title>\n"+
"<style type=\"text/css\">body{font-size:10pt;}</style>\n\t</head>" +
"\t<body bgcolor=\"#fffffa\" text=\"#000000\">\n\n\n<pre>"+
"%s\n\r</pre>\n</body>\n\n</html>",
basename(filename), tmp);
if(Stdio.write_file(filename + ".html", tmp)!=sizeof(tmp))
{
werror("Error writing " + filename + ".html !\n");
}
else {
werror("File " + filename + ".html written.\n");
}
}
return 0;
}