libp2p-mesh 2026.6.15 → 2026.6.17
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.
|
@@ -9,12 +9,23 @@ const FIELD_LINE_PATTERN = /^(?:[-*]\s*)?(?:#{1,6}\s*)?(name|what to call them|n
|
|
|
9
9
|
const TEMPLATE_PATTERN = /\b(?:todo|tbd|n\/a|none|unknown|your name|add notes here|template placeholder|placeholder)\b/i;
|
|
10
10
|
const EXPLICIT_LIST_SEPARATOR_PATTERN = /[,,、;;|/]/;
|
|
11
11
|
const ENGLISH_TAG_PATTERN = /^(?:[A-Za-z][A-Za-z0-9]*(?:\.[A-Za-z0-9]+)?|libp2p|node\.js)$/i;
|
|
12
|
+
const TECH_TOKEN_PATTERN = /\b(?:[A-Z][A-Z0-9]{1,}|[A-Za-z]*[0-9][A-Za-z0-9]*|libp2p|node\.js)\b/g;
|
|
12
13
|
const CHINESE_TAG_PATTERN = /[\p{Script=Han}]{2,8}/gu;
|
|
13
14
|
const CHINESE_CONTEXT_PATTERNS = [
|
|
14
15
|
/(?:在|来自|加入|参与|负责)([\p{Script=Han}]{2,8})(?:做|写|用|项目|团队|实验室|方向)?/gu,
|
|
15
16
|
/(?:做|写|维护|负责|参与)([\p{Script=Han}]{2,8})(?:项目|插件|工具|方向)?/gu,
|
|
16
17
|
];
|
|
17
18
|
const CHINESE_SENTENCE_WORD_PATTERN = /(?:今天|明天|昨天|今晚|晚上|早上|上午|下午|八点|同步|一下|进展|开会|讨论|安排|提醒|需要|已经|可以|应该|我们|你们|他们)/u;
|
|
19
|
+
const CHINESE_STOP_WORDS = new Set([
|
|
20
|
+
"关于",
|
|
21
|
+
"正在",
|
|
22
|
+
"当前",
|
|
23
|
+
"相关",
|
|
24
|
+
"工作",
|
|
25
|
+
"项目",
|
|
26
|
+
"网络",
|
|
27
|
+
"专注",
|
|
28
|
+
]);
|
|
18
29
|
const COMMON_WORDS = new Set([
|
|
19
30
|
"and",
|
|
20
31
|
"also",
|
|
@@ -43,6 +54,17 @@ const ENGLISH_TAG_FIELDS = new Set([
|
|
|
43
54
|
"interest",
|
|
44
55
|
"interests",
|
|
45
56
|
]);
|
|
57
|
+
const TECH_TOKEN_FIELDS = new Set([
|
|
58
|
+
"notes",
|
|
59
|
+
"note",
|
|
60
|
+
"context",
|
|
61
|
+
"project",
|
|
62
|
+
"projects",
|
|
63
|
+
"skill",
|
|
64
|
+
"skills",
|
|
65
|
+
"interest",
|
|
66
|
+
"interests",
|
|
67
|
+
]);
|
|
46
68
|
export function resolveUserMdPath(customPath) {
|
|
47
69
|
if (customPath) {
|
|
48
70
|
return customPath;
|
|
@@ -58,11 +80,14 @@ function isTemplateText(value) {
|
|
|
58
80
|
return trimmed.length === 0 || TEMPLATE_PATTERN.test(trimmed) || /^\[[^\]]+\]$/.test(trimmed);
|
|
59
81
|
}
|
|
60
82
|
function stripMarkdown(line) {
|
|
83
|
+
return stripMarkdownSyntax(line).replace(FIELD_PREFIX_PATTERN, "").trim();
|
|
84
|
+
}
|
|
85
|
+
function stripMarkdownSyntax(line) {
|
|
61
86
|
return line
|
|
62
|
-
.replace(FIELD_PREFIX_PATTERN, "")
|
|
63
87
|
.replace(/`([^`]+)`/g, "$1")
|
|
64
88
|
.replace(/\[([^\]]+)\]\([^)]+\)/g, "$1")
|
|
65
89
|
.replace(/[*_~#>]/g, " ")
|
|
90
|
+
.replace(/\s+/g, " ")
|
|
66
91
|
.trim();
|
|
67
92
|
}
|
|
68
93
|
function trimCandidate(value) {
|
|
@@ -79,8 +104,19 @@ function trimChineseCandidate(value) {
|
|
|
79
104
|
}
|
|
80
105
|
function isStableChineseCandidate(value) {
|
|
81
106
|
return (/^[\p{Script=Han}]{2,8}$/u.test(value) &&
|
|
107
|
+
!CHINESE_STOP_WORDS.has(value) &&
|
|
82
108
|
!CHINESE_SENTENCE_WORD_PATTERN.test(value));
|
|
83
109
|
}
|
|
110
|
+
function collectTechnicalTokens(value) {
|
|
111
|
+
const tokens = [];
|
|
112
|
+
for (const match of value.matchAll(TECH_TOKEN_PATTERN)) {
|
|
113
|
+
const token = trimCandidate(match[0] ?? "");
|
|
114
|
+
if (isStableEnglishCandidate(token)) {
|
|
115
|
+
tokens.push(token);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
return tokens;
|
|
119
|
+
}
|
|
84
120
|
function collectChineseCandidates(value) {
|
|
85
121
|
const candidates = [];
|
|
86
122
|
for (const match of value.matchAll(CHINESE_TAG_PATTERN)) {
|
|
@@ -95,13 +131,14 @@ function looksLikeSentence(value) {
|
|
|
95
131
|
return /[。.!?]/.test(value) || value.split(/\s+/).filter(Boolean).length > 4;
|
|
96
132
|
}
|
|
97
133
|
function fieldValue(line) {
|
|
98
|
-
const
|
|
134
|
+
const normalized = stripMarkdownSyntax(line);
|
|
135
|
+
const match = normalized.match(FIELD_LINE_PATTERN);
|
|
99
136
|
if (!match) {
|
|
100
137
|
return undefined;
|
|
101
138
|
}
|
|
102
139
|
return {
|
|
103
140
|
field: (match[1] ?? "").toLowerCase(),
|
|
104
|
-
value:
|
|
141
|
+
value: stripMarkdownSyntax(match[2] ?? ""),
|
|
105
142
|
};
|
|
106
143
|
}
|
|
107
144
|
function isStableEnglishCandidate(value) {
|
|
@@ -147,6 +184,9 @@ function collectCandidates(line) {
|
|
|
147
184
|
}
|
|
148
185
|
const explicitField = fieldValue(line);
|
|
149
186
|
const explicitFieldValue = explicitField?.value;
|
|
187
|
+
if (explicitField && TECH_TOKEN_FIELDS.has(explicitField.field)) {
|
|
188
|
+
candidates.push(...collectTechnicalTokens(explicitField.value));
|
|
189
|
+
}
|
|
150
190
|
if (/^[\p{Script=Han}]{2,8}$/u.test(text) && isStableChineseCandidate(text)) {
|
|
151
191
|
candidates.push(text);
|
|
152
192
|
}
|
package/package.json
CHANGED
|
@@ -16,6 +16,7 @@ const TEMPLATE_PATTERN =
|
|
|
16
16
|
/\b(?:todo|tbd|n\/a|none|unknown|your name|add notes here|template placeholder|placeholder)\b/i;
|
|
17
17
|
const EXPLICIT_LIST_SEPARATOR_PATTERN = /[,,、;;|/]/;
|
|
18
18
|
const ENGLISH_TAG_PATTERN = /^(?:[A-Za-z][A-Za-z0-9]*(?:\.[A-Za-z0-9]+)?|libp2p|node\.js)$/i;
|
|
19
|
+
const TECH_TOKEN_PATTERN = /\b(?:[A-Z][A-Z0-9]{1,}|[A-Za-z]*[0-9][A-Za-z0-9]*|libp2p|node\.js)\b/g;
|
|
19
20
|
const CHINESE_TAG_PATTERN = /[\p{Script=Han}]{2,8}/gu;
|
|
20
21
|
const CHINESE_CONTEXT_PATTERNS = [
|
|
21
22
|
/(?:在|来自|加入|参与|负责)([\p{Script=Han}]{2,8})(?:做|写|用|项目|团队|实验室|方向)?/gu,
|
|
@@ -23,6 +24,16 @@ const CHINESE_CONTEXT_PATTERNS = [
|
|
|
23
24
|
];
|
|
24
25
|
const CHINESE_SENTENCE_WORD_PATTERN =
|
|
25
26
|
/(?:今天|明天|昨天|今晚|晚上|早上|上午|下午|八点|同步|一下|进展|开会|讨论|安排|提醒|需要|已经|可以|应该|我们|你们|他们)/u;
|
|
27
|
+
const CHINESE_STOP_WORDS = new Set([
|
|
28
|
+
"关于",
|
|
29
|
+
"正在",
|
|
30
|
+
"当前",
|
|
31
|
+
"相关",
|
|
32
|
+
"工作",
|
|
33
|
+
"项目",
|
|
34
|
+
"网络",
|
|
35
|
+
"专注",
|
|
36
|
+
]);
|
|
26
37
|
const COMMON_WORDS = new Set([
|
|
27
38
|
"and",
|
|
28
39
|
"also",
|
|
@@ -51,6 +62,17 @@ const ENGLISH_TAG_FIELDS = new Set([
|
|
|
51
62
|
"interest",
|
|
52
63
|
"interests",
|
|
53
64
|
]);
|
|
65
|
+
const TECH_TOKEN_FIELDS = new Set([
|
|
66
|
+
"notes",
|
|
67
|
+
"note",
|
|
68
|
+
"context",
|
|
69
|
+
"project",
|
|
70
|
+
"projects",
|
|
71
|
+
"skill",
|
|
72
|
+
"skills",
|
|
73
|
+
"interest",
|
|
74
|
+
"interests",
|
|
75
|
+
]);
|
|
54
76
|
|
|
55
77
|
export type UserMdAttributeSource = {
|
|
56
78
|
path?: string;
|
|
@@ -79,11 +101,15 @@ function isTemplateText(value: string): boolean {
|
|
|
79
101
|
}
|
|
80
102
|
|
|
81
103
|
function stripMarkdown(line: string): string {
|
|
104
|
+
return stripMarkdownSyntax(line).replace(FIELD_PREFIX_PATTERN, "").trim();
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
function stripMarkdownSyntax(line: string): string {
|
|
82
108
|
return line
|
|
83
|
-
.replace(FIELD_PREFIX_PATTERN, "")
|
|
84
109
|
.replace(/`([^`]+)`/g, "$1")
|
|
85
110
|
.replace(/\[([^\]]+)\]\([^)]+\)/g, "$1")
|
|
86
111
|
.replace(/[*_~#>]/g, " ")
|
|
112
|
+
.replace(/\s+/g, " ")
|
|
87
113
|
.trim();
|
|
88
114
|
}
|
|
89
115
|
|
|
@@ -104,10 +130,24 @@ function trimChineseCandidate(value: string): string {
|
|
|
104
130
|
function isStableChineseCandidate(value: string): boolean {
|
|
105
131
|
return (
|
|
106
132
|
/^[\p{Script=Han}]{2,8}$/u.test(value) &&
|
|
133
|
+
!CHINESE_STOP_WORDS.has(value) &&
|
|
107
134
|
!CHINESE_SENTENCE_WORD_PATTERN.test(value)
|
|
108
135
|
);
|
|
109
136
|
}
|
|
110
137
|
|
|
138
|
+
function collectTechnicalTokens(value: string): string[] {
|
|
139
|
+
const tokens: string[] = [];
|
|
140
|
+
|
|
141
|
+
for (const match of value.matchAll(TECH_TOKEN_PATTERN)) {
|
|
142
|
+
const token = trimCandidate(match[0] ?? "");
|
|
143
|
+
if (isStableEnglishCandidate(token)) {
|
|
144
|
+
tokens.push(token);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
return tokens;
|
|
149
|
+
}
|
|
150
|
+
|
|
111
151
|
function collectChineseCandidates(value: string): string[] {
|
|
112
152
|
const candidates: string[] = [];
|
|
113
153
|
|
|
@@ -126,14 +166,15 @@ function looksLikeSentence(value: string): boolean {
|
|
|
126
166
|
}
|
|
127
167
|
|
|
128
168
|
function fieldValue(line: string): { field: string; value: string } | undefined {
|
|
129
|
-
const
|
|
169
|
+
const normalized = stripMarkdownSyntax(line);
|
|
170
|
+
const match = normalized.match(FIELD_LINE_PATTERN);
|
|
130
171
|
if (!match) {
|
|
131
172
|
return undefined;
|
|
132
173
|
}
|
|
133
174
|
|
|
134
175
|
return {
|
|
135
176
|
field: (match[1] ?? "").toLowerCase(),
|
|
136
|
-
value:
|
|
177
|
+
value: stripMarkdownSyntax(match[2] ?? ""),
|
|
137
178
|
};
|
|
138
179
|
}
|
|
139
180
|
|
|
@@ -191,6 +232,10 @@ function collectCandidates(line: string): string[] {
|
|
|
191
232
|
const explicitField = fieldValue(line);
|
|
192
233
|
const explicitFieldValue = explicitField?.value;
|
|
193
234
|
|
|
235
|
+
if (explicitField && TECH_TOKEN_FIELDS.has(explicitField.field)) {
|
|
236
|
+
candidates.push(...collectTechnicalTokens(explicitField.value));
|
|
237
|
+
}
|
|
238
|
+
|
|
194
239
|
if (/^[\p{Script=Han}]{2,8}$/u.test(text) && isStableChineseCandidate(text)) {
|
|
195
240
|
candidates.push(text);
|
|
196
241
|
}
|