001 002package gudusoft.gsqlparser.pp.output.html; 003 004import gudusoft.gsqlparser.EDbVendor; 005import gudusoft.gsqlparser.ETokenType; 006import gudusoft.gsqlparser.TSourceToken; 007import gudusoft.gsqlparser.nodes.TObjectName; 008import gudusoft.gsqlparser.pp.output.HighlightingElement; 009import gudusoft.gsqlparser.pp.para.GFmtOpt; 010import gudusoft.gsqlparser.pp.para.styleenums.TCompactMode; 011 012import java.util.Arrays; 013import java.util.regex.Pattern; 014 015public class HtmlRenderUtil 016{ 017 018 private static final String RETURN_CODE = "\r\n"; 019 020 private HtmlOutputConfig config; 021 private GFmtOpt option; 022 private EDbVendor dbVendor; 023 024 public HtmlRenderUtil( HtmlOutputConfig config, GFmtOpt option, 025 EDbVendor dbVendor ) 026 { 027 this.config = config; 028 this.option = option; 029 this.dbVendor = dbVendor; 030 } 031 032 public String renderToken( TSourceToken token ) 033 { 034 boolean isLineBreak = false; 035 String tokenString = token.astext; 036 ETokenType type = token.tokentype; 037 038 tokenString = tokenString.replaceAll( " ", " " ); 039 tokenString = tokenString.replaceAll( "\t", option.tabHtmlString ); 040 041 if ( ETokenType.ttwhitespace.equals( type ) ) 042 { 043 tokenString = config.getHighlightingElementRender( HighlightingElement.sfkSpan ) 044 .render( tokenString ); 045 } 046 else if ( ETokenType.ttreturn.equals( type ) ) 047 { 048 if ( tokenString.contains( RETURN_CODE ) ) 049 { 050 tokenString = tokenString.replaceAll( RETURN_CODE, RETURN_CODE 051 + "</br>" ); 052 } 053 else 054 { 055 tokenString = tokenString.replaceAll( "\n", RETURN_CODE 056 + "</br>" ); 057 } 058 tokenString = config.getHighlightingElementRender( HighlightingElement.sfkSpan ) 059 .render( tokenString ); 060 isLineBreak = true; 061 } 062 else if ( ETokenType.ttsimplecomment.equals( type ) ) 063 { 064 tokenString = tokenString.replaceAll( Pattern.quote( "--" ), 065 "--" ); 066 if ( TCompactMode.Cpmugly.equals( option.compactMode ) ) 067 { 068 tokenString = ( "/* " + tokenString + "*/" ); 069 } 070 tokenString = config.getHighlightingElementRender( HighlightingElement.sfkComment_dh ) 071 .render( tokenString ); 072 } 073 else if ( ETokenType.ttbracketedcomment.equals( type ) ) 074 { 075 if ( tokenString.contains( RETURN_CODE ) ) 076 { 077 tokenString = tokenString.replaceAll( RETURN_CODE, RETURN_CODE 078 + "</br>" ); 079 } 080 else 081 { 082 tokenString = tokenString.replaceAll( "\n", RETURN_CODE 083 + "</br>" ); 084 } 085 tokenString = config.getHighlightingElementRender( HighlightingElement.sfkComment_dh ) 086 .render( tokenString ); 087 } 088 else if ( ETokenType.ttidentifier.equals( type ) 089 || ETokenType.ttdqstring.equals( type ) 090 || ETokenType.ttdbstring.equals( type ) 091 || ETokenType.ttbrstring.equals( type ) ) 092 { 093 if ( ETokenType.ttdqstring.equals( type ) 094 || ETokenType.ttdbstring.equals( type ) ) 095 { 096 tokenString = tokenString.replaceAll( "\"", """ ); 097 } 098 099 int dbObjType = token.getDbObjType( ); 100 switch ( dbObjType ) 101 { 102 case TObjectName.ttobjFunctionName : 103 if ( isVendorBuiltInFunction( tokenString, dbVendor ) ) 104 { 105 tokenString = config.getHighlightingElementRender( HighlightingElement.sfkBuiltInFunction ) 106 .render( tokenString ); 107 } 108 else 109 { 110 tokenString = config.getHighlightingElementRender( HighlightingElement.sfkFunction ) 111 .render( tokenString ); 112 } 113 break; 114 case TObjectName.ttobjDatatype : 115 tokenString = config.getHighlightingElementRender( HighlightingElement.sfkDatatype ) 116 .render( tokenString ); 117 break; 118 default : 119 if ( EDbVendor.dbvmssql.equals( dbVendor ) 120 && isMSSQLSystemVar( tokenString ) ) 121 { 122 tokenString = config.getHighlightingElementRender( HighlightingElement.sfkMssqlsystemvar ) 123 .render( tokenString ); 124 } 125 else 126 { 127 tokenString = config.getHighlightingElementRender( HighlightingElement.sfkIdentifer ) 128 .render( tokenString ); 129 } 130 break; 131 } 132 } 133 else if ( ETokenType.ttnumber.equals( type ) ) 134 { 135 tokenString = config.getHighlightingElementRender( HighlightingElement.sfkNumber ) 136 .render( tokenString ); 137 } 138 else if ( ETokenType.ttsqstring.equals( type ) ) 139 { 140 tokenString = tokenString.replaceAll( " ", " " ); 141 tokenString = tokenString.replaceAll( "&", "&" ); 142 tokenString = tokenString.replaceAll( " ", " " ); 143 tokenString = tokenString.replaceAll( "\"", """ ); 144 tokenString = tokenString.replaceAll( "<", "<" ); 145 if ( tokenString.contains( RETURN_CODE ) ) 146 { 147 tokenString = tokenString.replaceAll( RETURN_CODE, RETURN_CODE 148 + "</br>" ); 149 } 150 else 151 { 152 tokenString = tokenString.replaceAll( "\n", RETURN_CODE 153 + "</br>" ); 154 } 155 tokenString = config.getHighlightingElementRender( HighlightingElement.sfkSQString ) 156 .render( tokenString ); 157 } 158 else if ( ETokenType.ttkeyword.equals( type ) ) 159 { 160 int dbObjType = token.getDbObjType( ); 161 switch ( dbObjType ) 162 { 163 case TObjectName.ttobjFunctionName : 164 if ( isVendorBuiltInFunction( tokenString, dbVendor ) ) 165 { 166 tokenString = config.getHighlightingElementRender( HighlightingElement.sfkBuiltInFunction ) 167 .render( tokenString ); 168 } 169 else 170 { 171 tokenString = config.getHighlightingElementRender( HighlightingElement.sfkFunction ) 172 .render( tokenString ); 173 } 174 break; 175 case TObjectName.ttobjDatatype : 176 tokenString = config.getHighlightingElementRender( HighlightingElement.sfkDatatype ) 177 .render( tokenString ); 178 break; 179 default : 180 if ( EDbVendor.dbvmssql.equals( dbVendor ) 181 && isMSSQLSystemVar( tokenString ) ) 182 { 183 tokenString = config.getHighlightingElementRender( HighlightingElement.sfkMssqlsystemvar ) 184 .render( tokenString ); 185 } 186 else 187 { 188 tokenString = config.getHighlightingElementRender( HighlightingElement.sfkStandardkeyword ) 189 .render( tokenString ); 190 } 191 break; 192 } 193 } 194 else if ( ETokenType.ttsqlvar.equals( type ) ) 195 { 196 tokenString = config.getHighlightingElementRender( HighlightingElement.sfksqlvar ) 197 .render( tokenString ); 198 } 199 else if ( ETokenType.ttbindvar.equals( type ) ) 200 { 201 tokenString = config.getHighlightingElementRender( HighlightingElement.sfkbindvar ) 202 .render( tokenString ); 203 } 204 else if ( ETokenType.ttmulticharoperator.equals( type ) ) 205 { 206 tokenString = tokenString.replaceAll( "<", "<" ); 207 tokenString = tokenString.replaceAll( ">", ">" ); 208 tokenString = config.getHighlightingElementRender( HighlightingElement.sfkSymbol ) 209 .render( tokenString ); 210 } 211 else if ( ETokenType.ttsinglecharoperator.equals( type ) ) 212 { 213 tokenString = config.getHighlightingElementRender( HighlightingElement.sfkSymbol ) 214 .render( tokenString ); 215 } 216 else if ( ETokenType.ttcomma.equals( type ) 217 // || ETokenType.ttOpenSquareBracket.equals( type ) 218 // || ETokenType.ttCloseSquareBracket.equals( type ) 219 // || ETokenType.ttdot.equals( type ) 220 || ETokenType.ttperiod.equals( type ) 221 || ETokenType.ttsemicolon.equals( type ) 222 || ETokenType.ttdolorsign.equals( type ) 223 || ETokenType.ttcolon.equals( type ) 224 || ETokenType.ttplussign.equals( type ) 225 || ETokenType.ttminussign.equals( type ) 226 || ETokenType.ttasterisk.equals( type ) 227 || ETokenType.ttslash.equals( type ) 228 // || ETokenType.ttmulti.equals( type ) 229 // || ETokenType.ttHat.equals( type ) 230 // || ETokenType.ttDiv.equals( type ) 231 || ETokenType.ttstmt_delimiter.equals( type ) 232 || ETokenType.ttequals.equals( type ) 233 || ETokenType.ttatsign.equals( type ) 234 // || ETokenType.ttBitWise.equals( type ) 235 || ETokenType.ttsemicolon2.equals( type ) 236 || ETokenType.ttsemicolon3.equals( type ) 237 || ETokenType.ttquestionmark.equals( type ) ) 238 { 239 tokenString = config.getHighlightingElementRender( HighlightingElement.sfkSymbol ) 240 .render( tokenString ); 241 } 242 else if ( ETokenType.ttlessthan.equals( type ) ) 243 { 244 tokenString = "<"; 245 tokenString = config.getHighlightingElementRender( HighlightingElement.sfkSymbol ) 246 .render( tokenString ); 247 } 248 else if ( ETokenType.ttgreaterthan.equals( type ) ) 249 { 250 tokenString = ">"; 251 tokenString = config.getHighlightingElementRender( HighlightingElement.sfkSymbol ) 252 .render( tokenString ); 253 } 254 else if ( ETokenType.ttleftparenthesis.equals( type ) ) 255 { 256 tokenString = config.getHighlightingElementRender( HighlightingElement.sfkopenbracket ) 257 .render( tokenString ); 258 } 259 else if ( ETokenType.ttrightparenthesis.equals( type ) ) 260 { 261 tokenString = config.getHighlightingElementRender( HighlightingElement.sfkclosebracket ) 262 .render( tokenString ); 263 } 264 else if ( ETokenType.ttsqlpluscmd.equals( type ) ) 265 { 266 tokenString = config.getHighlightingElementRender( HighlightingElement.sfkOraclesqlplus ) 267 .render( tokenString ); 268 } 269 // else if ( ETokenType.ttUserCustomized.equals( type )){ 270 // tokenString = config.getHighlightingElementRender( 271 // HighlightingElement.sfkUserCustomized ) 272 // .render( tokenString ); 273 // } 274 else 275 { 276 tokenString = config.getHighlightingElementRender( HighlightingElement.sfkDefault ) 277 .render( tokenString ); 278 } 279 280 if ( TCompactMode.Cpmugly.equals( option.compactMode ) ) 281 { 282 if ( isLineBreak ) 283 tokenString += "\r\n"; 284 } 285 return tokenString; 286 } 287 288 private boolean isMSSQLSystemVar( String tokenString ) 289 { 290 return false; 291 } 292 293 private boolean isVendorBuiltInFunction( String funcName, EDbVendor dbVendor ) 294 { 295 if ( EDbVendor.dbvoracle.equals( dbVendor ) ) 296 { 297 return isOracleBuiltInFunction( funcName ); 298 } 299 else if ( EDbVendor.dbvmssql.equals( dbVendor ) ) 300 { 301 return isMssqlBuiltInFunction( funcName ); 302 } 303 else if ( EDbVendor.dbvmysql.equals( dbVendor ) ) 304 { 305 return isMysqlBuiltInFunction( funcName ); 306 } 307 return false; 308 } 309 310 private boolean isMysqlBuiltInFunction( String funcName ) 311 { 312 String[] sysFuncNames = new String[]{ 313 "@@CONNECTIONS", 314 "@@CPU_BUSY", 315 "@@CURSOR_ROWS", 316 "@@DATEFIRST", 317 "@@DBTS", 318 "@@ERROR", 319 "@@FETCH_STATUS", 320 "@@IDENTITY", 321 "@@IDLE", 322 "@@IO_BUSY", 323 "@@LANGID", 324 "@@LANGUAGE", 325 "@@LOCK_TIMEOUT", 326 "@@MAX_CONNECTIONS", 327 "@@MAX_PRECISION", 328 "@@NESTLEVEL", 329 "@@OPTIONS", 330 "@@PACKET_ERRORS", 331 "@@PACK_RECEIVED", 332 "@@PACK_SENT", 333 "@@PROCID", 334 "@@REMSERVER", 335 "@@ROWCOUNT", 336 "@@SERVERNAME", 337 "@@SERVICENAME", 338 "@@SPID", 339 "@@TEXTSIZE", 340 "@@TIMETICKS", 341 "@@TOTAL_ERRORS", 342 "@@TOTAL_READ", 343 "@@TOTAL_WRITE", 344 "@@TRANCOUNT", 345 "@@VERSION", 346 "ABS", 347 "ACOS", 348 "APP_NAME", 349 "ASCII", 350 "ASIN", 351 "ATAN", 352 "ATN2", 353 "AVG", 354 "BINARY_CHECKSUM", 355 "CASE", 356 "CAST", 357 "CEILING", 358 "CHAR", 359 "CHARINDEX", 360 "CHECKSUM", 361 "CHECKSUM_AGG", 362 "COALESCE", 363 "COLLATIONPROPERTY", 364 "COLUMNPROPERTY", 365 "COL_LENGTH", 366 "COL_NAME", 367 "CONTAINSTABLE", 368 "CONVERT", 369 "COS", 370 "COT", 371 "COUNT", 372 "COUNT_BIG", 373 "CURRENT_TIMESTAMP", 374 "CURRENT_USER", 375 "CURSOR_STATUS", 376 "DATABASEPROPERTY", 377 "DATABASEPROPERTYEX", 378 "DATALENGTH", 379 "DATEADD", 380 "DATEDIFF", 381 "DATENAME", 382 "DATEPART", 383 "DAY", 384 "DB_ID", 385 "DB_NAME", 386 "DEGREES", 387 "DIFFERENCE", 388 "EXP", 389 "FILEGROUPPROPERTY", 390 "FILEGROUP_ID", 391 "FILEGROUP_NAME", 392 "FILEPROPERTY", 393 "FILE_ID", 394 "FILE_NAME", 395 "FLOOR", 396 "FN_HELPCOLLATIONS", 397 "FN_LISTEXTENDEDPROPERTY", 398 "FN_SERVERSHAREDDRIVES", 399 "FN_TRACE_GETEVENTINFO", 400 "FN_TRACE_GETFILTERINFO", 401 "FN_TRACE_GETINFO", 402 "FN_TRACE_GETTABLE", 403 "FN_VIRTUALFILESTATS", 404 "FN_VIRTUALFILESTATS", 405 "FORMATMESSAGE", 406 "FREETEXTTABLE", 407 "FULLTEXTCATALOGPROPERTY", 408 "FULLTEXTSERVICEPROPERTY", 409 "GETANSINULL", 410 "GETDATE", 411 "GETUTCDATE", 412 "GROUPING", 413 "HAS_DBACCESS", 414 "HOST_ID", 415 "HOST_NAME", 416 "IDENTITY", 417 "IDENT_CURRENT", 418 "IDENT_INCR", 419 "IDENT_SEED", 420 "INDEXKEY_PROPERTY", 421 "INDEXPROPERTY", 422 "INDEX_COL", 423 "ISDATE", 424 "ISNULL", 425 "ISNUMERIC", 426 "IS_MEMBER", 427 "IS_SRVROLEMEMBER", 428 "LEFT", 429 "LEN", 430 "LOG", 431 "LOG10", 432 "LOWER", 433 "LTRIM", 434 "MAX", 435 "MIN", 436 "MONTH", 437 "NCHAR", 438 "NEWID", 439 "NULLIF", 440 "OBJECTPROPERTY", 441 "OBJECT_ID", 442 "OBJECT_NAME", 443 "OPENDATASOURCE", 444 "OPENQUERY", 445 "OPENROWSET", 446 "OPENXML", 447 "PARSENAME", 448 "PATINDEX", 449 "PATINDEX", 450 "PERMISSIONS", 451 "PI", 452 "POWER", 453 "QUOTENAME", 454 "RADIANS", 455 "RAND", 456 "REPLACE", 457 "REPLICATE", 458 "REVERSE", 459 "RIGHT", 460 "ROUND", 461 "ROWCOUNT_BIG", 462 "RTRIM", 463 "SCOPE_IDENTITY", 464 "SERVERPROPERTY", 465 "SESSIONPROPERTY", 466 "SESSION_USER", 467 "SIGN", 468 "SIN", 469 "SOUNDEX", 470 "SPACE", 471 "SQL_VARIANT_PROPERTY", 472 "SQRT", 473 "SQUARE", 474 "STATS_DATE", 475 "STDEV", 476 "STDEVP", 477 "STR", 478 "STUFF", 479 "SUBSTRING", 480 "SUM", 481 "SUSER_SID", 482 "SUSER_SNAME", 483 "SYSTEM_USER", 484 "TAN", 485 "TEXTPTR", 486 "TEXTVALID", 487 "TYPEPROPERTY", 488 "UNICODE", 489 "UPPER", 490 "USER", 491 "USER_ID", 492 "USER_NAME", 493 "VAR", 494 "VARP", 495 "YEAR" 496 }; 497 return Arrays.asList( sysFuncNames ).contains( funcName.toUpperCase( ) ); 498 } 499 500 private boolean isMssqlBuiltInFunction( String funcName ) 501 { 502 // TODO Auto-generated method stub 503 return false; 504 } 505 506 private boolean isOracleBuiltInFunction( String funcName ) 507 { 508 return false; 509 } 510}