001    /**
002     * Implements the CFML Function jsstringformat
003     */
004    package railo.runtime.functions.string;
005    
006    import railo.runtime.PageContext;
007    import railo.runtime.ext.function.Function;
008    
009    public final class JSStringFormat implements Function {
010            public static String call(PageContext pc , String str) {
011                    return invoke(str);
012            }
013            public static String invoke(String str) {
014                int len=str.length();
015                    StringBuffer rtn=new StringBuffer(len+10);
016                    //char[] arr=str.toCharArray();
017                    //StringBuffer rtn=new StringBuffer(arr.length);
018                    char c;
019                    for(int i=0;i<len;i++) {
020                        c=str.charAt(i);
021                            switch(c) {
022                                    case '\\': rtn.append("\\\\"); break;
023                                    case '\n': rtn.append("\\n"); break;
024                                    case '\r': rtn.append("\\r"); break;
025                                    case '\f': rtn.append("\\f"); break;
026                                    case '\b': rtn.append("\\b"); break;
027                                    case '\t': rtn.append("\\t"); break;
028                                    case '"' : rtn.append("\\\""); break;
029                                    case '\'': rtn.append("\\\'"); break;
030                                    default : rtn.append(c); break;
031                            }
032                    }
033                    return rtn.toString();
034            }
035            
036            
037            public static String callx(PageContext pc , String jsString) {// MUST ????
038                    int len=jsString.length();
039                    //StringBuffer sb=new StringBuffer(len);
040                    int plus=0;
041                    
042                    for(int pos=0;pos<len;pos++) {
043                char chr = jsString.charAt(pos);
044                
045                switch(chr){
046                                    case '\\': 
047                                    case '\n': 
048                                    case '\r': 
049                                    case '\f': 
050                                    case '\b': 
051                                    case '\t': 
052                                    case '"' : 
053                                    case '\'': plus++; break;
054                }
055                    }
056            if(plus==0) return jsString;
057            
058            char[] chars=new char[len+plus];
059            int count=0;
060            
061                    for(int pos=0;pos<len;pos++) {
062                char chr = jsString.charAt(pos);
063                switch(chr){
064                            case '\\': 
065                                chars[count++]='\\';
066                                chars[count++]='\\';
067                            break;
068                            case '\'': 
069                                chars[count++]='\\';
070                                chars[count++]='\'';
071                            break;
072                            case '"': 
073                                chars[count++]='\\';
074                                chars[count++]='"';
075                            break;
076                    case '\n': 
077                        chars[count++]='\\';
078                        chars[count++]='n';
079                    break;
080                    case '\r': 
081                        chars[count++]='\\';
082                        chars[count++]='r';
083                    break;
084                    case '\f': 
085                        chars[count++]='\\';
086                        chars[count++]='f';
087                    break;
088                    case '\b': 
089                        chars[count++]='\\';
090                        chars[count++]='b';
091                    break;
092                    case '\t': 
093                        chars[count++]='\\';
094                        chars[count++]='t';
095                    break;
096                    default: 
097                        chars[count++]=chr;
098                    break;
099                }
100                    }
101            return new String(chars);
102            }
103    }