@@ -46,25 +46,50 @@ Lexer.prototype.get = function() {
4646*/
4747var mathPattern = {
4848 exec : function ( str ) {
49- if ( str . indexOf ( '$' ) !== 0 ) return null ;
50-
51- var pos = 1 ;
52- var len = str . length ;
53- while ( pos < len && ( str [ pos ] != '$' || str [ pos - 1 ] == '\\' ) ) pos ++ ;
49+ var delimiters = [
50+ { start : '$' , end : '$' } ,
51+ { start : '\\(' , end : '\\)' }
52+ ] ;
53+ var totalLen = str . length ;
54+
55+ for ( var di = 0 ; di < delimiters . length ; di ++ ) {
56+ var startDel = delimiters [ di ] . start ;
57+ if ( str . indexOf ( startDel ) !== 0 ) continue ;
58+
59+ var endDel = delimiters [ di ] . end ;
60+ var endPos = startDel . length ;
61+ var remain = str . slice ( endPos ) ;
62+ while ( endPos < totalLen ) {
63+ var pos = remain . indexOf ( endDel ) ;
64+ if ( pos < 0 )
65+ throw new ParseError ( 'Math environment is not closed' , this . _pos , this . _input ) ;
66+
67+ // false positive, it's escaped, not a match
68+ if ( pos > 0 && remain [ pos - 1 ] === '\\' ) {
69+ var skipLen = pos + endDel . length ;
70+ remain = remain . slice ( skipLen ) ;
71+ endPos += skipLen ;
72+ continue ;
73+ }
74+
75+ var res = [ str . slice ( 0 , endPos + pos + endDel . length ) ,
76+ str . slice ( startDel . length , endPos + pos ) ] ;
77+ return res ;
78+ }
79+ }
5480
55- if ( pos === len ) return null ;
56- return [ str . substring ( 0 , pos + 1 ) , str . substring ( 1 , pos ) ] ;
81+ return null ;
5782 }
5883} ;
5984var atomRegex = {
6085 // TODO: which is correct? func: /^\\(?:[a-zA-Z]+|.)/,
6186 special : / ^ ( \\ \\ | \\ { | \\ } | \\ \$ | \\ & | \\ # | \\ % | \\ _ ) / ,
87+ math : mathPattern , ///^\$.*\$/
6288 func : / ^ \\ ( [ a - z A - Z ] + ) / ,
6389 open : / ^ \{ / ,
6490 close : / ^ \} / ,
6591 quote : / ^ ( ` | ` ` | ' | ' ' ) / ,
66- ordinary : / ^ [ ^ \\ { } $ & # % _ \s ] + / ,
67- math : mathPattern ///^\$.*\$/,
92+ ordinary : / ^ [ ^ \\ { } $ & # % _ \s ] + /
6893} ;
6994var commentRegex = / ^ % .* / ;
7095var whitespaceRegex = / ^ \s + / ;
0 commit comments