mirror of
https://github.com/gitbucket/gitbucket.git
synced 2025-11-09 23:15:49 +01:00
84 lines
2.7 KiB
Scala
84 lines
2.7 KiB
Scala
package util
|
||
|
||
import java.net.{URLDecoder, URLEncoder}
|
||
import org.mozilla.universalchardet.UniversalDetector
|
||
import util.ControlUtil._
|
||
import org.apache.commons.io.input.BOMInputStream
|
||
import org.apache.commons.io.IOUtils
|
||
|
||
object StringUtil {
|
||
|
||
def sha1(value: String): String =
|
||
defining(java.security.MessageDigest.getInstance("SHA-1")){ md =>
|
||
md.update(value.getBytes)
|
||
md.digest.map(b => "%02x".format(b)).mkString
|
||
}
|
||
|
||
def md5(value: String): String = {
|
||
val md = java.security.MessageDigest.getInstance("MD5")
|
||
md.update(value.getBytes)
|
||
md.digest.map(b => "%02x".format(b)).mkString
|
||
}
|
||
|
||
def urlEncode(value: String): String = URLEncoder.encode(value, "UTF-8")
|
||
|
||
def urlDecode(value: String): String = URLDecoder.decode(value, "UTF-8")
|
||
|
||
def splitWords(value: String): Array[String] = value.split("[ \\t ]+")
|
||
|
||
def escapeHtml(value: String): String =
|
||
value.replace("&", "&").replace("<", "<").replace(">", ">").replace("\"", """)
|
||
|
||
/**
|
||
* Make string from byte array. Character encoding is detected automatically by [[util.StringUtil.detectEncoding]].
|
||
* And if given bytes contains UTF-8 BOM, it's removed from returned string.
|
||
*/
|
||
def convertFromByteArray(content: Array[Byte]): String =
|
||
IOUtils.toString(new BOMInputStream(new java.io.ByteArrayInputStream(content)), detectEncoding(content))
|
||
|
||
def detectEncoding(content: Array[Byte]): String =
|
||
defining(new UniversalDetector(null)){ detector =>
|
||
detector.handleData(content, 0, content.length)
|
||
detector.dataEnd()
|
||
detector.getDetectedCharset match {
|
||
case null => "UTF-8"
|
||
case e => e
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Converts line separator in the given content.
|
||
*
|
||
* @param content the content
|
||
* @param lineSeparator "LF" or "CRLF"
|
||
* @return the converted content
|
||
*/
|
||
def convertLineSeparator(content: String, lineSeparator: String): String = {
|
||
val lf = content.replace("\r\n", "\n").replace("\r", "\n")
|
||
if(lineSeparator == "CRLF"){
|
||
lf.replace("\n", "\r\n")
|
||
} else {
|
||
lf
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Extract issue id like ```#issueId``` from the given message.
|
||
*
|
||
*@param message the message which may contains issue id
|
||
* @return the iterator of issue id
|
||
*/
|
||
def extractIssueId(message: String): Iterator[String] =
|
||
"(^|\\W)#(\\d+)(\\W|$)".r.findAllIn(message).matchData.map(_.group(2))
|
||
|
||
/**
|
||
* Extract close issue id like ```close #issueId ``` from the given message.
|
||
*
|
||
* @param message the message which may contains close command
|
||
* @return the iterator of issue id
|
||
*/
|
||
def extractCloseId(message: String): Iterator[String] =
|
||
"(?i)(?<!\\w)(?:fix(?:e[sd])?|resolve[sd]?|close[sd]?)\\s+#(\\d+)(?!\\w)".r.findAllIn(message).matchData.map(_.group(1))
|
||
|
||
}
|