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                                        "&#45;&#45;" );
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( "\"", "&quot;" );
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( "&nbsp;", " " );
141                        tokenString = tokenString.replaceAll( "&", "&#38;" );
142                        tokenString = tokenString.replaceAll( " ", "&nbsp;" );
143                        tokenString = tokenString.replaceAll( "\"", "&quot;" );
144                        tokenString = tokenString.replaceAll( "<", "&#60;" );
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( "<", "&lt;" );
207                        tokenString = tokenString.replaceAll( ">", "&gt;" );
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 = "&lt;";
245                        tokenString = config.getHighlightingElementRender( HighlightingElement.sfkSymbol )
246                                        .render( tokenString );
247                }
248                else if ( ETokenType.ttgreaterthan.equals( type ) )
249                {
250                        tokenString = "&gt;";
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}