Open insinfo opened 1 year ago
I implemented it like this but the behavior is wrong
class HtmlTrim {
bool reachedLimit = false;
int totalLen = 0;
List<html.Node> toRemove = [];
static String trim(String htmlString, {int limit = 25}) {
final dom = html.parseFragment(htmlString);
var instance = HtmlTrim();
var toRemove = instance._walk(dom, limit);
// remove any nodes that exceed limit
for (var child in toRemove) {
child.parentNode?.remove();
}
return dom.outerHtml;
}
List<html.Node> _walk(html.Node node, int maxLen) {
if (reachedLimit) {
if (node.firstChild != null) {
toRemove.add(node.firstChild!);
}
} else {
// only text nodes should have text,
// so do the splitting here
if (node.firstChild?.nodeType == html.Node.TEXT_NODE) {
var nodeText = node.firstChild!;
if (nodeText.text != null) {
var nodeLen = nodeText.text!.length;
this.totalLen += nodeLen;
if (this.totalLen > maxLen) {
nodeText.text = nodeText.text!
.substring(0, nodeLen - (this.totalLen - maxLen)) +
'...';
this.reachedLimit = true;
}
}
}
// if node has children, walk its child elements
if (node.children.isNotEmpty) {
for (var child in node.children) {
_walk(child, maxLen);
}
}
}
return this.toRemove;
}
}
var html =
'''<div><p><b>Lorem</b> ipsum dolor sit amet, consectetur adipisicing elit,
sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. </p><p>Ut
enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip
ex ea commodo consequat. </p><p>Duis aute irure dolor in reprehenderit in
voluptate velit esse cillum dolore eu fugiat nulla pariatur. </p><p>Excepteur
sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit
anim id est laborum.</p></div>''';
var trim = HtmlTrim.trim(html, limit: 5);
print('main: ${trim}');
// dart .\bin\teste_html_trim.dart
//Result: <div><p><b>Lorem</b> ipsum dolor sit amet, consectetur adipisicing elit,
// sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. </p><p>...</p></div>
I need to get only the text nodes of an html, I do it like this in PHP