diff --git a/xtrn/DDMsgReader/DDMsgReader.js b/xtrn/DDMsgReader/DDMsgReader.js index 1744e5baa14f15080315ff7e8718c79aa7db88ca..d676fa0d217ff762a08abb0fc58af715e6105198 100644 --- a/xtrn/DDMsgReader/DDMsgReader.js +++ b/xtrn/DDMsgReader/DDMsgReader.js @@ -301,8 +301,8 @@ if (system.version_num < 31500) } // Reader version information -var READER_VERSION = "1.17 Beta 33"; -var READER_DATE = "2017-02-20"; +var READER_VERSION = "1.17 Beta 34"; +var READER_DATE = "2017-03-12"; // Keyboard key codes for displaying on the screen var UP_ARROW = ascii(24); @@ -484,8 +484,15 @@ gNetMsgAttrStrs[MSG_TYPELOCAL] = "ForLocal"; gNetMsgAttrStrs[MSG_TYPEECHO] = "ForEcho"; gNetMsgAttrStrs[MSG_TYPENET] = "ForNetmail"; +// A regular expression to check whether a string is an email address var gEmailRegex = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/; - +// An array of regular expressions for checking for ANSI codes (globally in a string & ignore case) +var gANSIRegexes = [ new RegExp(ascii(27) + "\[[0-9]+[mM]", "gi"), + new RegExp(ascii(27) + "\[[0-9]+(;[0-9]+)+[mM]", "gi"), + new RegExp(ascii(27) + "\[[0-9]+[aAbBcCdD]", "gi"), + new RegExp(ascii(27) + "\[[0-9]+;[0-9]+[hHfF]", "gi"), + new RegExp(ascii(27) + "\[[sSuUkK]", "gi"), + new RegExp(ascii(27) + "\[2[jJ]", "gi") ]; // Determine the script's startup directory. // This code is a trick that was created by Deuce, suggested by Rob Swindell @@ -12425,19 +12432,30 @@ function DigDistMsgReader_GetMsgInfoForEnhancedReader(pMsgHdr, pWordWrap, pDeter retObj.displayFrame = null; retObj.displayFrameScrollbar = null; var msgHasANSICodes = (typeof(pMsgHasANSICodes) == "boolean" ? pMsgHasANSICodes : textHasANSICodes(retObj.msgText)); - // If the message has ANSI codes, then check to see if the ANSI codees are - // only on the first 2 lines (within 160 characters). If so, then convert - // the ANSI color codes to Synchronet codes. Some messages contain a couple - // extra lines at the beginning with a "By: <name> to <name>" and a date, and - // some of those messages contain ANSI codes in those lines, which will mess - // up the display of the message using the scrolling interface. + // If the message has ANSI codes, then check to see if the amount of ANSI is very low. + // If so, then convert the ANSI color codes to Synchronet codes and eliminate unwanted + // ANSI (such as cursor movement codes). It seems that some messages have ANSI inserted + // into them that shouldn't be there (i.e., the author didn't intend to post an ANSI + // message), which is the reason for this check. If the message contains such rogue + // ANSI codes, they could mess up the display of the message. if (msgHasANSICodes) { - var lastANSIIdx = idxOfLastANSICode(msgTextAltered); - if (lastANSIIdx <= 160) + // Count the number of ANSI codes in the message and find the percentage of + // ANSI in the message. + var ANSICodeCount = countANSICodes(msgTextAltered, gANSIRegexes); + var percentANSICodes = (ANSICodeCount / msgTextAltered.length) * 100; + // Older: It seems that some messages contain a couple + // extra lines at the beginning with a "By: <name> to <name>" and a date, and + // some of those messages contain ANSI codes in those lines, which will mess + // up the display of the message using the scrolling interface. + //var lastANSIIdx = idxOfLastANSICode(msgTextAltered, gANSIRegexes); + //if (lastANSIIdx <= 160) + // If less than 6% of the message is ANSI codes, then consider those ANSI + // codes unwanted and convert them to Synchronet and remove unwanted ANSI. + if (percentANSICodes < 6) { msgTextAltered = cvtANSIToSyncAndRemoveUnwantedANSI(msgTextAltered); - //msgTextAltered = removeANSIFromStr(msgTextAltered); + //msgTextAltered = removeANSIFromStr(msgTextAltered, gANSIRegexes); msgHasANSICodes = false; } } @@ -16879,50 +16897,56 @@ function textHasANSICodes(pText) // Returns the index of the last ANSI code in a string. // // Parameters: -// pStr: The string to search for +// pStr: The string to search in +// pANSIRegexes: An array of regular expressions to use for searching for ANSI codes // // Return value: The index of the last ANSI code in the string, or -1 if not found -function idxOfLastANSICode(pStr) +function idxOfLastANSICode(pStr, pANSIRegexes) { - var ANSIRegexes = [ new RegExp(ascii(27) + "\[[0-9]+[mM]"), - new RegExp(ascii(27) + "\[[0-9]+(;[0-9]+)+[mM]"), - new RegExp(ascii(27) + "\[[0-9]+[aAbBcCdD]"), - new RegExp(ascii(27) + "\[[0-9]+;[0-9]+[hHfF]"), - new RegExp(ascii(27) + "\[[sSuUkK]"), - new RegExp(ascii(27) + "\[2[jJ]") ]; - var lastANSIIdx = -1; - for (var i = 0; i < ANSIRegexes.length; ++i) + for (var i = 0; i < pANSIRegexes.length; ++i) { - ANSIRegexes[i].ignoreCase = true; - var lastANSIIdxTmp = regexLastIndexOf(pStr, ANSIRegexes[i]); + var lastANSIIdxTmp = regexLastIndexOf(pStr, pANSIRegexes[i]); if (lastANSIIdxTmp > lastANSIIdx) lastANSIIdx = lastANSIIdxTmp; } return lastANSIIdx; } +// Returns the number of times an ANSI code is matched in a string. +// +// Parameters: +// pStr: The string to search in +// pANSIRegexes: An array of regular expressions to use for searching for ANSI codes +// +// Return value: The number of ANSI code matches in the string +function countANSICodes(pStr, pANSIRegexes) +{ + var ANSICount = 0; + for (var i = 0; i < pANSIRegexes.length; ++i) + { + var matches = pStr.match(pANSIRegexes[i]); + if (matches != null) + ANSICount += matches.length; + } + return ANSICount; +} + // Removes ANSI codes from a string. // // Parameters: // pStr: The string to remove ANSI codes from +// pANSIRegexes: An array of regular expressions to use for searching for ANSI codes // // Return value: A version of the string without ANSI codes -function removeANSIFromStr(pStr) +function removeANSIFromStr(pStr, pANSIRegexes) { if (typeof(pStr) != "string") return ""; - var ANSIRegexes = [ new RegExp(ascii(27) + "\[[0-9]+[mM]", "gi"), - new RegExp(ascii(27) + "\[[0-9]+(;[0-9]+)+[mM]", "gi"), - new RegExp(ascii(27) + "\[[0-9]+[aAbBcCdD]", "gi"), - new RegExp(ascii(27) + "\[[0-9]+;[0-9]+[hHfF]", "gi"), - new RegExp(ascii(27) + "\[[sSuUkK]", "gi"), - new RegExp(ascii(27) + "\[2[jJ]", "gi") ]; - var theStr = pStr; - for (var i = 0; i < ANSIRegexes.length; ++i) - theStr = theStr.replace(ANSIRegexes[i], ""); + for (var i = 0; i < pANSIRegexes.length; ++i) + theStr = theStr.replace(pANSIRegexes[i], ""); return theStr; }