Roxen.git
/
server
/
base_server
/
highlight_pike.pike
version
»
Context lines:
10
20
40
80
file
none
3
Roxen.git/server/base_server/highlight_pike.pike:1:
+
string quote(string s)
+
{
+
return replace(s,({ "<", ">", "&", }),({"<", ">", "&" }));
+
}
-
+
string highlight_string(string s,mapping m)
+
{
+
if(m->dark)
+
return "<i><font color=darkred>"+quote(s)+"</font></i>";
+
else
+
return "<i><font color=skyblue>"+quote(s)+"</font></i>";
+
}
+
+
string highlight_comment(string s, mapping m)
+
{
+
if(m->dark)
+
return ("<font color=red>"+quote(s)+"</font>");
+
return ("<font color=yellow>"+quote(s)+"</font>");
+
}
+
+
string highlight_keyword(string s, mapping m)
+
{
+
if(m->dark) return ("<b><font color=darkblue>"+quote(s)+"</font></b>");
+
return ("<b><font color=lightblue>"+quote(s)+"</font></b>");
+
}
+
+
string highlight_type(string s, mapping m)
+
{
+
if(m->dark) return ("<b><font color=darkgreen>"+quote(s)+"</font></b>");
+
return ("<b><font color=lightgreen>"+quote(s)+"</font></b>");
+
}
+
+
string highlight_pre(string s, mapping m)
+
{
+
if(m->dark) return ("<font color=brown>"+quote(s)+"</font>");
+
return ("<font color=pink>"+quote(s)+"</font>");
+
}
+
+
string highlight_declarator(string s, mapping m)
+
{
+
if(m->dark) return ("<b><font color=darkbrown>"+quote(s)+"</font></b>");
+
return ("<b><font color=#ffeeaa>"+quote(s)+"</font></b>");
+
}
+
+
+
string highlight_case(string s, mapping m)
+
{
+
if(m->dark) return ("<font color=black>"+quote(s)+"</font>");
+
return ("<font color=aquamarine>"+quote(s)+"</font>");
+
}
+
+
constant keywords=({"foreach","break","constant","catch","gauge","class","continue","do","else","for","foreach","if","import","inherit","inline","lambda","nomask","private","protected","public","return","static","final", "switch","throw","while",});
+
+
constant types=({"mapping","function","multiset","array","object","program","float","int","mixed","string","void"});
+
+
+
+
array (string) find_decl(string in)
+
{
+
string pre,decl,p2;
+
sscanf(in, "%[ \t\r\n]%s", pre, in);
+
if(!strlen(in)) return ({"",pre+in});
+
if(in[0]==')') // Cast
+
return ({"",pre+in});
+
if(sscanf(in, "%[^(),; \t\n\r]%s", decl,in)==2)
+
return ({ pre+decl, in });
+
return ({ "", pre+in });
+
}
+
+
string find_complex_type(string post)
+
{
+
string p="";
+
if(strlen(post) && post[0]=='(')
+
{
+
int level=1, i=1;
+
while(level && i < strlen(post))
+
{
+
switch(post[i++])
+
{
+
case '(': level++;break;
+
case ')': level--;break;
+
}
+
}
+
p = p+post[..i-1];
+
post = post[i..];
+
if(sscanf(post, "|%s", post))
+
{
+
string q;
+
if(sscanf(post, "%s(", q))
+
{
+
p+=q;
+
post = post[strlen(q)..];
+
} else if(sscanf(post, "%s%*[ \t\n\r]", post)>1) {
+
p+="|"+post;
+
return p;
+
}
+
p+="|"+find_complex_type(post);
+
}
+
return p;
+
}
+
return p;
+
}
+
+
array (string) find_type(string in)
+
{
+
string s,pre,post,decl;
+
int min=10000000000,i;
+
string mt;
+
foreach(types, s)
+
if(((i=search(in, s))!=-1) && i<min)
+
{
+
if(i) switch(in[i-1])
+
{
+
default:
+
// perror("Invalid type thingie: '"+in[i..i]+"'\n");
+
continue;
+
case ' ':
+
case '\n':
+
case '\r':
+
case '\t':
+
case '(':
+
case ')':
+
}
+
min = i;
+
mt = s;
+
}
+
+
if(!(s=mt)) return 0;
+
+
if(sscanf(in, "%s"+s+"%s", pre, post)==2)
+
{
+
string op = post;
+
string p="";
+
sscanf(post, "%[ \t\n\r]%s", p, post);
+
+
p += find_complex_type(post);
+
+
p = op[..strlen(p)-1];
+
post = op[strlen(p)..];
+
// perror("Found type: '%s' (left: %s)\n", s+p, post-"\n");
+
return ({ pre, s+p, @find_decl(post) });
+
}
+
}
+
+
array (string) find_keyword(string in)
+
{
+
string s,pre,post;
+
foreach(keywords, s) if(sscanf(in, "%s"+s+"%s", pre, post)==2)
+
if(!strlen(pre) || pre[-1]==' ' || pre[-1]=='\t' || pre[-1]==':' ||
+
pre[-1]=='}' || pre[-1]==')' || pre[-1]==';' || pre[-1]=='\n')
+
if(!strlen(post) || post[0]==' ' || post[0]=='\t' || post[0]=='(' ||
+
post[0]=='{'|| post[0]==';'||post[0]=='\n')
+
return ({ pre, s, post });
+
}
+
+
array (string) find_string(string in)
+
{
+
string s,pre,post;
+
in = replace(in, "\\\"", "\0");
+
if(sscanf(in, "%[^\"]\"%[^\"]\"%s", pre, s, post)==3)
+
return ({ pre, "\""+replace(s, "\0", "\\\"")+"\"", post });
+
}
+
+
array (string) find_comment(string in)
+
{
+
string s,pre,post;
+
if(sscanf(in, "%s//%s\n%s", pre, post,s)==3) return ({ pre, "//"+post+"\n",s });
+
if(sscanf(in, "#!%s\n%s", post,s)) return ({ "", "#!"+post+"\n",s });
+
if(sscanf(in, "%s/*%s*/%s", pre, s, post)==3)
+
return ({ pre, "/*"+s+"*/", post });
+
}
+
+
array (string) find_comment_outside_string(string in)
+
{
+
string s,pre,post,q;
+
if(sscanf(in, "%s\n//%s\n%s", pre,post,s)==3)
+
return ({ pre+"\n", "//"+post+"\n", s});
+
if(sscanf(in, "//%s\n%s", post,s)==2)
+
return ({ "", "//"+post+"\n", s});
+
if(sscanf(in, "%s\n%[^\"]//%s\n%s", q,pre, post,s)==4)
+
return ({ q+"\n"+pre, "//"+post+"\n", s });
+
if(sscanf(in, "%[^\"]/*%s*/%s", pre, s, post)==3)
+
return ({ pre, "/*"+s+"*/", post });
+
}
+
+
array (string) find_case(string in)
+
{
+
string mid,pre,post;
+
if(sscanf(in, "%scase%s:%s", pre, mid, post)==3)
+
return ({ pre, "case", mid, ":", post });
+
if(sscanf(in, "%sdefault%s:%s", pre, mid, post)==3)
+
return ({ pre, "default"+mid+":", "", "", post });
+
+
if(sscanf(in, "%scase%s", pre, post)==2)
+
if(!strlen(pre) || pre[-1]==' ' || pre[-1]=='\t' || pre[-1]==':')
+
if(!strlen(post) || post[0]==' ' || post[0]=='\t')
+
return ({ pre, "case", post, "", "" });
+
+
if(sscanf(in, "%sdefault%s", pre, post)==2)
+
if(!strlen(pre) || pre[-1]==' ' || pre[-1]=='\t' || pre[-1]==':')
+
if(!strlen(post) || post[0]==' ' || post[0]=='\t')
+
return ({ pre, "default", post, "", "" });
+
}
+
+
array (string) find_preparse(string in)
+
{
+
string s,post,q;
+
if(sscanf(in, "%s#%s\n%s", q,s,post)==3)
+
return ({ q,"#"+s+"\n", post });
+
}
+
+
array highlight_patterns =
+
({
+
({ find_comment_outside_string, ({ 0, highlight_comment }),}),
+
({ find_string, ({ 0, highlight_string }),}),
+
({ find_comment, ({ 0, highlight_comment }),}),
+
({ find_preparse, ({ 0, highlight_pre }),}),
+
({ find_type, ({ 0, highlight_type, highlight_declarator }),}),
+
({ find_keyword, ({ 0, highlight_keyword }),}),
+
({ find_case, ({ 0, highlight_case, 0, highlight_case, }),}),
+
});
+
+
#define push(X) res += X
+
+
string highlight_line(string l, mapping m)
+
{
+
array p,r;
+
string res = "";
+
// perror(l+"\n");
+
foreach(highlight_patterns, p)
+
{
+
if(r=p[0](l))
+
{
+
// perror("Match %O (%s, %s)\n", p[-1][-1],(r[..sizeof(p[1])-1]*""),
+
// (r[sizeof(p[1])..]*""));
+
for(int i=0; i<sizeof(p[1]) && i<sizeof(r); i++)
+
if(functionp(p[1][i]))
+
push(p[1][i](r[i],m));
+
else
+
push(highlight_line(r[i],m));
+
for(int i=sizeof(p[1]); i<sizeof(r); i++)
+
push(highlight_line(r[i],m));
+
return res;
+
}
+
}
+
return quote(l);
+
}
+
+
string do_the_highlighting(string s, mapping m)
+
{
+
return highlight_line(s, m);
+
}
+
+
string highlight_pike(string t, mapping m, string contents)
+
{
+
if(!m->light) m->dark="yep";
+
if(m->nopre) return do_the_highlighting(contents,m);
+
return "<pre>"+do_the_highlighting(contents,m)+"</pre>";
+
}
+
Newline at end of file added.