/** * Upgraded * !!Do not modify the above line!! */ /** * SafeFN is a Javascript implementation of Christopher Smith's php * SafeFN class which was written for Dokuwiki * * @author Myron Turner * @copyright Myron Turner (C) GPL 2 or greater */ var SafeFN = { plain: '-./[_0123456789abcdefghijklmnopqrstuvwxyz', // these characters aren't converted pre_indicator: '%', post_indicator:']', /** * convert numbers from base 10 to base 36 and base 36 to base 10 * * @param string representing an integer or integer num number to be converted * @param integer from base from which to convert * @param integer to base to which to convert * * @return array int an array of unicode codepoints * * @author Myron Turner */ changeSafeBase: function(num, from, to) { if(isNaN(from) || from < 2 || from > 36 || isNaN(to) || to < 2 || to > 36) { throw (new RangeError("Illegal radix. Radices must be integers between 2 and 36, inclusive.")); } num = parseInt(num, from); if(from == 36) return num; return num.toString(to); }, /** * convert a UTF8 string into an array of unicode code points * * @param UTF8 string * @return array int an array of unicode codepoints * * @author Myron Turner */ get_u_array: function(utf8str) { var unicode_array = new Array(); for (var i=0; i * @author Myron Turner */ safe_to_unicode: function(safe) { var unicode = new Array(); var regex = new RegExp('(?=[' + this.pre_indicator + '\\' + this.post_indicator + '])'); var split_array = safe.split(regex); var converted = false; for (var i = 0; i * @author Myron Turner */ unicode_to_safe: function (unicode) { var safe = ''; var converted = false; var plain_str = this.plain + this.post_indicator; for (var i=0; i< unicode.length; i++) { codepoint = unicode[i]; var match = ''; if(String.fromCharCode(codepoint) != '\\') { var regex = new RegExp(String.fromCharCode(codepoint)); var match = plain_str.match(regex); } if (codepoint < 127 && match) { if (converted) { safe += this.post_indicator; converted = false; } safe += String.fromCharCode(codepoint); } else if (codepoint == this.pre_indicator.charCodeAt(0)) { safe += this.pre_indicator; converted = true; } else { safe += this.pre_indicator + this.changeSafeBase((codepoint-32), 10, 36); converted = true; } } if(converted) safe += this.post_indicator; return safe; }, /** * Convert an UTF-8 string to a safe ASCII String * * * @param string filename a utf8 string, should only include printable characters - not 0x00-0x1f * @return string an encoded representation of filename using only 'safe' ASCII characters * * @author Myron Turner */ encode: function(filename) { return this.unicode_to_safe(this.get_u_array(filename)); }, /** * decode a 'safe' encoded file name and return a UTF8 string * * @param string filename a 'safe' encoded ASCII string, * @return string decoded utf8 string * * @author Myron Turner */ decode: function (filename) { var unic = this.safe_to_unicode(filename); // convert unicode code points to utf8 var str = new Array(); for (var i=0; i < unic.length; i++) { str[i] = this.code2utf(unic[i]); } // return the decoded string return this.utf8Decode(str.join('')); }, /* UTF8 encoding/decoding functions * Copyright (c) 2006 by Ali Farhadi. * released under the terms of the Gnu Public License. * see the GPL for details. * * Email: ali[at]farhadi[dot]ir * Website: http://farhadi.ir/ */ //an alias of String.fromCharCode chr: function (code) { return String.fromCharCode(code); }, //returns utf8 encoded charachter of a unicode value. //code must be a number indicating the Unicode value. //returned value is a string between 1 and 4 charachters. code2utf: function (code) { if (code < 128) return this.chr(code); if (code < 2048) return this.chr(192+(code>>6)) + this.chr(128+(code&63)); if (code < 65536) return this.chr(224+(code>>12)) + this.chr(128+((code>>6)&63)) + this.chr(128+(code&63)); if (code < 2097152) return this.chr(240+(code>>18)) + this.chr(128+((code>>12)&63)) + this.chr(128+((code>>6)&63)) + this.chr(128+(code&63)); }, //it is a private function for internal use in utf8Decode function _utf8Decode: function (utf8str) { var str = new Array(); var code,code2,code3,code4,j = 0; for (var i=0; i 127) code2 = utf8str.charCodeAt(i++); if (code > 223) code3 = utf8str.charCodeAt(i++); if (code > 239) code4 = utf8str.charCodeAt(i++); if (code < 128) str[j++]= this.chr(code); else if (code < 224) str[j++] = this.chr(((code-192)<<6) + (code2-128)); else if (code < 240) str[j++] = this.chr(((code-224)<<12) + ((code2-128)<<6) + (code3-128)); else str[j++] = this.chr(((code-240)<<18) + ((code2-128)<<12) + ((code3-128)<<6) + (code4-128)); } return str.join(''); }, //Decodes a UTF8 formated string utf8Decode: function (utf8str) { var str = new Array(); var pos = 0; var tmpStr = ''; var j=0; while ((pos = utf8str.search(/[^\x00-\x7F]/)) != -1) { tmpStr = utf8str.match(/([^\x00-\x7F]+[\x00-\x7F]{0,10})+/)[0]; str[j++]= utf8str.substr(0, pos) + this._utf8Decode(tmpStr); utf8str = utf8str.substr(pos + tmpStr.length); } str[j++] = utf8str; return str.join(''); } }; function SafeFN_encode(filename) { return SafeFN.encode(filename); } function SafeFN_decode(filename) { return SafeFN.decode(filename); } function dwikiUTF8_encodeFN(file, encoding){ if(encoding == 'utf-8') return file; if(file.match(/^[a-zA-Z0-9\/_\-\.%\]]+$/)){ return file; } if(encoding == 'safe'){ return SafeFN_encode(file); } file = encodeURIComponent(file); file = file.replace(/%2F/g,'/'); return file; } function dwikiUTF8_decodeFN(file, encoding){ if(encoding == 'utf-8') return file; if(encoding == 'safe'){ return SafeFN_decode(file); } return decodeURIComponent(file); }