@@ -26,7 +26,7 @@ use html::escape::Escape;
26
26
use t = syntax:: parse:: token;
27
27
28
28
/// Highlights some source code, returning the HTML output.
29
- pub fn highlight ( src : & str ) -> ~str {
29
+ pub fn highlight ( src : & str , class : Option < & str > ) -> ~str {
30
30
let sess = parse:: new_parse_sess ( ) ;
31
31
let handler = diagnostic:: default_handler ( ) ;
32
32
let span_handler = diagnostic:: mk_span_handler ( handler, sess. cm ) ;
@@ -35,6 +35,7 @@ pub fn highlight(src: &str) -> ~str {
35
35
let mut out = io::MemWriter::new();
36
36
doit(sess,
37
37
lexer::new_string_reader(span_handler, fm),
38
+ class,
38
39
&mut out).unwrap();
39
40
str::from_utf8_lossy(out.unwrap()).into_owned()
40
41
}
@@ -46,14 +47,15 @@ pub fn highlight(src: &str) -> ~str {
46
47
/// it's used. All source code emission is done as slices from the source map,
47
48
/// not from the tokens themselves, in order to stay true to the original
48
49
/// source.
49
- fn doit(sess: @parse::ParseSess, lexer: lexer::StringReader,
50
+ fn doit(sess: @parse::ParseSess, lexer: lexer::StringReader, class: Option<&str>,
50
51
out: &mut Writer) -> io::IoResult<()> {
51
52
use syntax::parse::lexer::Reader;
52
53
53
- try!(write!(out, " <pre class=' rust' >\n ") ) ;
54
+ try!(write!(out, " <pre class=' rust { } ' >\n ", class . unwrap_or ( "" ) ) ) ;
54
55
let mut last = BytePos ( 0 ) ;
55
56
let mut is_attribute = false ;
56
57
let mut is_macro = false ;
58
+ let mut is_macro_nonterminal = false ;
57
59
loop {
58
60
let next = lexer. next_token ( ) ;
59
61
let test = if next. tok == t:: EOF { lexer. pos . get ( ) } else { next. sp . lo } ;
@@ -101,8 +103,15 @@ fn doit(sess: @parse::ParseSess, lexer: lexer::StringReader,
101
103
// miscellaneous, no highlighting
102
104
t:: DOT | t:: DOTDOT | t:: DOTDOTDOT | t:: COMMA | t:: SEMI |
103
105
t:: COLON | t:: MOD_SEP | t:: LARROW | t:: DARROW | t:: LPAREN |
104
- t:: RPAREN | t:: LBRACKET | t:: LBRACE | t:: RBRACE |
105
- t:: DOLLAR => "" ,
106
+ t:: RPAREN | t:: LBRACKET | t:: LBRACE | t:: RBRACE => "" ,
107
+ t:: DOLLAR => {
108
+ if t:: is_ident ( & lexer. peek ( ) . tok ) {
109
+ is_macro_nonterminal = true ;
110
+ "macro-nonterminal"
111
+ } else {
112
+ ""
113
+ }
114
+ }
106
115
107
116
// This is the start of an attribute. We're going to want to
108
117
// continue highlighting it as an attribute until the ending ']' is
@@ -143,7 +152,10 @@ fn doit(sess: @parse::ParseSess, lexer: lexer::StringReader,
143
152
144
153
_ if t:: is_any_keyword ( & next. tok ) => "kw" ,
145
154
_ => {
146
- if lexer. peek ( ) . tok == t:: NOT {
155
+ if is_macro_nonterminal {
156
+ is_macro_nonterminal = false ;
157
+ "macro-nonterminal"
158
+ } else if lexer. peek ( ) . tok == t:: NOT {
147
159
is_macro = true ;
148
160
"macro"
149
161
} else {
@@ -171,4 +183,3 @@ fn doit(sess: @parse::ParseSess, lexer: lexer::StringReader,
171
183
172
184
write ! ( out, "</pre>\n " )
173
185
}
174
-
0 commit comments