Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
82 changes: 79 additions & 3 deletions lib/core/misc/html_utils/html_to_plain_text.dart
Original file line number Diff line number Diff line change
@@ -1,11 +1,87 @@
// SPDX-License-Identifier: Apache-2.0
// Copyright 2025 BitCodersNN

import 'package:html/parser.dart';
import 'package:html/dom.dart' as dom;
import 'package:html/parser.dart' as parser;
import 'package:html_unescape/html_unescape.dart';

void _processNode(
dom.Node node,
StringBuffer buffer,
Set<String> blockTags,
) {
if (node is dom.Text) {
final text = node.text.replaceAll(RegExp(r'\s+'), ' ').trim();
if (text.isNotEmpty) {
buffer.write('$text ');
}
} else if (node is dom.Element) {
final tagName = node.localName?.toLowerCase();

if (tagName == 'a') {
final href = node.attributes['href'];
if (href != null && href.trim().isNotEmpty) {
buffer.write(href);
} else {
for (final child in node.nodes) {
_processNode(child, buffer, blockTags);
}
}
} else {
for (final child in node.nodes) {
_processNode(child, buffer, blockTags);
}
}

if (blockTags.contains(tagName)) {
buffer.write('\n');
}
}
}

String _getElementTextWithFormatting(dom.Element element) {
final buffer = StringBuffer();
final blockTags = {
'br',
'p',
'div',
'h1',
'h2',
'h3',
'h4',
'h5',
'h6',
'li',
'tr',
'pre',
'blockquote',
'hr',
'ul',
'ol',
'dl',
'section',
'article',
'aside',
'header',
'footer',
'main',
};

_processNode(element, buffer, blockTags);

return buffer
.toString()
.replaceAll(RegExp(r'[ \t]*\n[ \t]*'), '\n')
.replaceAll(RegExp(r'\n{3,}'), '\n\n')
.trim();
}

String htmlToPlainText(String htmlText) {
final unescaped = HtmlUnescape().convert(htmlText);
final document = parse(unescaped);
return document.body?.text ?? '';
final document = parser.parse(unescaped);
final body = document.body;
if (body != null) {
return _getElementTextWithFormatting(body);
}
return '';
}
2 changes: 1 addition & 1 deletion lib/ui/views/main_page/feed/widgets/feed_post.dart
Original file line number Diff line number Diff line change
Expand Up @@ -291,7 +291,7 @@ class _FeedPostState extends State<FeedPost> {
ShareParams(
files: xFiles.isEmpty ? null : xFiles,
text:
'Из ленты Портала ННГУ (автор ${model.profileViewModel.fullname}):\n${htmlToPlainText(model.postText)}',
'${htmlToPlainText(model.postText)}\n\nИсточник: Портал ННГУ\nАвтор: ${model.profileViewModel.fullname}',
),
);
}
Expand Down
2 changes: 1 addition & 1 deletion pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ name: unn_mobile
description: A mobile application for UNN Portal website
publish_to: 'none'

version: 0.6.0+372
version: 0.6.0+373

environment:
sdk: '>=3.1.2 <4.0.0'
Expand Down
Loading