@@ -68,6 +68,11 @@ impl Commands {
68
68
let mut opt_lambda_state = None ;
69
69
let mut opt_final_states = vec ! [ ] ;
70
70
71
+ let handler = Arc :: new ( Command {
72
+ guard,
73
+ ptr : Box :: new ( handler) ,
74
+ } ) ;
75
+
71
76
command
72
77
. split ( ' ' )
73
78
. filter ( |segment| segment. len ( ) > 0 )
@@ -90,18 +95,25 @@ impl Commands {
90
95
} else {
91
96
opt_lambda_state = None ;
92
97
opt_final_states. truncate ( 0 ) ;
98
+ let last_state = state;
93
99
state = self . add_space ( state, i) ;
94
100
95
101
if segment. starts_with ( "```\n " ) && segment. ends_with ( "```" ) {
96
102
state = self . add_code_segment_multi_line ( state, segment) ;
97
103
} else if segment. starts_with ( "```" ) && segment. ends_with ( "```" ) {
98
- state = self . add_code_segment_single_line ( state, 3 , segment ) ;
104
+ state = self . add_code_segment_single_line ( state, segment , 3 ) ;
99
105
} else if segment. starts_with ( '`' ) && segment. ends_with ( '`' ) {
100
- state = self . add_code_segment_single_line ( state, 1 , segment ) ;
106
+ state = self . add_code_segment_single_line ( state, segment , 1 ) ;
101
107
} else if segment. starts_with ( '{' ) && segment. ends_with ( '}' ) {
102
108
state = self . add_dynamic_segment ( state, segment) ;
103
109
} else if segment. ends_with ( "..." ) {
104
- state = self . add_remaining_segment ( state, segment) ;
110
+ if segment == "..." {
111
+ self . state_machine . set_final_state ( last_state) ;
112
+ self . state_machine . set_handler ( last_state, handler. clone ( ) ) ;
113
+ state = self . add_unnamed_remaining_segment ( last_state) ;
114
+ } else {
115
+ state = self . add_remaining_segment ( state, segment) ;
116
+ }
105
117
} else {
106
118
segment. chars ( ) . for_each ( |ch| {
107
119
state = self . state_machine . add ( state, CharacterSet :: from_char ( ch) )
@@ -110,11 +122,6 @@ impl Commands {
110
122
}
111
123
} ) ;
112
124
113
- let handler = Arc :: new ( Command {
114
- guard,
115
- ptr : Box :: new ( handler) ,
116
- } ) ;
117
-
118
125
if opt_lambda_state. is_some ( ) {
119
126
opt_final_states. iter ( ) . for_each ( |state| {
120
127
self . state_machine . set_final_state ( * state) ;
@@ -246,6 +253,14 @@ impl Commands {
246
253
state
247
254
}
248
255
256
+ fn add_unnamed_remaining_segment ( & mut self , mut state : usize ) -> usize {
257
+ let char_set = CharacterSet :: any ( ) ;
258
+ state = self . state_machine . add ( state, char_set) ;
259
+ self . state_machine . add_next_state ( state, state) ;
260
+
261
+ state
262
+ }
263
+
249
264
fn add_code_segment_multi_line ( & mut self , mut state : usize , s : & ' static str ) -> usize {
250
265
let name = & s[ 4 ..s. len ( ) - 3 ] ;
251
266
@@ -279,8 +294,8 @@ impl Commands {
279
294
fn add_code_segment_single_line (
280
295
& mut self ,
281
296
mut state : usize ,
282
- n_backticks : usize ,
283
297
s : & ' static str ,
298
+ n_backticks : usize ,
284
299
) -> usize {
285
300
use std:: iter:: repeat;
286
301
0 commit comments