Skip to content

Commit 0422bbd

Browse files
authored
Преобразование HTML-текста в plain text при копировании (#602)
1 parent c953aca commit 0422bbd

4 files changed

Lines changed: 17 additions & 10 deletions

File tree

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
// SPDX-License-Identifier: Apache-2.0
2+
// Copyright 2025 BitCodersNN
3+
4+
import 'package:html/parser.dart';
5+
import 'package:html_unescape/html_unescape.dart';
6+
7+
String htmlToPlainText(String htmlText) {
8+
final unescaped = HtmlUnescape().convert(htmlText);
9+
final document = parse(unescaped);
10+
return document.body?.text ?? '';
11+
}

lib/ui/views/main_page/feed/widgets/feed_post.dart

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,14 @@ import 'package:cached_network_image/cached_network_image.dart';
55
import 'package:event/event.dart';
66
import 'package:flutter/material.dart';
77
import 'package:go_router/go_router.dart';
8-
import 'package:html/parser.dart';
9-
import 'package:html_unescape/html_unescape.dart';
108
import 'package:http/http.dart' as http;
119
import 'package:injector/injector.dart';
1210
import 'package:intl/intl.dart';
1311
import 'package:mime/mime.dart';
1412
import 'package:path/path.dart' as p;
1513
import 'package:share_plus/share_plus.dart';
1614
import 'package:unn_mobile/core/misc/haptic_utils.dart';
15+
import 'package:unn_mobile/core/misc/html_utils/html_to_plain_text.dart';
1716
import 'package:unn_mobile/core/models/feed/rating_list.dart';
1817
import 'package:unn_mobile/core/viewmodels/factories/feed_post_view_model_factory.dart';
1918
import 'package:unn_mobile/core/viewmodels/main_page/common/profile_view_model.dart';
@@ -288,15 +287,11 @@ class _FeedPostState extends State<FeedPost> {
288287
);
289288
xFiles.addAll(fetchedImages.whereType<XFile>());
290289

291-
final htmlDoc = parse(
292-
HtmlUnescape().convert(model.postText),
293-
);
294-
final parsedString = parse(htmlDoc.body?.text).documentElement?.text;
295290
await SharePlus.instance.share(
296291
ShareParams(
297292
files: xFiles.isEmpty ? null : xFiles,
298293
text:
299-
"Из ленты Портала ННГУ (автор ${model.profileViewModel.fullname}):\n${parsedString ?? ''}",
294+
'Из ленты Портала ННГУ (автор ${model.profileViewModel.fullname}):\n${htmlToPlainText(model.postText)}',
300295
),
301296
);
302297
}

lib/ui/widgets/context_menu/context_menu_factory.dart

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
import 'package:flutter/material.dart';
55
import 'package:flutter/services.dart';
6+
import 'package:unn_mobile/core/misc/html_utils/html_to_plain_text.dart';
67
import 'package:unn_mobile/core/viewmodels/main_page/chat/message_reaction_view_model.dart';
78
import 'package:unn_mobile/core/viewmodels/main_page/common/reaction_view_model_base.dart';
89
import 'package:unn_mobile/core/viewmodels/main_page/feed/feed_comment_view_model.dart';
@@ -31,7 +32,7 @@ List<ContextMenuAction> createPostActions({
3132
_createActions(
3233
context: context,
3334
reactionViewModel: model.reactionViewModel,
34-
textToCopy: model.postText,
35+
textToCopy: htmlToPlainText(model.postText),
3536
onTogglePin: model.togglePin,
3637
isPinned: model.isPinned,
3738
onShare: () => onShare(model),
@@ -44,7 +45,7 @@ List<ContextMenuAction> createCommentActions({
4445
_createActions(
4546
context: context,
4647
reactionViewModel: model.reactionViewModel,
47-
textToCopy: model.message,
48+
textToCopy: htmlToPlainText(model.message),
4849
);
4950

5051
List<ContextMenuAction> createLinkActions({

pubspec.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ name: unn_mobile
22
description: A mobile application for UNN Portal website
33
publish_to: 'none'
44

5-
version: 0.6.0+370
5+
version: 0.6.0+371
66

77
environment:
88
sdk: '>=3.1.2 <4.0.0'

0 commit comments

Comments
 (0)