-- 作者:jpz6311whu
-- 发布时间:12/26/2005 4:45:00 PM
--
4中的源代码: //SHARE-IN-MEMORY=true // // Copyright 2000,2001 Macromedia, Inc. All rights reserved. // //string.js // //Generic set of functions for manipulating and parsing text strings // //------------------------------------------------------------------ // // //extractArgs(behFnCallStr){ //escQuotes(theStr){ //unescQuotes(theStr){ //quoteMeta(theStr){ //errMsg() { //badChars(theStr){ //getParam(tagStr,param){ //quote(textStr,quoteType){ //stripSpaces(theStr) { //StripChars(theFilter,theString) //Strips all chars in theFilter out of theString and returns the result //AllInRange(x,y,theString) //Returns true if all of the chars in theString are in the range x,y (inclusive) //reformat (s) //tricky: see desc below //Trim(theString) //returns theString with white space trimmed of the front and back //createDisplayString(theStr, maxLen) //limits string size and appends ellipsis: fn("foo bar zoo",6) => "foo..." //entityNameEncode(origStr) //Given a string, returns the string with high-ASCII chars entity encoded. //entityNameDecode(origStr) //Given a string, returns the string with high-ASCII chars entity decoded. //stripAcceralator(theStr) // Strips Acceralator characters (_E) for Japanese //SPrintF(pattern, strings); //SPrintF routine. accepts %s or %s1, etc... //Given a function call, extracts the args and returns them in array //Respects ', skips over stuff between quotes, and returns them dequoted. //IMPORTANT: argArray[0] is the function call!! Actual args start at argArray[1]. function extractArgs(behFnCallStr){ var i, theStr, lastPos, argArray; argArray = getTokens(behFnCallStr,"(),"); for (i=0; i<argArray.length; i++) { theStr = stripSpaces(unescQuotes(argArray[i])); lastPos = theStr.length-1; if (theStr.charAt(0) == "'" && lastPos > 0 && theStr.charAt(lastPos) == "'") argArray[i] = theStr.substring(1,lastPos); } return argArray } //Passed a string, finds special chars '"\ and escapes them with function escQuotes(theStr){ var i, theChar, escStr = ""; for(var i=0; i<theStr.length; i++) { theChar = theStr.charAt(i); escStr += (theChar=='"' || theChar=="'" || theChar=="\\")?("\\"+theChar):theChar; } return escStr; } //Passed a string, finds any escape chars \ and removes them function unescQuotes(theStr){ var strLen, i, theChar, unescStr = ""; strLen = theStr.length; for(i=0; i<strLen; i++) { theChar = theStr.charAt(i); if (theChar == "\\" && i < strLen - 1) //if escape char and not end theChar = theStr.charAt(++i); //append next char and skip over unescStr += theChar; } return unescStr; } //Passed a string, finds meta chars and escapes them with function quoteMeta(theStr){ theStr = theStr.replace(/\\/g, "\\\\") theStr = theStr.replace(/\[/g, "\\[") theStr = theStr.replace(/\^/g, "\\^") theStr = theStr.replace(/\{/g, "\\{") return theStr; } //Emulates printf("blah blah %s blah %s",str1,str2) //Used for concatenating error message for easier localization. //Returns assembled string. function errMsg() { var i,numArgs,errStr="",argNum=0,startPos; numArgs = errMsg.arguments.length; if (numArgs) { theStr = errMsg.arguments[argNum++]; startPos = 0; endPos = theStr.indexOf("%s",startPos); if (endPos == -1) endPos = theStr.length; while (startPos < theStr.length) { errStr += theStr.substring(startPos,endPos); if (argNum < numArgs) errStr += errMsg.arguments[argNum++]; startPos = endPos+2; endPos = theStr.indexOf("%s",startPos); if (endPos == -1) endPos = theStr.length; } if (!errStr) errStr = errMsg.arguments[0]; } return errStr; } //Passed a string, finds removes special chars '"! and space function badChars(theStr){ var i,theChar,isBad=false; var someBadChars = " ~!@#$%^&*()_+|`-=\\{}[]:\";'<>,./?"; for (i=0; i<theStr.length; i++) { theChar = theStr.charAt(i); if (someBadChars.indexOf(theChar) != -1) isBad = true; } return isBad; } //Accepts a pattern string and some substrings (or numbers). Inserts the strings into the pattern. //The pattern string can use %s or %s0, etc for the strings. You can mix them if you like - the %s //pattern will ignore the %s0 pattern as far as count. //That is: //SprintF("%s%s2%s", "a", "b", "c") will return "acb" // //Note that you can only have 10 indexed strings. function SPrintF() { var argc = SPrintF.arguments.length; if (argc == 0) return ""; if (argc == 1) return SPrintF.arguments[0]; var resultString = ""; var nextIndString = 1; var splits = SPrintF.arguments[0].split("%s"); for (i=0; i<splits.length; i++) { //write out the split itself. var splitToWrite = splits[i]; if (splitToWrite.length > 0 && !isNaN(splitToWrite.charAt(0))) resultString += splitToWrite.substring(1,splitToWrite.length-1); else resultString += splitToWrite; //Now write out the next string in the list. See if the next string was part of //an %s0 pattern, or was normal. if (i < splits.length-1) { if (splits[i+1].length > 0 && !isNaN(splits[i+1].charAt(0))) { //use the indexed strng. var stringIndex = parseInt(splits[i+1].charAt(0)); resultString += SPrintF.arguments[stringIndex]; } else { //Pick the next string out of the array. resultString += SPrintF.arguments[nextIndString++]; } } } return resultString; } //SPrintF //Custom non-Javascript code to extract tags and get object names. //Passed HTML tag (ie IMG), gets the current doc source //HTML and returns an array of names (empty if unnamed). //This argument is not case sensitive (can be LAYER, Layer, or layer). //For Example, given <IMG NAME="myPhoto"> <IMG><IMG name="bobsPhoto"> //returns array: myPhoto,,bobsPhoto function getParam(tagStr,param){ var j,tokenString; var theName = ""; var tokenArray = new Array; tokenArray = getTokens(tagStr," =<>"); for (j=0; j<(tokenArray.length - 1); j++) { tokenString = tokenArray[j].toUpperCase(); //force UPPER CASE if (tokenString.indexOf(param.toUpperCase()) == 0) { //found name theName = tokenArray[j+1]; //should return single quoted element in array firstChar = theName.charAt(0); lastChar = theName.charAt(theName.length - 1); if ((firstChar == lastChar) && (firstChar == "'" || firstChar == "\"")) theName = theName.substring(1,theName.length - 1); break; } } return theName; } //function: quote //description: wraps text string in single or double quotes //argument - textStr // quote type - use 1 for single quotes and 2 for double quotes function quote(textStr,quoteType){ var quote = (quoteType == 1)?"'":'"'; return quote + textStr + quote; } //Removes any spaces at the beginning or end of the string function stripSpaces(theStr) { if (!theStr) theStr = ""; //ensure its not null theStr = theStr.replace(/^\s*/,""); //strip leading theStr = theStr.replace(/\s+$/,""); //strip trailing return theStr; } //Given an object reference string, returns the object name. For ex: // objName = getNameFromRef("document.image1"); //returns "image1" // objName = getNameFromRef("document.layers['image1']"); //returns "image1" // //If given an object in a frame, returns the objName?frameNameOrNum: // objName = getNameFromRef("parent.frames['main'].document.image1"); //returns "image1?main" //This is an expected value for MM_findObj(). function getNameFromRef(objRefStr) { var c, startPos, objName=objRefStr, frameSearch; var lastDot = objRefStr.lastIndexOf("."); var lastBracket = objRefStr.lastIndexOf("]"); if (lastDot != -1 || lastBracket != -1) { if (lastDot > lastBracket) { //name after a dot objName = objRefStr.substring(lastDot+1); } else { //name in brackets while (lastBracket > 0 && ((c=objRefStr.charAt(lastBracket-1))=="'" || c=='"' || c=="\\")) lastBracket--; //skip ',", startPos = lastBracket-1; //start at end of name while (startPos > 0 && ((c=objRefStr.charAt(startPos))!="'" && c!='"' && c!="\\" && c!="[")) startPos--; //seek ',",\,[ objName = objRefStr.substring(startPos+1,lastBracket); } frameSearch = objRefStr.match(/\.frames\[\\?['"]?([^'"\\]+)\\?['"]?\]/); //find .frames['foo'] or .frames[3] if (frameSearch && frameSearch[1]) { //if framename, add after a question mark objName += "?"+frameSearch[1]; } } return objName; } function StripChars(theFilter,theString) { if (!theString) theString = ""; /* Returns theString with all occurrences of every char in theFilter deleted: Example: var x = StripChars("lo!", "Hello World!") alert(x) // x is now "He Wrd" */ var strOut,i,curChar strOut = "" for (i=0;i < theString.length; i++) { curChar = theString.charAt(i) if (theFilter.indexOf(curChar) < 0) // if it's not in the filter, send it thru strOut += curChar } return strOut } function AllInRange(x,y,theString) { /* Returns true if all characters in theString fall in the range x,y (inclusive) Example: AllInRange("0", "9", "848393874") is true AllInRange("0", "9", "22Hello33") is false */ var i, curChar for (i=0; i < theString.length; i++) { curChar = theString.charAt(i) if (curChar < x || curChar > y) //the char is not in range return false } return true } function reformat (s) { /* reformat() params: s - the string to be reformatted Then alternating numbers and strings Example: var x = reformat("7604346267", 0, "(", 3, ")", 3, "-") alert(x) // x is now (760)434-6267 */ var arg; var sPos = 0; var resultString = ""; for (var i = 1; i < reformat.arguments.length; i++) { arg = reformat.arguments[i]; if (i % 2 == 1) resultString += arg; else { resultString += s.substring(sPos, sPos + arg); sPos += arg; } } return resultString; } function Trim(theString) { /* Returns theString with white space trimmed off the front and back */ var i,firstNonWhite if (StripChars(" \n\r\t",theString).length == 0 ) return "" i = -1 while (1) { i++ if (theString.charAt(i) != " ") break } firstNonWhite = i //Count the spaces at the end i = theString.length while (1) { i-- if (theString.charAt(i) != " ") break } return theString.substring(firstNonWhite,i + 1) } function IsValidVarName(theName) { if (!MM.allowDotInName) { if (StripChars("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_",theName).length > 0) return false; } else { if (StripChars("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_.",theName).length > 0) return false; } if (theName.charAt(0) == "_" || theName.charAt(theName.length - 1) == "_") return false; if (MM.allowDotInName) { if (theName.charAt(0) == "." || theName.charAt(theName.length - 1) == ".") return false; } if (AllInRange("0", "9", theName.substring(0,1))) return false; return true; } //Returns a single-line string with entities replaced. //If optional maxLen param is passed, returns string //no longer than maxLen chars. If it exceeds that length, it is //shortened and ... is appendend. function createDisplayString(theStr, maxLen) { theStr = stripSpaces(theStr); theStr = theStr.replace(/\s+/," "); //replace all newlines and whitespace with a single space theStr = entityNameDecode(theStr); if (maxLen && maxLen>3 && theStr.length>maxLen) theStr = theStr.substring(0,maxLen-3) + "..."; return theStr; } var ENTITY_MAP = new Array( "\x20", " ", "\x22", """, //Low-ASCII chars that should use entities "\x26", "&", "\x3C", "<", "\x3E", ">", "\x80", "€", //Hi-ASCII chars "\xA1", "¡", "\xA2", "¢", "\xA3", "£", "\xA4", "¤", "\xA5", "¥", "\xA6", "¦", "\xA7", "§", "\xA8", "¨", "\xA9", "©", "\xAA", "ª", "\xAB", "«", "\xAC", "¬", "\xAD", "­", "\xAE", "®", "\xAF", "¯", "\xB0", "°", "\xB1", "±", "\xB2", "²", "\xB3", "³", "\xB4", "´", "\xB5", "µ", "\xB6", "¶", "\xB7", "·", "\xB8", "¸", "\xB9", "¹", "\xBA", "º", "\xBB", "»", "\xBC", "¼", "\xBD", "½", "\xBE", "¾", "\xBF", "¿", "\xD7", "×", "\xF7", "÷", "\xC6", "Æ", "\xC1", "Á", "\xC2", "Â", "\xC0", "À", "\xC5", "Å", "\xC3", "Ã", "\xC4", "Ä", "\xC7", "Ç", "\xD0", "Ð", "\xC9", "É", "\xCA", "Ê", "\xC8", "È", "\xCB", "Ë", "\xCD", "Í", "\xCE", "Î", "\xCC", "Ì", "\xCF", "Ï", "\xD1", "Ñ", "\xD3", "Ó", "\xD4", "Ô", "\xD2", "Ò", "\xD8", "Ø", "\xD5", "Õ", "\xD6", "Ö", "\xDE", "Þ", "\xDA", "Ú", "\xDB", "Û", "\xD9", "Ù", "\xDC", "Ü", "\xDD", "Ý", "\xE1", "á", "\xE2", "â", "\xE6", "æ", "\xE0", "à", "\xE5", "å", "\xE3", "ã", "\xE4", "ä", "\xE7", "ç", "\xE9", "é", "\xEA", "ê", "\xE8", "è", "\xF0", "ð", "\xEB", "ë", "\xED", "í", "\xEE", "î", "\xEC", "ì", "\xEF", "ï", "\xF1", "ñ", "\xF3", "ó", "\xF4", "ô", "\xF2", "ò", "\xF8", "ø", "\xF5", "õ", "\xF6", "ö", "\xDF", "ß", "\xFE", "þ", "\xFA", "ú", "\xFB", "û", "\xF9", "ù", "\xFC", "ü", "\xFD", "ý", "\xFF", "ÿ"); //If a string has high-ASCII characters or low-ASCII that should be encoded, those characters //are converted to entities. For example, and accented "e" will become è. //Note that this does not affect low ascii chars that should be encoded like <>". //Uses the entity map above (ENTITY_MAP). If a high-ASCII char is not found in //the map, sets the char to nnn;, where nnn is the charCode. //Returns the encoded string. function entityNameEncode(origStr) { var i,j, retStr; retStr = origStr; var charCode, hasEntity = false; for (i=0; i<retStr.length && !hasEntity; i++) { charCode = retStr.charCodeAt(i); // if high-ASCII, ", &, <, or > hasEntity = (charCode > 127 || charCode == "\x22" || charCode == "\x26" || charCode == "\x3C" || charCode == "\x3E"); //DEBUG: for Japanese, don't encode if high-ASCII. Need to modify the previous line for the J release. } if (hasEntity) { // iff entity found, entity-encode string oldStr = retStr; //copy string retStr = ""; //and build new one for (i=0; i<oldStr.length; i++) { charCode = oldStr.charCodeAt(i); theChar = oldStr.charAt(i); if (charCode > 127 || charCode == "\x22" || charCode == "\x26" || charCode == "\x3C" || charCode == "\x3E") { for (j=0; j<ENTITY_MAP.length-1; j+=2) { //search map if (ENTITY_MAP[j] == theChar) { //if found theChar = ENTITY_MAP[j+1]; //set theChar to matching entity break; } } if (j >= ENTITY_MAP.length) { //if not found in map theChar = '' + parseInt(charCode) + ';'; //set to integer } } retStr += theChar; //append char to string } } return retStr; } //If a string contains encoded strings like " or è, they will be converted //to their character equivalents for proper display. Returns the decoded string. function entityNameDecode(origStr) { var i, theEntity, retStr = origStr; var entityPattern = /&\w+;/g; while ((theEntity = entityPattern.exec(origStr)) != null) { //with each entity found for (i=1; i<ENTITY_MAP.length; i+=2) { //look up entity in map if (ENTITY_MAP[i] == theEntity) { //when found retStr = retStr.replace(RegExp(ENTITY_MAP[i]),(ENTITY_MAP[i-1])); //replace entity with value break; } } } var charSet = dw.getDocumentDOM().getCharSet(); if (charSet == "iso-8859-1") { //return dreamweaver.latin1ToNative(retStr); return retStr; } else { return retStr; } } function stripAcceralator(theStr){ if (dreamweaver.appVersion && dreamweaver.appVersion.indexOf('Mac') != -1) { theStr = theStr.replace(/\(_\w+\)/,""); } return theStr; } function httpError(statusCode) { var statusMessage = ""; switch (statusCode) { case 200: { statusMessage = MM.MSG_HTTP200; break; } case 400: { statusMessage = MM.MSG_HTTP400; break; } case 404: { statusMessage = MM.MSG_HTTP404; break; } case 405: { statusMessage = MM.MSG_HTTP405; break; } case 500: { statusMessage = MM.MSG_HTTP500; break; } case 503: { statusMessage = MM.MSG_HTTP503; break; } } return statusMessage; }
|