@pixui-dev/pixui-richtext-helper 0.2.3 → 0.2.5
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/dist/richtext/RichTextCore.d.ts +1 -1
- package/dist/richtext/RichTextCore.js +98 -35
- package/package.json +1 -1
- package/readme.md +5 -1
|
@@ -171,48 +171,81 @@ var RichTextCore = /** @class */ (function () {
|
|
|
171
171
|
*****************************************************/
|
|
172
172
|
/**
|
|
173
173
|
* 将 HTML 切分为基础段落片段。
|
|
174
|
-
*
|
|
174
|
+
* 递归拆分,任何层级的 <br> 都会被拆成独立段落
|
|
175
175
|
*/
|
|
176
176
|
RichTextCore.splitIntoSegments = function ($) {
|
|
177
177
|
var segments = [];
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
178
|
+
var wrapNode = function ($node, inner) {
|
|
179
|
+
var _a;
|
|
180
|
+
var tagName = $node.prop("tagName");
|
|
181
|
+
if (!tagName)
|
|
182
|
+
return inner; // root
|
|
183
|
+
var attribsObj = ((_a = $node.get(0)) === null || _a === void 0 ? void 0 : _a.attribs) || {};
|
|
184
|
+
var attribHtml = "";
|
|
185
|
+
for (var _i = 0, _b = Object.entries(attribsObj); _i < _b.length; _i++) {
|
|
186
|
+
var _c = _b[_i], k = _c[0], v = _c[1];
|
|
187
|
+
attribHtml += " ".concat(k, "=\"").concat(v, "\"");
|
|
185
188
|
}
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
189
|
+
return "<".concat(tagName.toLowerCase()).concat(attribHtml, ">").concat(inner, "</").concat(tagName.toLowerCase(), ">");
|
|
190
|
+
};
|
|
191
|
+
var dfs = function ($elem) {
|
|
192
|
+
var node = $elem.get(0);
|
|
193
|
+
if (!node)
|
|
194
|
+
return [];
|
|
195
|
+
// text / comment nodes直接返回
|
|
196
|
+
if (node.type === "text" || node.type === "comment") {
|
|
197
|
+
return [$.html(node)];
|
|
198
|
+
}
|
|
199
|
+
var tagName = ($elem.prop("tagName") || "").toLowerCase();
|
|
200
|
+
if (tagName === "br") {
|
|
201
|
+
return ["<br>"]; // 用占位标识,后续流程会处理
|
|
202
|
+
}
|
|
203
|
+
var buffer = [];
|
|
204
|
+
var segs = [];
|
|
205
|
+
var childrenArr = $elem.contents().toArray();
|
|
206
|
+
childrenArr.forEach(function (child) {
|
|
207
|
+
var childSegs = dfs($(child));
|
|
208
|
+
childSegs.forEach(function (seg) {
|
|
209
|
+
if (seg === "<br>") {
|
|
210
|
+
var htmlPart = buffer.join("");
|
|
211
|
+
if (htmlPart.trim()) {
|
|
212
|
+
segs.push(wrapNode($elem, htmlPart));
|
|
213
|
+
}
|
|
214
|
+
segs.push("<br>");
|
|
215
|
+
buffer = [];
|
|
216
|
+
}
|
|
217
|
+
else {
|
|
218
|
+
buffer.push(seg);
|
|
193
219
|
}
|
|
194
220
|
});
|
|
195
|
-
|
|
196
|
-
|
|
221
|
+
});
|
|
222
|
+
// flush remaining
|
|
223
|
+
if (buffer.length > 0) {
|
|
224
|
+
var htmlPart = buffer.join("");
|
|
225
|
+
if (htmlPart.trim())
|
|
226
|
+
segs.push(wrapNode($elem, htmlPart));
|
|
227
|
+
}
|
|
228
|
+
// 若无任何子片段且无内容,根据标签决定是否保留
|
|
229
|
+
if (segs.length === 0) {
|
|
230
|
+
if (tagName === "div" || tagName === "text") {
|
|
231
|
+
return []; // 丢弃空 div / text
|
|
197
232
|
}
|
|
198
233
|
else {
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
var idx = tempHtml_1.indexOf(listHtml);
|
|
202
|
-
if (idx >= 0) {
|
|
203
|
-
var before = tempHtml_1.substring(0, idx);
|
|
204
|
-
if (before.trim())
|
|
205
|
-
segments.push(before);
|
|
206
|
-
segments.push(listHtml);
|
|
207
|
-
tempHtml_1 = tempHtml_1.substring(idx + listHtml.length);
|
|
208
|
-
}
|
|
209
|
-
});
|
|
210
|
-
if (tempHtml_1.trim())
|
|
211
|
-
segments.push(tempHtml_1);
|
|
234
|
+
// 其它空标签保留(img...)
|
|
235
|
+
return [wrapNode($elem, "")];
|
|
212
236
|
}
|
|
213
237
|
}
|
|
238
|
+
// 如果此节点本身为列表 (<ol>/<ul>),不再拆分内部以保持原逻辑
|
|
239
|
+
if (tagName === "ol" || tagName === "ul") {
|
|
240
|
+
// 直接返回整块 html,不再分片
|
|
241
|
+
return [$.html(node)];
|
|
242
|
+
}
|
|
243
|
+
return segs;
|
|
244
|
+
};
|
|
245
|
+
var rootChildren = $("body").length > 0 ? $("body").children() : $.root().children();
|
|
246
|
+
rootChildren.each(function (_, el) {
|
|
247
|
+
segments.push.apply(segments, dfs($(el)));
|
|
214
248
|
});
|
|
215
|
-
// fallback:原样返回
|
|
216
249
|
if (segments.length === 0)
|
|
217
250
|
segments.push($.html());
|
|
218
251
|
return segments;
|
|
@@ -280,15 +313,45 @@ var RichTextCore = /** @class */ (function () {
|
|
|
280
313
|
if (!oriStyle)
|
|
281
314
|
return;
|
|
282
315
|
var styleObj = parseStyleString(oriStyle);
|
|
316
|
+
// 1) 处理 margin-left 单独声明
|
|
283
317
|
var marginLeftVal = styleObj["margin-left"];
|
|
284
318
|
if (marginLeftVal !== undefined) {
|
|
285
|
-
// 移除 margin-left
|
|
286
319
|
delete styleObj["margin-left"];
|
|
287
|
-
// 如果原本没有 padding-left,则直接设置;若已有,简单覆盖(遵循后写优先规则)
|
|
288
320
|
styleObj["padding-left"] = styleObj["padding-left"] || marginLeftVal;
|
|
289
|
-
// 写回合并后的样式
|
|
290
|
-
$(this).attr("style", serializeStyleObject(styleObj));
|
|
291
321
|
}
|
|
322
|
+
// 2) 处理 margin shorthand,提取 left
|
|
323
|
+
if (styleObj["margin"]) {
|
|
324
|
+
var marginStr = styleObj["margin"].trim();
|
|
325
|
+
var parts = marginStr.split(/\s+/);
|
|
326
|
+
var top_1 = "", right = "", bottom = "", left = "";
|
|
327
|
+
if (parts.length === 1) {
|
|
328
|
+
top_1 = right = bottom = left = parts[0];
|
|
329
|
+
}
|
|
330
|
+
else if (parts.length === 2) {
|
|
331
|
+
top_1 = bottom = parts[0];
|
|
332
|
+
right = left = parts[1];
|
|
333
|
+
}
|
|
334
|
+
else if (parts.length === 3) {
|
|
335
|
+
top_1 = parts[0];
|
|
336
|
+
right = left = parts[1];
|
|
337
|
+
bottom = parts[2];
|
|
338
|
+
}
|
|
339
|
+
else {
|
|
340
|
+
top_1 = parts[0];
|
|
341
|
+
right = parts[1];
|
|
342
|
+
bottom = parts[2];
|
|
343
|
+
left = parts[3];
|
|
344
|
+
}
|
|
345
|
+
// 将 left 移到 padding-left
|
|
346
|
+
if (left) {
|
|
347
|
+
styleObj["padding-left"] = styleObj["padding-left"] || left;
|
|
348
|
+
}
|
|
349
|
+
// 重构 margin,去掉 left(用 0 占位保持布局)
|
|
350
|
+
var newMargin = "".concat(top_1, " ").concat(right, " ").concat(bottom, " 0");
|
|
351
|
+
styleObj["margin"] = newMargin.trim();
|
|
352
|
+
}
|
|
353
|
+
// 写回合并后的样式
|
|
354
|
+
$(this).attr("style", serializeStyleObject(styleObj));
|
|
292
355
|
});
|
|
293
356
|
};
|
|
294
357
|
RichTextCore.fixImgSizeUnit = function ($) {
|
package/package.json
CHANGED
package/readme.md
CHANGED