lite-email-parser 2.0.4 → 2.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/dist/index.cjs +29 -4
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +27 -35
- package/package.json +15 -29
- package/binding.gyp +0 -47
- package/core/include/html_extractor.h +0 -100
- package/core/include/html_parser.h +0 -13
- package/core/src/html_extractor.cpp +0 -662
- package/core/src/html_parser.cpp +0 -221
- package/deps/gumbo-parser/src/attribute.c +0 -44
- package/deps/gumbo-parser/src/attribute.h +0 -37
- package/deps/gumbo-parser/src/char_ref.c +0 -301
- package/deps/gumbo-parser/src/char_ref.h +0 -70
- package/deps/gumbo-parser/src/char_ref_gperf.c +0 -11126
- package/deps/gumbo-parser/src/error.c +0 -287
- package/deps/gumbo-parser/src/error.h +0 -225
- package/deps/gumbo-parser/src/gumbo.h +0 -683
- package/deps/gumbo-parser/src/insertion_mode.h +0 -55
- package/deps/gumbo-parser/src/parser.c +0 -4433
- package/deps/gumbo-parser/src/parser.h +0 -57
- package/deps/gumbo-parser/src/string_buffer.c +0 -110
- package/deps/gumbo-parser/src/string_buffer.h +0 -84
- package/deps/gumbo-parser/src/string_piece.c +0 -48
- package/deps/gumbo-parser/src/string_piece.h +0 -38
- package/deps/gumbo-parser/src/tag.c +0 -125
- package/deps/gumbo-parser/src/tag_enum.h +0 -155
- package/deps/gumbo-parser/src/tag_gperf.h +0 -350
- package/deps/gumbo-parser/src/tag_sizes.h +0 -2
- package/deps/gumbo-parser/src/tag_strings.h +0 -155
- package/deps/gumbo-parser/src/token_type.h +0 -42
- package/deps/gumbo-parser/src/tokenizer.c +0 -3003
- package/deps/gumbo-parser/src/tokenizer.h +0 -123
- package/deps/gumbo-parser/src/tokenizer_states.h +0 -104
- package/deps/gumbo-parser/src/utf8.c +0 -270
- package/deps/gumbo-parser/src/utf8.h +0 -132
- package/deps/gumbo-parser/src/util.c +0 -58
- package/deps/gumbo-parser/src/util.h +0 -60
- package/deps/gumbo-parser/src/vector.c +0 -128
- package/deps/gumbo-parser/src/vector.h +0 -70
- package/dist/cjs/index.cjs +0 -63
- package/dist/cjs/index.d.cts +0 -9
- package/dist/cjs/index.d.cts.map +0 -1
- package/dist/cjs/index.d.ts +0 -9
- package/dist/cjs/index.d.ts.map +0 -1
- package/dist/cjs/index.js +0 -98
- package/dist/cjs/package.json +0 -1
- package/dist/cjs/parser.d.ts +0 -4
- package/dist/cjs/parser.d.ts.map +0 -1
- package/dist/cjs/parser.js +0 -118
- package/dist/cjs/types.d.ts +0 -14
- package/dist/cjs/types.d.ts.map +0 -1
- package/dist/cjs/types.js +0 -2
- package/dist/parser.d.ts +0 -4
- package/dist/parser.d.ts.map +0 -1
- package/dist/parser.js +0 -81
- package/src/addon.cpp +0 -141
package/dist/parser.js
DELETED
|
@@ -1,81 +0,0 @@
|
|
|
1
|
-
import { simpleParser } from 'mailparser';
|
|
2
|
-
import * as cheerio from 'cheerio';
|
|
3
|
-
import { createRequire } from 'module';
|
|
4
|
-
import * as path from 'path';
|
|
5
|
-
const _require = typeof require !== 'undefined'
|
|
6
|
-
? require
|
|
7
|
-
: createRequire(process.cwd());
|
|
8
|
-
const getDirname = () => {
|
|
9
|
-
if (typeof __dirname !== 'undefined') {
|
|
10
|
-
return __dirname;
|
|
11
|
-
}
|
|
12
|
-
const err = new Error();
|
|
13
|
-
const stackLines = err.stack?.split('\n') || [];
|
|
14
|
-
for (const line of stackLines) {
|
|
15
|
-
const match = line.match(/(?:at\s+|\()((?:file:\/\/)?\/[^:]+)/);
|
|
16
|
-
if (match) {
|
|
17
|
-
const p = match[1];
|
|
18
|
-
if (p.includes('parser.js') || p.includes('parser.ts')) {
|
|
19
|
-
let cleanPath = p;
|
|
20
|
-
if (cleanPath.startsWith('file://')) {
|
|
21
|
-
const fileURLToPath = _require('url').fileURLToPath;
|
|
22
|
-
cleanPath = fileURLToPath(cleanPath);
|
|
23
|
-
}
|
|
24
|
-
return path.dirname(cleanPath);
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
return process.cwd();
|
|
29
|
-
};
|
|
30
|
-
const dirname = getDirname();
|
|
31
|
-
let addonPath = path.resolve(dirname, '../build/Release/parser.node');
|
|
32
|
-
if (!_require('fs').existsSync(addonPath)) {
|
|
33
|
-
addonPath = path.resolve(dirname, '../../build/Release/parser.node');
|
|
34
|
-
}
|
|
35
|
-
const addon = _require(addonPath);
|
|
36
|
-
export async function parseEmail(buffer) {
|
|
37
|
-
const parsedEmail = await simpleParser(buffer);
|
|
38
|
-
let content = parsedEmail.html;
|
|
39
|
-
if (!content) {
|
|
40
|
-
content = parsedEmail.text || '';
|
|
41
|
-
}
|
|
42
|
-
const cleanedContent = extractFirstMessage(content);
|
|
43
|
-
const attachments = [];
|
|
44
|
-
const inlineAttachments = [];
|
|
45
|
-
for (const att of parsedEmail.attachments || []) {
|
|
46
|
-
const filename = att.filename || new Date().toDateString();
|
|
47
|
-
const contentType = att.contentType || 'application/octet-stream';
|
|
48
|
-
const file = {
|
|
49
|
-
name: filename,
|
|
50
|
-
type: contentType,
|
|
51
|
-
size: att.size,
|
|
52
|
-
buffer: att.content,
|
|
53
|
-
};
|
|
54
|
-
if (att.related) {
|
|
55
|
-
const base64Data = att.content.toString('base64');
|
|
56
|
-
file.originalSrc = `data:${contentType};base64,${base64Data}`;
|
|
57
|
-
inlineAttachments.push(file);
|
|
58
|
-
}
|
|
59
|
-
else {
|
|
60
|
-
attachments.push(file);
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
return {
|
|
64
|
-
lastMessage: cleanedContent,
|
|
65
|
-
attachments,
|
|
66
|
-
inlineAttachments,
|
|
67
|
-
};
|
|
68
|
-
}
|
|
69
|
-
// Replace src attributes with the uploaded file URLs
|
|
70
|
-
export function replaceSrc(html, files) {
|
|
71
|
-
const $ = cheerio.load(html);
|
|
72
|
-
for (const file of files) {
|
|
73
|
-
if (file.originalSrc && file.src) {
|
|
74
|
-
$(`img[src="${file.originalSrc}"]`).attr('src', file.src);
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
return $.html();
|
|
78
|
-
}
|
|
79
|
-
function extractFirstMessage(html) {
|
|
80
|
-
return addon.cleanHtml(html);
|
|
81
|
-
}
|
package/src/addon.cpp
DELETED
|
@@ -1,141 +0,0 @@
|
|
|
1
|
-
#include <napi.h>
|
|
2
|
-
#include "html_parser.h"
|
|
3
|
-
#include "html_extractor.h"
|
|
4
|
-
|
|
5
|
-
Napi::String CleanHtmlWrapped(const Napi::CallbackInfo& info) {
|
|
6
|
-
Napi::Env env = info.Env();
|
|
7
|
-
if (info.Length() < 1 || !info[0].IsString()) {
|
|
8
|
-
Napi::TypeError::New(env, "String expected").ThrowAsJavaScriptException();
|
|
9
|
-
return Napi::String::New(env, "");
|
|
10
|
-
}
|
|
11
|
-
std::string html = info[0].As<Napi::String>().Utf8Value();
|
|
12
|
-
std::string result = liteEmailParser::cleanHtml(html);
|
|
13
|
-
return Napi::String::New(env, result);
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
Napi::String RemoveSignatureWrapped(const Napi::CallbackInfo& info) {
|
|
17
|
-
Napi::Env env = info.Env();
|
|
18
|
-
if (info.Length() < 1 || !info[0].IsString()) {
|
|
19
|
-
Napi::TypeError::New(env, "String expected").ThrowAsJavaScriptException();
|
|
20
|
-
return Napi::String::New(env, "");
|
|
21
|
-
}
|
|
22
|
-
std::string html = info[0].As<Napi::String>().Utf8Value();
|
|
23
|
-
std::string result = liteEmailParser::removeSignature(html);
|
|
24
|
-
return Napi::String::New(env, result);
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
Napi::String RemoveRepliesWrapped(const Napi::CallbackInfo& info) {
|
|
28
|
-
Napi::Env env = info.Env();
|
|
29
|
-
if (info.Length() < 1 || !info[0].IsString()) {
|
|
30
|
-
Napi::TypeError::New(env, "String expected").ThrowAsJavaScriptException();
|
|
31
|
-
return Napi::String::New(env, "");
|
|
32
|
-
}
|
|
33
|
-
std::string html = info[0].As<Napi::String>().Utf8Value();
|
|
34
|
-
std::string result = liteEmailParser::removeReplies(html);
|
|
35
|
-
return Napi::String::New(env, result);
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
Napi::String RemoveDividersWrapped(const Napi::CallbackInfo& info) {
|
|
39
|
-
Napi::Env env = info.Env();
|
|
40
|
-
if (info.Length() < 1 || !info[0].IsString()) {
|
|
41
|
-
Napi::TypeError::New(env, "String expected").ThrowAsJavaScriptException();
|
|
42
|
-
return Napi::String::New(env, "");
|
|
43
|
-
}
|
|
44
|
-
std::string html = info[0].As<Napi::String>().Utf8Value();
|
|
45
|
-
std::string result = liteEmailParser::removeDividers(html);
|
|
46
|
-
return Napi::String::New(env, result);
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
Napi::Value ParseEmailWrapped(const Napi::CallbackInfo& info) {
|
|
50
|
-
Napi::Env env = info.Env();
|
|
51
|
-
if (info.Length() < 1 || !info[0].IsBuffer()) {
|
|
52
|
-
Napi::TypeError::New(env, "Buffer expected").ThrowAsJavaScriptException();
|
|
53
|
-
return env.Null();
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
Napi::Buffer<char> buffer = info[0].As<Napi::Buffer<char>>();
|
|
57
|
-
std::string rawEmail(buffer.Data(), buffer.Length());
|
|
58
|
-
|
|
59
|
-
liteEmailParser::ParseEmailResult result = liteEmailParser::parseEmail(rawEmail);
|
|
60
|
-
std::string cleaned = liteEmailParser::cleanHtml(result.text);
|
|
61
|
-
|
|
62
|
-
Napi::Object obj = Napi::Object::New(env);
|
|
63
|
-
obj.Set("subject", Napi::String::New(env, result.subject));
|
|
64
|
-
obj.Set("from", Napi::String::New(env, result.from));
|
|
65
|
-
obj.Set("to", Napi::String::New(env, result.to));
|
|
66
|
-
obj.Set("lastMessage", Napi::String::New(env, cleaned));
|
|
67
|
-
|
|
68
|
-
Napi::Array attachments = Napi::Array::New(env, result.attachments.size());
|
|
69
|
-
for (size_t i = 0; i < result.attachments.size(); ++i) {
|
|
70
|
-
const auto& att = result.attachments[i];
|
|
71
|
-
Napi::Object attObj = Napi::Object::New(env);
|
|
72
|
-
attObj.Set("name", Napi::String::New(env, att.name));
|
|
73
|
-
attObj.Set("type", Napi::String::New(env, att.type));
|
|
74
|
-
attObj.Set("size", Napi::Number::New(env, att.size));
|
|
75
|
-
attObj.Set("buffer", Napi::Buffer<char>::Copy(env, att.buffer.data(), att.buffer.size()));
|
|
76
|
-
attachments.Set(i, attObj);
|
|
77
|
-
}
|
|
78
|
-
obj.Set("attachments", attachments);
|
|
79
|
-
|
|
80
|
-
Napi::Array inlineAttachments = Napi::Array::New(env, result.inlineAttachments.size());
|
|
81
|
-
for (size_t i = 0; i < result.inlineAttachments.size(); ++i) {
|
|
82
|
-
const auto& att = result.inlineAttachments[i];
|
|
83
|
-
Napi::Object attObj = Napi::Object::New(env);
|
|
84
|
-
attObj.Set("name", Napi::String::New(env, att.name));
|
|
85
|
-
attObj.Set("type", Napi::String::New(env, att.type));
|
|
86
|
-
attObj.Set("size", Napi::Number::New(env, att.size));
|
|
87
|
-
attObj.Set("buffer", Napi::Buffer<char>::Copy(env, att.buffer.data(), att.buffer.size()));
|
|
88
|
-
if (!att.originalSrc.empty()) {
|
|
89
|
-
attObj.Set("originalSrc", Napi::String::New(env, att.originalSrc));
|
|
90
|
-
}
|
|
91
|
-
if (!att.src.empty()) {
|
|
92
|
-
attObj.Set("src", Napi::String::New(env, att.src));
|
|
93
|
-
}
|
|
94
|
-
inlineAttachments.Set(i, attObj);
|
|
95
|
-
}
|
|
96
|
-
obj.Set("inlineAttachments", inlineAttachments);
|
|
97
|
-
|
|
98
|
-
return obj;
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
Napi::String ReplaceSrcWrapped(const Napi::CallbackInfo& info) {
|
|
102
|
-
Napi::Env env = info.Env();
|
|
103
|
-
if (info.Length() < 2 || !info[0].IsString() || !info[1].IsArray()) {
|
|
104
|
-
Napi::TypeError::New(env, "Expected (string, Array) arguments").ThrowAsJavaScriptException();
|
|
105
|
-
return Napi::String::New(env, "");
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
std::string html = info[0].As<Napi::String>().Utf8Value();
|
|
109
|
-
Napi::Array filesArray = info[1].As<Napi::Array>();
|
|
110
|
-
|
|
111
|
-
std::vector<liteEmailParser::Attachment> files;
|
|
112
|
-
for (uint32_t i = 0; i < filesArray.Length(); ++i) {
|
|
113
|
-
Napi::Value val = filesArray.Get(i);
|
|
114
|
-
if (!val.IsObject()) continue;
|
|
115
|
-
Napi::Object fileObj = val.As<Napi::Object>();
|
|
116
|
-
|
|
117
|
-
liteEmailParser::Attachment att;
|
|
118
|
-
if (fileObj.Has("originalSrc") && fileObj.Get("originalSrc").IsString()) {
|
|
119
|
-
att.originalSrc = fileObj.Get("originalSrc").As<Napi::String>().Utf8Value();
|
|
120
|
-
}
|
|
121
|
-
if (fileObj.Has("src") && fileObj.Get("src").IsString()) {
|
|
122
|
-
att.src = fileObj.Get("src").As<Napi::String>().Utf8Value();
|
|
123
|
-
}
|
|
124
|
-
files.push_back(att);
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
std::string result = liteEmailParser::replaceSrc(html, files);
|
|
128
|
-
return Napi::String::New(env, result);
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
Napi::Object Init(Napi::Env env, Napi::Object exports) {
|
|
132
|
-
exports.Set(Napi::String::New(env, "cleanHtml"), Napi::Function::New(env, CleanHtmlWrapped));
|
|
133
|
-
exports.Set(Napi::String::New(env, "removeSignature"), Napi::Function::New(env, RemoveSignatureWrapped));
|
|
134
|
-
exports.Set(Napi::String::New(env, "removeReplies"), Napi::Function::New(env, RemoveRepliesWrapped));
|
|
135
|
-
exports.Set(Napi::String::New(env, "removeDividers"), Napi::Function::New(env, RemoveDividersWrapped));
|
|
136
|
-
exports.Set(Napi::String::New(env, "parseEmail"), Napi::Function::New(env, ParseEmailWrapped));
|
|
137
|
-
exports.Set(Napi::String::New(env, "replaceSrc"), Napi::Function::New(env, ReplaceSrcWrapped));
|
|
138
|
-
return exports;
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
NODE_API_MODULE(parser, Init)
|