ParsedReadMore는 자동 URL 탐지 및 구문 분석을 지원하는 Flutter 위젯으로, 텍스트 내의 링크를 클릭 가능한 하이퍼링크로 변환합니다. 전개 가능한 텍스트를 지원하여 사용자가 '더 보기' 전환 버튼을 통해 추가 콘텐츠를 표시할 수 있습니다. 임베디드 URL과 상호작용해야 하는 앱에서 풍부한 텍스트를 표시하는 데 이상적입니다. 이 위젯은 Android, iOS, Web, macOS, Windows, Linux 등 모든 주요 플랫폼에서 작동합니다.
사용 사례
클릭 가능한 URL을 포함한 리치 텍스트 표시
확장 가능한 콘텐츠 섹션 만들기
인터랙티브 텍스트를 통한 사용자 참여도 향상
앱 콘텐츠에 소셜 미디어 또는 웹 링크 표시
블로그 스타일 텍스트 조각 구현
주요 기능
자동 URL 탐지 및 링크
확장 가능/접을 수 있는 텍스트
크로스 플랫폼 호환성
여러 텍스트 스타일을 지원
pub를 통한 간단한 통합
사용자 정의 가능한 더 보기 버튼
적합한 대상
콘텐츠 중심 앱
소셜 미디어 인터페이스
블로그 및 뉴스 리더
교육 앱
사용자 생성 콘텐츠가 표시됨
고려 사항
복잡한 텍스트에 대한 스타일 조정이 필요할 수 있습니다
매우 긴 텍스트로 인한 성능 영향
URL 파싱에 한정됨(기타 마크업 없음)
입력에서 올바른 URL 형식에 의존
링크를 초과한 고도로 형식화된 리치 텍스트에는 적합하지 않습니다
원본 README
연결된 소스 저장소의 README 원문 스냅샷입니다. 최신 내용은 저장소에서 확인하세요.
Parsed Readmore
Latest version has BREAKING CHANGES !
A Flutter package which allows the user to enter text which can be collapsed and expanded based on user defined trimming conditions. Nevertheless, it will automatically parse the user regex patterns (urls by default) present in the text into clickable hyperlinks with a user defined click action (browser launch by default). It also allows the user to enter a highlight text on which some custom text style can be applied with the support of multiple text phrases (priority based).
Trimming can either be done on basis of length or number of lines.
Option to include a customised delimiter.
Automatically parses the urls present in the text into hyperlinks which launches the browser on click event (default behaviour).
All the text components including the parsed urls, delimiter, clickable texts, etc can be given seperate custom styles.
Addition of user defined action on clicking the hyperlinks.
Using custom text styles for target text (also refered as text highlighting).
Multiword highlighting. We are using priority (int) to resolve the clash of phrases. For example, if we have 2 phrases 'the' and 't' and the priority of 't' is higher then the style of letter 't' will be used while 'he' of 'the' will have the style of the style of 'the'. (latest)
Option to use custom regex for Url/pattern regonition. (latest)
Installation
Run this command in your terminal
flutter pub add parsed_readmore
Or add it manually in your project's pubspec.yaml (and run an implicit flutter pub get):
dependencies:
parsed_readmore: latest_version
Import parsed_readmore.dart in the file where you wish to use
For detailed implementation refer to the "Example" tab
We will be using a common input string to demonstrate the different uses cases of this package.
const inputString = "When using custom values we have specified 'the' to be our target text for highlighting with purple italic font.\n We know that the website https://google.com is a very useful website. (rti..notNow should not be parsed) But Instagram.com is more fun to use. We should not forget the contribution of wikipedia.com played in the growth of web. If you like this package do consider liking it so that it could be useful to more developers like you. Thank you for your time";
Without using package (Plain Text)
Here we are using the simple Text() widget available in Flutter by default.
Text(inputString);
We can clearly see that no url is parsed here into clickable texts and there is no option to expand and collapse the texts.
The code above will implement all features of the widget with the default values which are :
trimMode = TrimMode.length
delimiter = ' ...'
trimLength = 240
readLessText = 'show less',
readMoreText = 'read more',
urlRegex = r'([\w+]+://)?([\w\d-]+.)*[\w-]+[.][a-z0-9_]+([/?=&#.]?[\w-]){1,}/?' (regex for url detection)
if onTapLink == null --> url will be launched in extrenal browser.
Here the urls are parsed into clickable links which open external browser on tapping. The text is also collapsable and expandable
Using package with custom values
ParsedReadMore(
TextHighlightParser(
urlRegex: r'https:\/\/[^\s]+',
data: inputData,
initialState: ReadMoreState.collapsed,
urlTextStyle: textStyle.copyWith(
color: Colors.green,
decoration: TextDecoration.underline,
),
trimMode: TrimMode.line,
maxLines: 2,
onTapLink: (url) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(
"""'$url' is displayed because we have used custom onTap function for hyperlinks""",
),
),
);
},
targetTextHighlights: TargetTextHighlights(targetHighlights: [
TargetTextHighlight(
priority: 1,
targetText: 'The',
style: TextStyle(
fontSize: 20.0,
fontStyle: FontStyle.italic,
color: Colors.blue[900],
),
),
TargetTextHighlight(
priority: 2,
targetText: 'he',
highlightInUrl: true,
style: constTextStyle(
fontSize: 20.0,
color: Colors.purple,
),
onTap: (range) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(
"'${range.textInside(inputData)}' is between the character no ${range.start} and ${range.end}"),
),
);
}),
]),
),
readMoreDelimiter: '+++',
readLessDelimiter: ' ---',
readMoreDelimiterStyle: textStyle.copyWith(color: Colors.black),
readLessDelimiterStyle: textStyle.copyWith(color: Colors.black),
style: textStyle.copyWith(color: Colors.grey),
readMoreText: ' expand',
readLessText: ' compress',
readMoreTextStyle: textStyle.copyWith(color: Colors.blue),
readLessTextStyle: textStyle.copyWith(color: Colors.pink),
)
Highlight points here:
Custom regex for recognizing only the 'https' urls.
Custom text style for the urls
Custom click action for the Urls (Snackbar instead of browser launch)
Multiple text highlights using 'targetTextHighlights' attribute
Custom text style and click actions (optional) for the highlights
An important point to note here is that, In case of clash of the mutliples highlights, we are using the 'priority' attribute of each TargetTextHighlight. The target text having numerical value of the priority greater will be override the style of the lower priority highlight.
Custom delimiters
Custom text style for the non-url and the non-highlight texts
Custom readMore and readLess texts
Issues
Please file any issues, bugs or feature request as an issue on the GitHub page. If you have some idea for feature upgrade, feel free to contact me through email [aashish.260401@gmail.com](mailto:aashish.260401@gmail.com).