1*d219b4ceSAdam Hornacek/* 2*d219b4ceSAdam Hornacek * CDDL HEADER START 3*d219b4ceSAdam Hornacek * 4*d219b4ceSAdam Hornacek * The contents of this file are subject to the terms of the 5*d219b4ceSAdam Hornacek * Common Development and Distribution License (the "License"). 6*d219b4ceSAdam Hornacek * You may not use this file except in compliance with the License. 7*d219b4ceSAdam Hornacek * 8*d219b4ceSAdam Hornacek * See LICENSE.txt included in this distribution for the specific 9*d219b4ceSAdam Hornacek * language governing permissions and limitations under the License. 10*d219b4ceSAdam Hornacek * 11*d219b4ceSAdam Hornacek * When distributing Covered Code, include this CDDL HEADER in each 12*d219b4ceSAdam Hornacek * file and include the License file at LICENSE.txt. 13*d219b4ceSAdam Hornacek * If applicable, add the following below this CDDL HEADER, with the 14*d219b4ceSAdam Hornacek * fields enclosed by brackets "[]" replaced with your own identifying 15*d219b4ceSAdam Hornacek * information: Portions Copyright [yyyy] [name of copyright owner] 16*d219b4ceSAdam Hornacek * 17*d219b4ceSAdam Hornacek * CDDL HEADER END 18*d219b4ceSAdam Hornacek */ 19*d219b4ceSAdam Hornacek 20*d219b4ceSAdam Hornacek/* 21*d219b4ceSAdam Hornacek * Copyright (c) 2006, 2017, Oracle and/or its affiliates. All rights reserved. 22*d219b4ceSAdam Hornacek * Portions Copyright (c) 2017, 2019, Chris Fraire <cfraire@me.com>. 23*d219b4ceSAdam Hornacek */ 24*d219b4ceSAdam Hornacek 25*d219b4ceSAdam Hornacek<YYINITIAL> { 26*d219b4ceSAdam Hornacek 27*d219b4ceSAdam Hornacek {Identifier} { 28*d219b4ceSAdam Hornacek chkLOC(); 29*d219b4ceSAdam Hornacek if (offerSymbol(yytext(), 0, false) && returnOnSymbol()) { 30*d219b4ceSAdam Hornacek return yystate(); 31*d219b4ceSAdam Hornacek } 32*d219b4ceSAdam Hornacek } 33*d219b4ceSAdam Hornacek 34*d219b4ceSAdam Hornacek {NumericLiteral} { 35*d219b4ceSAdam Hornacek chkLOC(); 36*d219b4ceSAdam Hornacek onDisjointSpanChanged(HtmlConsts.NUMBER_CLASS, yychar); 37*d219b4ceSAdam Hornacek offer(yytext()); 38*d219b4ceSAdam Hornacek onDisjointSpanChanged(null, yychar); 39*d219b4ceSAdam Hornacek } 40*d219b4ceSAdam Hornacek 41*d219b4ceSAdam Hornacek \" { 42*d219b4ceSAdam Hornacek chkLOC(); 43*d219b4ceSAdam Hornacek yypush(STRING); 44*d219b4ceSAdam Hornacek onDisjointSpanChanged(HtmlConsts.STRING_CLASS, yychar); 45*d219b4ceSAdam Hornacek offer(yytext()); 46*d219b4ceSAdam Hornacek } 47*d219b4ceSAdam Hornacek 48*d219b4ceSAdam Hornacek \' { 49*d219b4ceSAdam Hornacek chkLOC(); 50*d219b4ceSAdam Hornacek yypush(QSTRING); 51*d219b4ceSAdam Hornacek onDisjointSpanChanged(HtmlConsts.STRING_CLASS, yychar); 52*d219b4ceSAdam Hornacek offer(yytext()); 53*d219b4ceSAdam Hornacek } 54*d219b4ceSAdam Hornacek 55*d219b4ceSAdam Hornacek \` { 56*d219b4ceSAdam Hornacek chkLOC(); 57*d219b4ceSAdam Hornacek yypush(TEMPLATE); 58*d219b4ceSAdam Hornacek onDisjointSpanChanged(HtmlConsts.STRING_CLASS, yychar); 59*d219b4ceSAdam Hornacek offer(yytext()); 60*d219b4ceSAdam Hornacek } 61*d219b4ceSAdam Hornacek 62*d219b4ceSAdam Hornacek "/*" { 63*d219b4ceSAdam Hornacek yypush(COMMENT); 64*d219b4ceSAdam Hornacek onDisjointSpanChanged(HtmlConsts.COMMENT_CLASS, yychar); 65*d219b4ceSAdam Hornacek offer(yytext()); 66*d219b4ceSAdam Hornacek } 67*d219b4ceSAdam Hornacek 68*d219b4ceSAdam Hornacek "//" { 69*d219b4ceSAdam Hornacek yypush(SCOMMENT); 70*d219b4ceSAdam Hornacek onDisjointSpanChanged(HtmlConsts.COMMENT_CLASS, yychar); 71*d219b4ceSAdam Hornacek offer(yytext()); 72*d219b4ceSAdam Hornacek } 73*d219b4ceSAdam Hornacek 74*d219b4ceSAdam Hornacek /* 75*d219b4ceSAdam Hornacek * Literal regexps are in conflict with division "/" and are detected 76*d219b4ceSAdam Hornacek * in javascript based on context and when ambiguous, the division has 77*d219b4ceSAdam Hornacek * a higher precedence. We do a best-effort context matching for 78*d219b4ceSAdam Hornacek * preceding "=" (variable), "(" (function call) or ":" (object). 79*d219b4ceSAdam Hornacek */ 80*d219b4ceSAdam Hornacek [:=(] {WhspChar}* "/" { 81*d219b4ceSAdam Hornacek String capture = yytext(); 82*d219b4ceSAdam Hornacek yypush(REGEXP); 83*d219b4ceSAdam Hornacek offer(capture.substring(0, capture.length() - 1)); 84*d219b4ceSAdam Hornacek onDisjointSpanChanged(HtmlConsts.STRING_CLASS, yychar + yylength() - 1); 85*d219b4ceSAdam Hornacek offer("/"); 86*d219b4ceSAdam Hornacek } 87*d219b4ceSAdam Hornacek 88*d219b4ceSAdam Hornacek [\{\}] { 89*d219b4ceSAdam Hornacek chkLOC(); 90*d219b4ceSAdam Hornacek String capture = yytext(); 91*d219b4ceSAdam Hornacek if (notInTemplateOrSubstitutionDoesNotEnd(capture)) { 92*d219b4ceSAdam Hornacek offer(capture); 93*d219b4ceSAdam Hornacek } 94*d219b4ceSAdam Hornacek } 95*d219b4ceSAdam Hornacek} 96*d219b4ceSAdam Hornacek 97*d219b4ceSAdam Hornacek<STRING> { 98*d219b4ceSAdam Hornacek \\[\"\\] { 99*d219b4ceSAdam Hornacek chkLOC(); 100*d219b4ceSAdam Hornacek offer(yytext()); 101*d219b4ceSAdam Hornacek } 102*d219b4ceSAdam Hornacek 103*d219b4ceSAdam Hornacek \" { 104*d219b4ceSAdam Hornacek chkLOC(); 105*d219b4ceSAdam Hornacek offer(yytext()); 106*d219b4ceSAdam Hornacek onDisjointSpanChanged(null, yychar); 107*d219b4ceSAdam Hornacek yypop(); 108*d219b4ceSAdam Hornacek } 109*d219b4ceSAdam Hornacek} 110*d219b4ceSAdam Hornacek 111*d219b4ceSAdam Hornacek<REGEXP> { 112*d219b4ceSAdam Hornacek \\[/] { 113*d219b4ceSAdam Hornacek chkLOC(); 114*d219b4ceSAdam Hornacek offer(yytext()); 115*d219b4ceSAdam Hornacek } 116*d219b4ceSAdam Hornacek \/[gimsuy]* { 117*d219b4ceSAdam Hornacek chkLOC(); 118*d219b4ceSAdam Hornacek offer("/"); 119*d219b4ceSAdam Hornacek onDisjointSpanChanged(null, yychar); 120*d219b4ceSAdam Hornacek offer(yytext().substring(1)); 121*d219b4ceSAdam Hornacek yypop(); 122*d219b4ceSAdam Hornacek } 123*d219b4ceSAdam Hornacek} 124*d219b4ceSAdam Hornacek 125*d219b4ceSAdam Hornacek<QSTRING> { 126*d219b4ceSAdam Hornacek \\[\'\\] { 127*d219b4ceSAdam Hornacek chkLOC(); 128*d219b4ceSAdam Hornacek offer(yytext()); 129*d219b4ceSAdam Hornacek } 130*d219b4ceSAdam Hornacek 131*d219b4ceSAdam Hornacek \' { 132*d219b4ceSAdam Hornacek chkLOC(); 133*d219b4ceSAdam Hornacek offer(yytext()); 134*d219b4ceSAdam Hornacek onDisjointSpanChanged(null, yychar); 135*d219b4ceSAdam Hornacek yypop(); 136*d219b4ceSAdam Hornacek } 137*d219b4ceSAdam Hornacek} 138*d219b4ceSAdam Hornacek 139*d219b4ceSAdam Hornacek<TEMPLATE> { 140*d219b4ceSAdam Hornacek \\[\`\$\\] { 141*d219b4ceSAdam Hornacek chkLOC(); 142*d219b4ceSAdam Hornacek offer(yytext()); 143*d219b4ceSAdam Hornacek } 144*d219b4ceSAdam Hornacek 145*d219b4ceSAdam Hornacek \` { 146*d219b4ceSAdam Hornacek chkLOC(); 147*d219b4ceSAdam Hornacek offer(yytext()); 148*d219b4ceSAdam Hornacek onDisjointSpanChanged(null, yychar); 149*d219b4ceSAdam Hornacek yypop(); 150*d219b4ceSAdam Hornacek } 151*d219b4ceSAdam Hornacek 152*d219b4ceSAdam Hornacek "${" { 153*d219b4ceSAdam Hornacek chkLOC(); 154*d219b4ceSAdam Hornacek offer(yytext()); 155*d219b4ceSAdam Hornacek onDisjointSpanChanged(null, yychar); 156*d219b4ceSAdam Hornacek pushData(); 157*d219b4ceSAdam Hornacek substitutionOp(); 158*d219b4ceSAdam Hornacek yypush(YYINITIAL); 159*d219b4ceSAdam Hornacek } 160*d219b4ceSAdam Hornacek} 161*d219b4ceSAdam Hornacek 162*d219b4ceSAdam Hornacek<COMMENT> { 163*d219b4ceSAdam Hornacek "*/" { 164*d219b4ceSAdam Hornacek offer(yytext()); 165*d219b4ceSAdam Hornacek onDisjointSpanChanged(null, yychar); 166*d219b4ceSAdam Hornacek yypop(); 167*d219b4ceSAdam Hornacek } 168*d219b4ceSAdam Hornacek} 169*d219b4ceSAdam Hornacek 170*d219b4ceSAdam Hornacek<SCOMMENT> { 171*d219b4ceSAdam Hornacek {WhspChar}*{EOL} { 172*d219b4ceSAdam Hornacek onDisjointSpanChanged(null, yychar); 173*d219b4ceSAdam Hornacek yypop(); 174*d219b4ceSAdam Hornacek onEndOfLineMatched(yytext(), yychar); 175*d219b4ceSAdam Hornacek } 176*d219b4ceSAdam Hornacek} 177*d219b4ceSAdam Hornacek 178*d219b4ceSAdam Hornacek<YYINITIAL, STRING, REGEXP, COMMENT, SCOMMENT, QSTRING, TEMPLATE> { 179*d219b4ceSAdam Hornacek {WhspChar}*{EOL} { 180*d219b4ceSAdam Hornacek onEndOfLineMatched(yytext(), yychar); 181*d219b4ceSAdam Hornacek } 182*d219b4ceSAdam Hornacek [[\s]--[\n]] { 183*d219b4ceSAdam Hornacek offer(yytext()); 184*d219b4ceSAdam Hornacek } 185*d219b4ceSAdam Hornacek [^\n] { 186*d219b4ceSAdam Hornacek chkLOC(); 187*d219b4ceSAdam Hornacek offer(yytext()); 188*d219b4ceSAdam Hornacek } 189*d219b4ceSAdam Hornacek} 190*d219b4ceSAdam Hornacek 191*d219b4ceSAdam Hornacek<STRING, COMMENT, SCOMMENT, QSTRING, TEMPLATE> { 192*d219b4ceSAdam Hornacek {FPath} { 193*d219b4ceSAdam Hornacek chkLOC(); 194*d219b4ceSAdam Hornacek onPathlikeMatched(yytext(), '/', false, yychar); 195*d219b4ceSAdam Hornacek } 196*d219b4ceSAdam Hornacek 197*d219b4ceSAdam Hornacek {File} { 198*d219b4ceSAdam Hornacek chkLOC(); 199*d219b4ceSAdam Hornacek onFilelikeMatched(yytext(), yychar); 200*d219b4ceSAdam Hornacek } 201*d219b4ceSAdam Hornacek 202*d219b4ceSAdam Hornacek {FNameChar}+ "@" {FNameChar}+ "." {FNameChar}+ { 203*d219b4ceSAdam Hornacek chkLOC(); 204*d219b4ceSAdam Hornacek onEmailAddressMatched(yytext(), yychar); 205*d219b4ceSAdam Hornacek } 206*d219b4ceSAdam Hornacek} 207*d219b4ceSAdam Hornacek 208*d219b4ceSAdam Hornacek<STRING, SCOMMENT, TEMPLATE> { 209*d219b4ceSAdam Hornacek {BrowseableURI} { 210*d219b4ceSAdam Hornacek chkLOC(); 211*d219b4ceSAdam Hornacek onUriMatched(yytext(), yychar); 212*d219b4ceSAdam Hornacek } 213*d219b4ceSAdam Hornacek} 214*d219b4ceSAdam Hornacek 215*d219b4ceSAdam Hornacek<COMMENT> { 216*d219b4ceSAdam Hornacek {BrowseableURI} { 217*d219b4ceSAdam Hornacek onUriMatched(yytext(), yychar, StringUtils.END_C_COMMENT); 218*d219b4ceSAdam Hornacek } 219*d219b4ceSAdam Hornacek} 220*d219b4ceSAdam Hornacek 221*d219b4ceSAdam Hornacek<QSTRING> { 222*d219b4ceSAdam Hornacek {BrowseableURI} { 223*d219b4ceSAdam Hornacek chkLOC(); 224*d219b4ceSAdam Hornacek onUriMatched(yytext(), yychar, StringUtils.APOS_NO_BSESC); 225*d219b4ceSAdam Hornacek } 226*d219b4ceSAdam Hornacek} 227