@@ -20,6 +20,7 @@ use nom::bytes::complete::{is_a, is_not};
2020use nom:: character:: complete:: { line_ending, space1} ;
2121use nom:: combinator:: map;
2222use nom:: multi:: many0;
23+ use nom:: IResult ;
2324use yew:: prelude:: * ;
2425
2526use self :: comment:: * ;
@@ -86,24 +87,37 @@ impl<'a> Token<'a> {
8687 }
8788}
8889
90+ #[ allow( clippy:: redundant_closure) ]
91+ fn parse_multiline_string < ' a > (
92+ sep : char ,
93+ lit : impl Fn ( & ' a str ) -> Token < ' a > ,
94+ ) -> impl FnMut ( & ' a str ) -> IResult < & ' a str , Vec < Token < ' a > > > {
95+ map ( parse_string_literal ( sep) , move |x| {
96+ x. into_iter ( )
97+ . map ( |x| lit ( x) )
98+ . intersperse ( Token :: Break ( "\n " ) )
99+ . collect ( )
100+ } )
101+ }
102+
89103/// Parse a string representing an ExprTK Expression Column into `Token`s. A
90104/// token list is sufficient for syntax-highlighting purposes, faster than a
91105/// full parser and much easier to write a renderer for.
92106pub fn tokenize ( input : & str ) -> Vec < Token < ' _ > > {
93- let comment = map ( parse_comment, Token :: Comment ) ;
94- let string = map ( parse_string_literal ( '"' ) , Token :: Literal ) ;
95- let column = map ( parse_string_literal ( '\'' ) , Token :: Column ) ;
96- let symbol = map ( parse_symbol_literal, Token :: Symbol ) ;
97- let number = map ( parse_number_literal, Token :: Literal ) ;
98- let whitespace = map ( space1, Token :: Whitespace ) ;
99- let linebreak = map ( line_ending, Token :: Break ) ;
100- let ops = map ( is_a ( "+-/*^%&|=:;,.(){}[]" ) , Token :: Operator ) ;
101- let unknown = map ( is_not ( " \t \n \r " ) , Token :: Unknown ) ;
102-
103- let mut expr = many0 ( alt ( (
107+ let comment = map ( parse_comment, |x| vec ! [ Token :: Comment ( x) ] ) ;
108+ let string = parse_multiline_string ( '\'' , Token :: Literal ) ;
109+ let column = parse_multiline_string ( '"' , Token :: Column ) ;
110+ let symbol = map ( parse_symbol_literal, |x| vec ! [ Token :: Symbol ( x) ] ) ;
111+ let number = map ( parse_number_literal, |x| vec ! [ Token :: Literal ( x) ] ) ;
112+ let whitespace = map ( space1, |x| vec ! [ Token :: Whitespace ( x) ] ) ;
113+ let linebreak = map ( line_ending, |x| vec ! [ Token :: Break ( x) ] ) ;
114+ let ops = map ( is_a ( "+-/*^%&|=:;,.(){}[]" ) , |x| vec ! [ Token :: Operator ( x) ] ) ;
115+ let unknown = map ( is_not ( " \t \n \r " ) , |x| vec ! [ Token :: Unknown ( x) ] ) ;
116+ let token = alt ( (
104117 comment, string, column, symbol, number, whitespace, linebreak, ops, unknown,
105- ) ) ) ;
118+ ) ) ;
106119
120+ let mut expr = map ( many0 ( token) , |x| x. into_iter ( ) . flatten ( ) . collect ( ) ) ;
107121 let ( rest, mut tokens) = expr ( input) . unwrap_or_else ( |_| ( input, vec ! [ ] ) ) ;
108122 if !rest. is_empty ( ) {
109123 tracing:: warn!(
0 commit comments