diff --git a/src/mbox.lua b/src/mbox.lua new file mode 100644 index 0000000..9cce9ff --- /dev/null +++ b/src/mbox.lua @@ -0,0 +1,45 @@ +local Public = {} + +parse = Public + +function Public.headers(headers_s) + local headers = {} + headers_s = "\n" .. headers_s .. "$$$:\n" + local i, j = 1, 1 + local name, value, _ + while 1 do + j = strfind(headers_s, "\n%S-:", i+1) + if not j then break end + _,_, name, value = strfind(strsub(headers_s, i+1, j-1), "(%S-):%s?(.*)") + value = gsub(value or "", "\r\n", "\n") + value = gsub(value, "\n%s*", " ") + name = strlower(name) + if headers[name] then headers[name] = headers[name] .. ", " .. value + else headers[name] = value end + i, j = j, i + end + headers["$$$"] = nil + return headers +end + +function Public.message(message_s) + message_s = gsub(message_s, "^.-\n", "") + local _, headers_s, body + _, _, headers_s, body = strfind(message_s, "^(.-\n)\n(.*)") + headers_s = headers_s or "" + body = body or "" + return { headers = %Public.headers(headers_s), body = body } +end + +function Public.mbox(mbox_s) + local mbox = {} + mbox_s = "\n" .. mbox_s .. "\nFrom " + local i, j = 1, 1 + while 1 do + j = strfind(mbox_s, "\nFrom ", i + 1) + if not j then break end + tinsert(mbox, %Public.message(strsub(mbox_s, i + 1, j - 1))) + i, j = j, i + end + return mbox +end