From 8875924d93cee35b22655922c7fca157c966c978 Mon Sep 17 00:00:00 2001 From: shreyas1599 Date: Tue, 19 Jan 2021 19:16:41 +0530 Subject: [PATCH 1/2] feat: markdown user profile links --- lib/widgets/markdown_view.dart | 38 ++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/lib/widgets/markdown_view.dart b/lib/widgets/markdown_view.dart index c0f2eb7a..3e4b7da4 100644 --- a/lib/widgets/markdown_view.dart +++ b/lib/widgets/markdown_view.dart @@ -7,6 +7,10 @@ import 'package:git_touch/widgets/html_view.dart'; import 'package:provider/provider.dart'; import 'package:uri/uri.dart'; import 'package:path/path.dart' as path; +import 'package:markdown/markdown.dart' as md; +import 'package:charcode/charcode.dart'; + +import 'link.dart'; class MarkdownViewData { final Future future; @@ -109,6 +113,18 @@ class MarkdownFlutterView extends StatelessWidget { return Container( padding: padding, child: MarkdownBody( + builders: { + "userProfileLink": UserProfileLinkElementBuilder(), + }, + extensionSet: md.ExtensionSet( + md.ExtensionSet.gitHubFlavored.blockSyntaxes, + [ + UserProfileLink(), + md.EmojiSyntax(), + md.LinkSyntax(), + ...md.ExtensionSet.gitHubFlavored.inlineSyntaxes + ], + ), data: text, selectable: true, imageBuilder: (uri, title, alt) { @@ -212,3 +228,25 @@ class MarkdownFlutterView extends StatelessWidget { ); } } + +class UserProfileLink extends md.InlineSyntax { + UserProfileLink() : super(r'[^\s]+ ', startCharacter: $at); + + @override + bool onMatch(md.InlineParser parser, Match match) { + var alias = match[0].substring(1, match[0].length).trim(); + parser.addNode(md.Element.text("userProfileLink", alias)); + return true; + } +} + +class UserProfileLinkElementBuilder extends MarkdownElementBuilder { + @override + Widget visitElementAfter(md.Element element, TextStyle prefferedStyle) { + return Link( + url: '/github/${element.textContent}', + child: Text( + '@' + element.textContent, + )); + } +} From 1f156e58e3699f1d76d0ff4360597a9818ff4886 Mon Sep 17 00:00:00 2001 From: shreyas1599 Date: Tue, 19 Jan 2021 21:07:38 +0530 Subject: [PATCH 2/2] fix: username regex --- lib/widgets/markdown_view.dart | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/lib/widgets/markdown_view.dart b/lib/widgets/markdown_view.dart index 3e4b7da4..7c424089 100644 --- a/lib/widgets/markdown_view.dart +++ b/lib/widgets/markdown_view.dart @@ -230,12 +230,15 @@ class MarkdownFlutterView extends StatelessWidget { } class UserProfileLink extends md.InlineSyntax { - UserProfileLink() : super(r'[^\s]+ ', startCharacter: $at); + // github username regex format + UserProfileLink() + : super(r'\B@([a-z0-9](?:-?[a-z0-9]){0,38})', startCharacter: $at); @override bool onMatch(md.InlineParser parser, Match match) { - var alias = match[0].substring(1, match[0].length).trim(); - parser.addNode(md.Element.text("userProfileLink", alias)); + var login = match[0].substring(1, match[0].length).trim(); + md.Node el = md.Element.text("userProfileLink", login); + parser.addNode(el); return true; } } @@ -245,8 +248,6 @@ class UserProfileLinkElementBuilder extends MarkdownElementBuilder { Widget visitElementAfter(md.Element element, TextStyle prefferedStyle) { return Link( url: '/github/${element.textContent}', - child: Text( - '@' + element.textContent, - )); + child: Text('@' + element.textContent)); } }