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 }