jbe/bsw@0: function encode.mime.atom_token(str) jbe/bsw@0: local charset = "UTF-8" -- TODO: support other charsets via locale system jbe/bsw@0: if jbe/bsw@0: string.find(str, "^[0-9A-Za-z!#%$%%&'%*%+%-/=%?%^_`{|}~]+$") jbe/bsw@0: then jbe/bsw@0: return str jbe/bsw@0: elseif jbe/bsw@0: string.find(str, "^[\t 0-9A-Za-z!#%$%%&'%*%+%-/=%?%^_`{|}~]+$") jbe/bsw@0: then jbe/bsw@0: return '"' .. str .. '"' jbe/bsw@0: elseif jbe/bsw@0: string.find(str, "^[\t -~]*$") jbe/bsw@0: then jbe/bsw@0: local parts = { '"' } jbe/bsw@0: for char in string.gmatch(str, ".") do jbe/bsw@0: if char == '"' or char == "\\" then jbe/bsw@0: parts[#parts+1] = "\\" jbe/bsw@0: end jbe/bsw@0: parts[#parts+1] = char jbe/bsw@0: end jbe/bsw@0: parts[#parts+1] = '"' jbe/bsw@0: return table.concat(parts) jbe/bsw@0: else jbe/bsw@0: local parts = { "=?", charset, "?Q?" } jbe/bsw@0: for char in string.gmatch(str, ".") do jbe/bsw@0: local byte = string.byte(char) jbe/bsw@0: if string.find(char, "^[0-9A-Za-z%.%-]$") then jbe/bsw@0: parts[#parts+1] = char jbe/bsw@0: else jbe/bsw@0: local byte = string.byte(char) jbe/bsw@0: if byte == 32 then jbe/bsw@0: parts[#parts+1] = "_" jbe/bsw@0: else jbe/bsw@0: parts[#parts+1] = string.format("=%02X", byte) jbe/bsw@0: end jbe/bsw@0: end jbe/bsw@0: end jbe/bsw@0: parts[#parts+1] = "?=" jbe/bsw@0: return table.concat(parts) jbe/bsw@0: end jbe/bsw@0: end