From effbc42f2295e8eb1bdb2b4d228b4684dc7bcefd Mon Sep 17 00:00:00 2001 From: Aman Date: Mon, 21 Mar 2022 16:25:46 +0530 Subject: [PATCH] feat: implement custom builder for backticks content --- lib/services/ib_engine_service.dart | 21 +--------- lib/ui/views/ib/ib_page_view.dart | 2 + .../ib/syntaxes/ib_backticks_syntax.dart | 38 +++++++++++++++++++ .../ib/syntaxes/ib_inline_html_syntax.dart | 4 +- 4 files changed, 43 insertions(+), 22 deletions(-) create mode 100644 lib/ui/views/ib/syntaxes/ib_backticks_syntax.dart diff --git a/lib/services/ib_engine_service.dart b/lib/services/ib_engine_service.dart index 1f570c09..135a3502 100644 --- a/lib/services/ib_engine_service.dart +++ b/lib/services/ib_engine_service.dart @@ -249,31 +249,12 @@ class IbEngineServiceImpl implements IbEngineService { if (_ibRawPageData == null) return null; - /// Inline HTML Tags bounded by Backticks(`) are not parsed - /// For example, - /// 26 -> 2^6 - /// whereas, `26` -> `26` - final content = HtmlUnescape() - .convert(_ibRawPageData.rawContent) - .splitMapJoin( - RegExp(r'\`(.*?)\`'), - onMatch: (m) { - if (m[1] != null && - RegExp(r'<(\S*?)[^>]*>(.*?)<\/\1>|<.*?\/>').hasMatch(m[1]!)) { - return '${m[1]}'; - } - - return '${m[0]}'; - }, - onNonMatch: (n) => n, - ); - return IbPageData( id: _ibRawPageData.id, pageUrl: _ibRawPageData.httpUrl, title: _ibRawPageData.title, content: [ - IbMd(content: '$content\n'), + IbMd(content: '${HtmlUnescape().convert(_ibRawPageData.rawContent)}\n'), ], tableOfContents: _ibRawPageData.hasToc ? _getTableOfContents(_ibRawPageData.content!) diff --git a/lib/ui/views/ib/ib_page_view.dart b/lib/ui/views/ib/ib_page_view.dart index 83cea9e6..93ac5c31 100644 --- a/lib/ui/views/ib/ib_page_view.dart +++ b/lib/ui/views/ib/ib_page_view.dart @@ -19,6 +19,7 @@ import 'package:mobile_app/ui/views/ib/builders/ib_pop_quiz_builder.dart'; import 'package:mobile_app/ui/views/ib/builders/ib_subscript_builder.dart'; import 'package:mobile_app/ui/views/ib/builders/ib_superscript_builder.dart'; import 'package:mobile_app/ui/views/ib/builders/ib_webview_builder.dart'; +import 'package:mobile_app/ui/views/ib/syntaxes/ib_backticks_syntax.dart'; import 'package:mobile_app/ui/views/ib/syntaxes/ib_embed_syntax.dart'; import 'package:mobile_app/ui/views/ib/syntaxes/ib_filter_syntax.dart'; import 'package:mobile_app/ui/views/ib/syntaxes/ib_inline_html_syntax.dart'; @@ -214,6 +215,7 @@ class _IbPageViewState extends State { [ IbInlineHtmlSyntax(builders: _inlineBuilders), IbMathjaxSyntax(), + IbBackTicksSyntax(), md.EmojiSyntax(), ...md.ExtensionSet.gitHubFlavored.inlineSyntaxes, ], diff --git a/lib/ui/views/ib/syntaxes/ib_backticks_syntax.dart b/lib/ui/views/ib/syntaxes/ib_backticks_syntax.dart new file mode 100644 index 00000000..6976d644 --- /dev/null +++ b/lib/ui/views/ib/syntaxes/ib_backticks_syntax.dart @@ -0,0 +1,38 @@ +import 'package:markdown/markdown.dart' as md; +import 'package:mobile_app/ui/views/ib/syntaxes/ib_inline_html_syntax.dart'; + +class IbBackTicksSyntax extends md.InlineSyntax { + IbBackTicksSyntax() : super(_pattern); + + static const String _pattern = r'\`(.*?)\`'; + + @override + bool onMatch(md.InlineParser parser, Match match) { + final String matched = match[1] ?? ''; + + final inlineRegex = RegExp(IbInlineHtmlSyntax.Pattern); + + /// Inline HTML Tags bounded by Backticks(`) are not parsed + if (inlineRegex.hasMatch(matched)) { + for (var word in matched.split(' ')) { + if (inlineRegex.hasMatch(word)) { + parser.addNode(md.Text(word.substring(0, word.indexOf('<')))); + + final match = inlineRegex.firstMatch(word); + if (match != null) { + parser.addNode(md.Element.text(match[1]!, match[2]!)); + } + + parser.addNode( + md.Text("${word.substring(word.lastIndexOf('>') + 1)} ")); + continue; + } + parser.addNode(md.Text('$word ')); + } + } else { + parser.addNode(md.Element.text('code', matched)); + } + + return true; + } +} diff --git a/lib/ui/views/ib/syntaxes/ib_inline_html_syntax.dart b/lib/ui/views/ib/syntaxes/ib_inline_html_syntax.dart index 8e8e255f..8fed2a3c 100644 --- a/lib/ui/views/ib/syntaxes/ib_inline_html_syntax.dart +++ b/lib/ui/views/ib/syntaxes/ib_inline_html_syntax.dart @@ -2,11 +2,11 @@ import 'package:flutter_markdown/flutter_markdown.dart'; import 'package:markdown/markdown.dart' as md; class IbInlineHtmlSyntax extends md.InlineSyntax { - IbInlineHtmlSyntax({required this.builders}) : super(_pattern); + IbInlineHtmlSyntax({required this.builders}) : super(Pattern); Map builders; - static const String _pattern = r'<(\S*?)[^>]*>(.*?)<\/\1>|<.*?\/>'; + static const String Pattern = r'<(\S*?)[^>]*>(.*?)<\/\1>|<.*?\/>'; @override bool onMatch(md.InlineParser parser, Match match) {