Committed by
GitHub
Merge pull request #7 from suysoftware/main
add CodeBuilder feature
Showing
7 changed files
with
95 additions
and
119 deletions
| @@ -67,6 +67,21 @@ Welcome to ChatGPT! Below is an example of a response with Markdown and LaTeX co | @@ -67,6 +67,21 @@ Welcome to ChatGPT! Below is an example of a response with Markdown and LaTeX co | ||
| 67 | 67 | ||
| 68 | ### Markdown Example | 68 | ### Markdown Example |
| 69 | 69 | ||
| 70 | + | ||
| 71 | +``` | ||
| 72 | +class MarkdownHelper { | ||
| 73 | + | ||
| 74 | + | ||
| 75 | + Map<String, Widget> getTitleWidget(m.Node node) => title.getTitleWidget(node); | ||
| 76 | + | ||
| 77 | + Widget getPWidget(m.Element node) => p.getPWidget(node); | ||
| 78 | + | ||
| 79 | + Widget getPreWidget(m.Node node) => pre.getPreWidget(node); | ||
| 80 | + | ||
| 81 | +} | ||
| 82 | +``` | ||
| 83 | + | ||
| 84 | + | ||
| 70 | You can use Markdown to format text easily. Here are some examples: | 85 | You can use Markdown to format text easily. Here are some examples: |
| 71 | 86 | ||
| 72 | - **Bold Text**: **This text is bold** | 87 | - **Bold Text**: **This text is bold** |
| @@ -259,7 +259,7 @@ | @@ -259,7 +259,7 @@ | ||
| 259 | isa = PBXProject; | 259 | isa = PBXProject; |
| 260 | attributes = { | 260 | attributes = { |
| 261 | LastSwiftUpdateCheck = 0920; | 261 | LastSwiftUpdateCheck = 0920; |
| 262 | - LastUpgradeCheck = 1510; | 262 | + LastUpgradeCheck = 1430; |
| 263 | ORGANIZATIONNAME = ""; | 263 | ORGANIZATIONNAME = ""; |
| 264 | TargetAttributes = { | 264 | TargetAttributes = { |
| 265 | 331C80D4294CF70F00263BE5 = { | 265 | 331C80D4294CF70F00263BE5 = { |
| @@ -215,30 +215,6 @@ packages: | @@ -215,30 +215,6 @@ packages: | ||
| 215 | url: "https://pub.dev" | 215 | url: "https://pub.dev" |
| 216 | source: hosted | 216 | source: hosted |
| 217 | version: "0.6.7" | 217 | version: "0.6.7" |
| 218 | - leak_tracker: | ||
| 219 | - dependency: transitive | ||
| 220 | - description: | ||
| 221 | - name: leak_tracker | ||
| 222 | - sha256: "78eb209deea09858f5269f5a5b02be4049535f568c07b275096836f01ea323fa" | ||
| 223 | - url: "https://pub.dev" | ||
| 224 | - source: hosted | ||
| 225 | - version: "10.0.0" | ||
| 226 | - leak_tracker_flutter_testing: | ||
| 227 | - dependency: transitive | ||
| 228 | - description: | ||
| 229 | - name: leak_tracker_flutter_testing | ||
| 230 | - sha256: b46c5e37c19120a8a01918cfaf293547f47269f7cb4b0058f21531c2465d6ef0 | ||
| 231 | - url: "https://pub.dev" | ||
| 232 | - source: hosted | ||
| 233 | - version: "2.0.1" | ||
| 234 | - leak_tracker_testing: | ||
| 235 | - dependency: transitive | ||
| 236 | - description: | ||
| 237 | - name: leak_tracker_testing | ||
| 238 | - sha256: a597f72a664dbd293f3bfc51f9ba69816f84dcd403cdac7066cb3f6003f3ab47 | ||
| 239 | - url: "https://pub.dev" | ||
| 240 | - source: hosted | ||
| 241 | - version: "2.0.1" | ||
| 242 | lints: | 218 | lints: |
| 243 | dependency: transitive | 219 | dependency: transitive |
| 244 | description: | 220 | description: |
| @@ -251,26 +227,26 @@ packages: | @@ -251,26 +227,26 @@ packages: | ||
| 251 | dependency: transitive | 227 | dependency: transitive |
| 252 | description: | 228 | description: |
| 253 | name: matcher | 229 | name: matcher |
| 254 | - sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb | 230 | + sha256: "1803e76e6653768d64ed8ff2e1e67bea3ad4b923eb5c56a295c3e634bad5960e" |
| 255 | url: "https://pub.dev" | 231 | url: "https://pub.dev" |
| 256 | source: hosted | 232 | source: hosted |
| 257 | - version: "0.12.16+1" | 233 | + version: "0.12.16" |
| 258 | material_color_utilities: | 234 | material_color_utilities: |
| 259 | dependency: transitive | 235 | dependency: transitive |
| 260 | description: | 236 | description: |
| 261 | name: material_color_utilities | 237 | name: material_color_utilities |
| 262 | - sha256: "0e0a020085b65b6083975e499759762399b4475f766c21668c4ecca34ea74e5a" | 238 | + sha256: "9528f2f296073ff54cb9fee677df673ace1218163c3bc7628093e7eed5203d41" |
| 263 | url: "https://pub.dev" | 239 | url: "https://pub.dev" |
| 264 | source: hosted | 240 | source: hosted |
| 265 | - version: "0.8.0" | 241 | + version: "0.5.0" |
| 266 | meta: | 242 | meta: |
| 267 | dependency: transitive | 243 | dependency: transitive |
| 268 | description: | 244 | description: |
| 269 | name: meta | 245 | name: meta |
| 270 | - sha256: d584fa6707a52763a52446f02cc621b077888fb63b93bbcb1143a7be5a0c0c04 | 246 | + sha256: a6e590c838b18133bb482a2745ad77c5bb7715fb0451209e1a7567d416678b8e |
| 271 | url: "https://pub.dev" | 247 | url: "https://pub.dev" |
| 272 | source: hosted | 248 | source: hosted |
| 273 | - version: "1.11.0" | 249 | + version: "1.10.0" |
| 274 | nested: | 250 | nested: |
| 275 | dependency: transitive | 251 | dependency: transitive |
| 276 | description: | 252 | description: |
| @@ -283,10 +259,10 @@ packages: | @@ -283,10 +259,10 @@ packages: | ||
| 283 | dependency: transitive | 259 | dependency: transitive |
| 284 | description: | 260 | description: |
| 285 | name: path | 261 | name: path |
| 286 | - sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af" | 262 | + sha256: "8829d8a55c13fc0e37127c29fedf290c102f4e40ae94ada574091fe0ff96c917" |
| 287 | url: "https://pub.dev" | 263 | url: "https://pub.dev" |
| 288 | source: hosted | 264 | source: hosted |
| 289 | - version: "1.9.0" | 265 | + version: "1.8.3" |
| 290 | path_parsing: | 266 | path_parsing: |
| 291 | dependency: transitive | 267 | dependency: transitive |
| 292 | description: | 268 | description: |
| @@ -612,14 +588,6 @@ packages: | @@ -612,14 +588,6 @@ packages: | ||
| 612 | url: "https://pub.dev" | 588 | url: "https://pub.dev" |
| 613 | source: hosted | 589 | source: hosted |
| 614 | version: "2.1.4" | 590 | version: "2.1.4" |
| 615 | - vm_service: | ||
| 616 | - dependency: transitive | ||
| 617 | - description: | ||
| 618 | - name: vm_service | ||
| 619 | - sha256: b3d56ff4341b8f182b96aceb2fa20e3dcb336b9f867bc0eafc0de10f1048e957 | ||
| 620 | - url: "https://pub.dev" | ||
| 621 | - source: hosted | ||
| 622 | - version: "13.0.0" | ||
| 623 | web: | 591 | web: |
| 624 | dependency: transitive | 592 | dependency: transitive |
| 625 | description: | 593 | description: |
| @@ -17,6 +17,7 @@ class TexMarkdown extends StatelessWidget { | @@ -17,6 +17,7 @@ class TexMarkdown extends StatelessWidget { | ||
| 17 | this.textScaleFactor, | 17 | this.textScaleFactor, |
| 18 | this.onLinkTab, | 18 | this.onLinkTab, |
| 19 | this.latexBuilder, | 19 | this.latexBuilder, |
| 20 | + this.codeBuilder, | ||
| 20 | }); | 21 | }); |
| 21 | final TextDirection textDirection; | 22 | final TextDirection textDirection; |
| 22 | final String data; | 23 | final String data; |
| @@ -27,6 +28,7 @@ class TexMarkdown extends StatelessWidget { | @@ -27,6 +28,7 @@ class TexMarkdown extends StatelessWidget { | ||
| 27 | final String Function(String tex)? latexWorkaround; | 28 | final String Function(String tex)? latexWorkaround; |
| 28 | final Widget Function(BuildContext context, String tex)? latexBuilder; | 29 | final Widget Function(BuildContext context, String tex)? latexBuilder; |
| 29 | final bool followLinkColor; | 30 | final bool followLinkColor; |
| 31 | + final Widget Function(BuildContext context, String tex)? codeBuilder; | ||
| 30 | 32 | ||
| 31 | @override | 33 | @override |
| 32 | Widget build(BuildContext context) { | 34 | Widget build(BuildContext context) { |
| @@ -62,6 +64,7 @@ class TexMarkdown extends StatelessWidget { | @@ -62,6 +64,7 @@ class TexMarkdown extends StatelessWidget { | ||
| 62 | followLinkColor: followLinkColor, | 64 | followLinkColor: followLinkColor, |
| 63 | latexWorkaround: latexWorkaround, | 65 | latexWorkaround: latexWorkaround, |
| 64 | latexBuilder: latexBuilder, | 66 | latexBuilder: latexBuilder, |
| 67 | + codeBuilder: codeBuilder, | ||
| 65 | )); | 68 | )); |
| 66 | } | 69 | } |
| 67 | } | 70 | } |
| @@ -38,10 +38,10 @@ abstract class MarkdownComponent { | @@ -38,10 +38,10 @@ abstract class MarkdownComponent { | ||
| 38 | final void Function(String url, String title)? onLinkTab, | 38 | final void Function(String url, String title)? onLinkTab, |
| 39 | final String Function(String tex)? latexWorkaround, | 39 | final String Function(String tex)? latexWorkaround, |
| 40 | final Widget Function(BuildContext context, String tex)? latexBuilder, | 40 | final Widget Function(BuildContext context, String tex)? latexBuilder, |
| 41 | + final Widget Function(BuildContext context, String tex)? codeBuilder, | ||
| 41 | ) { | 42 | ) { |
| 42 | List<InlineSpan> spans = []; | 43 | List<InlineSpan> spans = []; |
| 43 | - List<String> regexes = | ||
| 44 | - components.map<String>((e) => e.exp.pattern).toList(); | 44 | + List<String> regexes = components.map<String>((e) => e.exp.pattern).toList(); |
| 45 | final combinedRegex = RegExp( | 45 | final combinedRegex = RegExp( |
| 46 | regexes.join("|"), | 46 | regexes.join("|"), |
| 47 | multiLine: true, | 47 | multiLine: true, |
| @@ -64,6 +64,7 @@ abstract class MarkdownComponent { | @@ -64,6 +64,7 @@ abstract class MarkdownComponent { | ||
| 64 | onLinkTab, | 64 | onLinkTab, |
| 65 | latexWorkaround, | 65 | latexWorkaround, |
| 66 | latexBuilder, | 66 | latexBuilder, |
| 67 | + codeBuilder, | ||
| 67 | )); | 68 | )); |
| 68 | } else { | 69 | } else { |
| 69 | if (each is BlockMd) { | 70 | if (each is BlockMd) { |
| @@ -84,6 +85,7 @@ abstract class MarkdownComponent { | @@ -84,6 +85,7 @@ abstract class MarkdownComponent { | ||
| 84 | onLinkTab, | 85 | onLinkTab, |
| 85 | latexWorkaround, | 86 | latexWorkaround, |
| 86 | latexBuilder, | 87 | latexBuilder, |
| 88 | + codeBuilder, | ||
| 87 | ), | 89 | ), |
| 88 | TextSpan( | 90 | TextSpan( |
| 89 | text: "\n ", | 91 | text: "\n ", |
| @@ -123,6 +125,7 @@ abstract class MarkdownComponent { | @@ -123,6 +125,7 @@ abstract class MarkdownComponent { | ||
| 123 | final void Function(String url, String title)? onLinkTab, | 125 | final void Function(String url, String title)? onLinkTab, |
| 124 | final String Function(String tex)? latexWorkaround, | 126 | final String Function(String tex)? latexWorkaround, |
| 125 | final Widget Function(BuildContext context, String tex)? latexBuilder, | 127 | final Widget Function(BuildContext context, String tex)? latexBuilder, |
| 128 | + final Widget Function(BuildContext context, String tex)? codeBuilder, | ||
| 126 | ); | 129 | ); |
| 127 | 130 | ||
| 128 | RegExp get exp; | 131 | RegExp get exp; |
| @@ -143,6 +146,7 @@ abstract class InlineMd extends MarkdownComponent { | @@ -143,6 +146,7 @@ abstract class InlineMd extends MarkdownComponent { | ||
| 143 | final void Function(String url, String title)? onLinkTab, | 146 | final void Function(String url, String title)? onLinkTab, |
| 144 | final String Function(String tex)? latexWorkaround, | 147 | final String Function(String tex)? latexWorkaround, |
| 145 | final Widget Function(BuildContext context, String tex)? latexBuilder, | 148 | final Widget Function(BuildContext context, String tex)? latexBuilder, |
| 149 | + final Widget Function(BuildContext context, String tex)? codeBuilder, | ||
| 146 | ); | 150 | ); |
| 147 | } | 151 | } |
| 148 | 152 | ||
| @@ -159,6 +163,7 @@ abstract class BlockMd extends MarkdownComponent { | @@ -159,6 +163,7 @@ abstract class BlockMd extends MarkdownComponent { | ||
| 159 | final void Function(String url, String title)? onLinkTab, | 163 | final void Function(String url, String title)? onLinkTab, |
| 160 | final String Function(String tex)? latexWorkaround, | 164 | final String Function(String tex)? latexWorkaround, |
| 161 | final Widget Function(BuildContext context, String tex)? latexBuilder, | 165 | final Widget Function(BuildContext context, String tex)? latexBuilder, |
| 166 | + final Widget Function(BuildContext context, String tex)? codeBuilder, | ||
| 162 | ) { | 167 | ) { |
| 163 | return WidgetSpan( | 168 | return WidgetSpan( |
| 164 | child: build( | 169 | child: build( |
| @@ -169,6 +174,7 @@ abstract class BlockMd extends MarkdownComponent { | @@ -169,6 +174,7 @@ abstract class BlockMd extends MarkdownComponent { | ||
| 169 | onLinkTab, | 174 | onLinkTab, |
| 170 | latexWorkaround, | 175 | latexWorkaround, |
| 171 | latexBuilder, | 176 | latexBuilder, |
| 177 | + codeBuilder, | ||
| 172 | ), | 178 | ), |
| 173 | alignment: PlaceholderAlignment.middle, | 179 | alignment: PlaceholderAlignment.middle, |
| 174 | ); | 180 | ); |
| @@ -182,6 +188,7 @@ abstract class BlockMd extends MarkdownComponent { | @@ -182,6 +188,7 @@ abstract class BlockMd extends MarkdownComponent { | ||
| 182 | final void Function(String url, String title)? onLinkTab, | 188 | final void Function(String url, String title)? onLinkTab, |
| 183 | final String Function(String tex)? latexWorkaround, | 189 | final String Function(String tex)? latexWorkaround, |
| 184 | final Widget Function(BuildContext context, String tex)? latexBuilder, | 190 | final Widget Function(BuildContext context, String tex)? latexBuilder, |
| 191 | + final Widget Function(BuildContext context, String tex)? codeBuilder, | ||
| 185 | ); | 192 | ); |
| 186 | } | 193 | } |
| 187 | 194 | ||
| @@ -198,6 +205,7 @@ class HTag extends BlockMd { | @@ -198,6 +205,7 @@ class HTag extends BlockMd { | ||
| 198 | final void Function(String url, String title)? onLinkTab, | 205 | final void Function(String url, String title)? onLinkTab, |
| 199 | final String Function(String tex)? latexWorkaround, | 206 | final String Function(String tex)? latexWorkaround, |
| 200 | final Widget Function(BuildContext context, String tex)? latexBuilder, | 207 | final Widget Function(BuildContext context, String tex)? latexBuilder, |
| 208 | + final Widget Function(BuildContext context, String tex)? codeBuilder, | ||
| 201 | ) { | 209 | ) { |
| 202 | var match = exp.firstMatch(text.trim()); | 210 | var match = exp.firstMatch(text.trim()); |
| 203 | return Text.rich( | 211 | return Text.rich( |
| @@ -207,35 +215,18 @@ class HTag extends BlockMd { | @@ -207,35 +215,18 @@ class HTag extends BlockMd { | ||
| 207 | context, | 215 | context, |
| 208 | "${match?[2]}", | 216 | "${match?[2]}", |
| 209 | [ | 217 | [ |
| 210 | - Theme.of(context) | ||
| 211 | - .textTheme | ||
| 212 | - .headlineLarge | ||
| 213 | - ?.copyWith(color: style?.color), | ||
| 214 | - Theme.of(context) | ||
| 215 | - .textTheme | ||
| 216 | - .headlineMedium | ||
| 217 | - ?.copyWith(color: style?.color), | ||
| 218 | - Theme.of(context) | ||
| 219 | - .textTheme | ||
| 220 | - .headlineSmall | ||
| 221 | - ?.copyWith(color: style?.color), | ||
| 222 | - Theme.of(context) | ||
| 223 | - .textTheme | ||
| 224 | - .titleLarge | ||
| 225 | - ?.copyWith(color: style?.color), | ||
| 226 | - Theme.of(context) | ||
| 227 | - .textTheme | ||
| 228 | - .titleMedium | ||
| 229 | - ?.copyWith(color: style?.color), | ||
| 230 | - Theme.of(context) | ||
| 231 | - .textTheme | ||
| 232 | - .titleSmall | ||
| 233 | - ?.copyWith(color: style?.color), | 218 | + Theme.of(context).textTheme.headlineLarge?.copyWith(color: style?.color), |
| 219 | + Theme.of(context).textTheme.headlineMedium?.copyWith(color: style?.color), | ||
| 220 | + Theme.of(context).textTheme.headlineSmall?.copyWith(color: style?.color), | ||
| 221 | + Theme.of(context).textTheme.titleLarge?.copyWith(color: style?.color), | ||
| 222 | + Theme.of(context).textTheme.titleMedium?.copyWith(color: style?.color), | ||
| 223 | + Theme.of(context).textTheme.titleSmall?.copyWith(color: style?.color), | ||
| 234 | ][match![1]!.length - 1], | 224 | ][match![1]!.length - 1], |
| 235 | textDirection, | 225 | textDirection, |
| 236 | (url, title) {}, | 226 | (url, title) {}, |
| 237 | latexWorkaround, | 227 | latexWorkaround, |
| 238 | latexBuilder, | 228 | latexBuilder, |
| 229 | + codeBuilder, | ||
| 239 | )), | 230 | )), |
| 240 | if (match[1]!.length == 1) ...[ | 231 | if (match[1]!.length == 1) ...[ |
| 241 | const TextSpan( | 232 | const TextSpan( |
| @@ -268,6 +259,7 @@ class NewLines extends InlineMd { | @@ -268,6 +259,7 @@ class NewLines extends InlineMd { | ||
| 268 | final void Function(String url, String title)? onLinkTab, | 259 | final void Function(String url, String title)? onLinkTab, |
| 269 | final String Function(String tex)? latexWorkaround, | 260 | final String Function(String tex)? latexWorkaround, |
| 270 | final Widget Function(BuildContext context, String tex)? latexBuilder, | 261 | final Widget Function(BuildContext context, String tex)? latexBuilder, |
| 262 | + final Widget Function(BuildContext context, String tex)? codeBuilder, | ||
| 271 | ) { | 263 | ) { |
| 272 | return TextSpan( | 264 | return TextSpan( |
| 273 | text: "\n\n\n\n", | 265 | text: "\n\n\n\n", |
| @@ -292,6 +284,7 @@ class HrLine extends BlockMd { | @@ -292,6 +284,7 @@ class HrLine extends BlockMd { | ||
| 292 | final void Function(String url, String title)? onLinkTab, | 284 | final void Function(String url, String title)? onLinkTab, |
| 293 | final String Function(String tex)? latexWorkaround, | 285 | final String Function(String tex)? latexWorkaround, |
| 294 | final Widget Function(BuildContext context, String tex)? latexBuilder, | 286 | final Widget Function(BuildContext context, String tex)? latexBuilder, |
| 287 | + final Widget Function(BuildContext context, String tex)? codeBuilder, | ||
| 295 | ) { | 288 | ) { |
| 296 | return CustomDivider( | 289 | return CustomDivider( |
| 297 | height: 2, | 290 | height: 2, |
| @@ -315,6 +308,7 @@ class CheckBoxMd extends BlockMd { | @@ -315,6 +308,7 @@ class CheckBoxMd extends BlockMd { | ||
| 315 | final void Function(String url, String title)? onLinkTab, | 308 | final void Function(String url, String title)? onLinkTab, |
| 316 | final String Function(String tex)? latexWorkaround, | 309 | final String Function(String tex)? latexWorkaround, |
| 317 | final Widget Function(BuildContext context, String tex)? latexBuilder, | 310 | final Widget Function(BuildContext context, String tex)? latexBuilder, |
| 311 | + final Widget Function(BuildContext context, String tex)? codeBuilder, | ||
| 318 | ) { | 312 | ) { |
| 319 | var match = exp.firstMatch(text.trim()); | 313 | var match = exp.firstMatch(text.trim()); |
| 320 | return CustomCb( | 314 | return CustomCb( |
| @@ -347,6 +341,7 @@ class RadioButtonMd extends BlockMd { | @@ -347,6 +341,7 @@ class RadioButtonMd extends BlockMd { | ||
| 347 | final void Function(String url, String title)? onLinkTab, | 341 | final void Function(String url, String title)? onLinkTab, |
| 348 | final String Function(String tex)? latexWorkaround, | 342 | final String Function(String tex)? latexWorkaround, |
| 349 | final Widget Function(BuildContext context, String tex)? latexBuilder, | 343 | final Widget Function(BuildContext context, String tex)? latexBuilder, |
| 344 | + final Widget Function(BuildContext context, String tex)? codeBuilder, | ||
| 350 | ) { | 345 | ) { |
| 351 | var match = exp.firstMatch(text.trim()); | 346 | var match = exp.firstMatch(text.trim()); |
| 352 | return CustomRb( | 347 | return CustomRb( |
| @@ -379,6 +374,7 @@ class IndentMd extends BlockMd { | @@ -379,6 +374,7 @@ class IndentMd extends BlockMd { | ||
| 379 | final void Function(String url, String title)? onLinkTab, | 374 | final void Function(String url, String title)? onLinkTab, |
| 380 | final String Function(String tex)? latexWorkaround, | 375 | final String Function(String tex)? latexWorkaround, |
| 381 | final Widget Function(BuildContext context, String tex)? latexBuilder, | 376 | final Widget Function(BuildContext context, String tex)? latexBuilder, |
| 377 | + final Widget Function(BuildContext context, String tex)? codeBuilder, | ||
| 382 | ) { | 378 | ) { |
| 383 | [ | 379 | [ |
| 384 | r"\\\[(.*?)\\\]", | 380 | r"\\\[(.*?)\\\]", |
| @@ -394,8 +390,7 @@ class IndentMd extends BlockMd { | @@ -394,8 +390,7 @@ class IndentMd extends BlockMd { | ||
| 394 | textDirection: textDirection, | 390 | textDirection: textDirection, |
| 395 | child: RichText( | 391 | child: RichText( |
| 396 | text: TextSpan( | 392 | text: TextSpan( |
| 397 | - children: MarkdownComponent.generate(context, "${match?[2]}", style, | ||
| 398 | - textDirection, onLinkTab, latexWorkaround, latexBuilder), | 393 | + children: MarkdownComponent.generate(context, "${match?[2]}", style, textDirection, onLinkTab, latexWorkaround, latexBuilder, codeBuilder), |
| 399 | )), | 394 | )), |
| 400 | ); | 395 | ); |
| 401 | } | 396 | } |
| @@ -416,6 +411,7 @@ class UnOrderedList extends BlockMd { | @@ -416,6 +411,7 @@ class UnOrderedList extends BlockMd { | ||
| 416 | final void Function(String url, String title)? onLinkTab, | 411 | final void Function(String url, String title)? onLinkTab, |
| 417 | final String Function(String tex)? latexWorkaround, | 412 | final String Function(String tex)? latexWorkaround, |
| 418 | final Widget Function(BuildContext context, String tex)? latexBuilder, | 413 | final Widget Function(BuildContext context, String tex)? latexBuilder, |
| 414 | + final Widget Function(BuildContext context, String tex)? codeBuilder, | ||
| 419 | ) { | 415 | ) { |
| 420 | var match = exp.firstMatch(text); | 416 | var match = exp.firstMatch(text); |
| 421 | return UnorderedListView( | 417 | return UnorderedListView( |
| @@ -451,6 +447,7 @@ class OrderedList extends BlockMd { | @@ -451,6 +447,7 @@ class OrderedList extends BlockMd { | ||
| 451 | final void Function(String url, String title)? onLinkTab, | 447 | final void Function(String url, String title)? onLinkTab, |
| 452 | final String Function(String tex)? latexWorkaround, | 448 | final String Function(String tex)? latexWorkaround, |
| 453 | final Widget Function(BuildContext context, String tex)? latexBuilder, | 449 | final Widget Function(BuildContext context, String tex)? latexBuilder, |
| 450 | + final Widget Function(BuildContext context, String tex)? codeBuilder, | ||
| 454 | ) { | 451 | ) { |
| 455 | var match = exp.firstMatch(text.trim()); | 452 | var match = exp.firstMatch(text.trim()); |
| 456 | return OrderedListView( | 453 | return OrderedListView( |
| @@ -482,6 +479,7 @@ class HighlightedText extends InlineMd { | @@ -482,6 +479,7 @@ class HighlightedText extends InlineMd { | ||
| 482 | final void Function(String url, String title)? onLinkTab, | 479 | final void Function(String url, String title)? onLinkTab, |
| 483 | final String Function(String tex)? latexWorkaround, | 480 | final String Function(String tex)? latexWorkaround, |
| 484 | final Widget Function(BuildContext context, String tex)? latexBuilder, | 481 | final Widget Function(BuildContext context, String tex)? latexBuilder, |
| 482 | + final Widget Function(BuildContext context, String tex)? codeBuilder, | ||
| 485 | ) { | 483 | ) { |
| 486 | return TextSpan( | 484 | return TextSpan( |
| 487 | text: text, | 485 | text: text, |
| @@ -517,21 +515,21 @@ class BoldMd extends InlineMd { | @@ -517,21 +515,21 @@ class BoldMd extends InlineMd { | ||
| 517 | final void Function(String url, String title)? onLinkTab, | 515 | final void Function(String url, String title)? onLinkTab, |
| 518 | final String Function(String tex)? latexWorkaround, | 516 | final String Function(String tex)? latexWorkaround, |
| 519 | final Widget Function(BuildContext context, String tex)? latexBuilder, | 517 | final Widget Function(BuildContext context, String tex)? latexBuilder, |
| 518 | + final Widget Function(BuildContext context, String tex)? codeBuilder, | ||
| 520 | ) { | 519 | ) { |
| 521 | var match = exp.firstMatch(text.trim()); | 520 | var match = exp.firstMatch(text.trim()); |
| 522 | return TextSpan( | 521 | return TextSpan( |
| 523 | children: MarkdownComponent.generate( | 522 | children: MarkdownComponent.generate( |
| 524 | context, | 523 | context, |
| 525 | "${match?[1]}", | 524 | "${match?[1]}", |
| 526 | - style?.copyWith(fontWeight: FontWeight.bold) ?? | ||
| 527 | - const TextStyle(fontWeight: FontWeight.w900), | 525 | + style?.copyWith(fontWeight: FontWeight.bold) ?? const TextStyle(fontWeight: FontWeight.w900), |
| 528 | textDirection, | 526 | textDirection, |
| 529 | onLinkTab, | 527 | onLinkTab, |
| 530 | latexWorkaround, | 528 | latexWorkaround, |
| 531 | latexBuilder, | 529 | latexBuilder, |
| 530 | + codeBuilder, | ||
| 532 | ), | 531 | ), |
| 533 | - style: style?.copyWith(fontWeight: FontWeight.bold) ?? | ||
| 534 | - const TextStyle(fontWeight: FontWeight.bold), | 532 | + style: style?.copyWith(fontWeight: FontWeight.bold) ?? const TextStyle(fontWeight: FontWeight.bold), |
| 535 | ); | 533 | ); |
| 536 | } | 534 | } |
| 537 | } | 535 | } |
| @@ -552,6 +550,7 @@ class LatexMathMultyLine extends BlockMd { | @@ -552,6 +550,7 @@ class LatexMathMultyLine extends BlockMd { | ||
| 552 | void Function(String url, String title)? onLinkTab, | 550 | void Function(String url, String title)? onLinkTab, |
| 553 | String Function(String tex)? latexWorkaround, | 551 | String Function(String tex)? latexWorkaround, |
| 554 | Widget Function(BuildContext context, String tex)? latexBuilder, | 552 | Widget Function(BuildContext context, String tex)? latexBuilder, |
| 553 | + Widget Function(BuildContext context, String tex)? codeBuilder, | ||
| 555 | ) { | 554 | ) { |
| 556 | var p0 = exp.firstMatch(text.trim()); | 555 | var p0 = exp.firstMatch(text.trim()); |
| 557 | p0?.group(0); | 556 | p0?.group(0); |
| @@ -572,8 +571,7 @@ class LatexMathMultyLine extends BlockMd { | @@ -572,8 +571,7 @@ class LatexMathMultyLine extends BlockMd { | ||
| 572 | options: MathOptions( | 571 | options: MathOptions( |
| 573 | sizeUnderTextStyle: MathSize.large, | 572 | sizeUnderTextStyle: MathSize.large, |
| 574 | color: style?.color ?? Theme.of(context).colorScheme.onSurface, | 573 | color: style?.color ?? Theme.of(context).colorScheme.onSurface, |
| 575 | - fontSize: style?.fontSize ?? | ||
| 576 | - Theme.of(context).textTheme.bodyMedium?.fontSize, | 574 | + fontSize: style?.fontSize ?? Theme.of(context).textTheme.bodyMedium?.fontSize, |
| 577 | mathFontOptions: FontOptions( | 575 | mathFontOptions: FontOptions( |
| 578 | fontFamily: "Main", | 576 | fontFamily: "Main", |
| 579 | fontWeight: style?.fontWeight ?? FontWeight.normal, | 577 | fontWeight: style?.fontWeight ?? FontWeight.normal, |
| @@ -590,9 +588,7 @@ class LatexMathMultyLine extends BlockMd { | @@ -590,9 +588,7 @@ class LatexMathMultyLine extends BlockMd { | ||
| 590 | return Text( | 588 | return Text( |
| 591 | workaround(mathText), | 589 | workaround(mathText), |
| 592 | textDirection: textDirection, | 590 | textDirection: textDirection, |
| 593 | - style: style?.copyWith( | ||
| 594 | - color: Theme.of(context).colorScheme.error) ?? | ||
| 595 | - TextStyle(color: Theme.of(context).colorScheme.error), | 591 | + style: style?.copyWith(color: Theme.of(context).colorScheme.error) ?? TextStyle(color: Theme.of(context).colorScheme.error), |
| 596 | ); | 592 | ); |
| 597 | }, | 593 | }, |
| 598 | ); | 594 | ); |
| @@ -620,6 +616,7 @@ class LatexMath extends InlineMd { | @@ -620,6 +616,7 @@ class LatexMath extends InlineMd { | ||
| 620 | final void Function(String url, String title)? onLinkTab, | 616 | final void Function(String url, String title)? onLinkTab, |
| 621 | final String Function(String tex)? latexWorkaround, | 617 | final String Function(String tex)? latexWorkaround, |
| 622 | final Widget Function(BuildContext context, String tex)? latexBuilder, | 618 | final Widget Function(BuildContext context, String tex)? latexBuilder, |
| 619 | + final Widget Function(BuildContext context, String tex)? codeBuilder, | ||
| 623 | ) { | 620 | ) { |
| 624 | var p0 = exp.firstMatch(text.trim()); | 621 | var p0 = exp.firstMatch(text.trim()); |
| 625 | p0?.group(0); | 622 | p0?.group(0); |
| @@ -641,8 +638,7 @@ class LatexMath extends InlineMd { | @@ -641,8 +638,7 @@ class LatexMath extends InlineMd { | ||
| 641 | options: MathOptions( | 638 | options: MathOptions( |
| 642 | sizeUnderTextStyle: MathSize.large, | 639 | sizeUnderTextStyle: MathSize.large, |
| 643 | color: style?.color ?? Theme.of(context).colorScheme.onSurface, | 640 | color: style?.color ?? Theme.of(context).colorScheme.onSurface, |
| 644 | - fontSize: style?.fontSize ?? | ||
| 645 | - Theme.of(context).textTheme.bodyMedium?.fontSize, | 641 | + fontSize: style?.fontSize ?? Theme.of(context).textTheme.bodyMedium?.fontSize, |
| 646 | mathFontOptions: FontOptions( | 642 | mathFontOptions: FontOptions( |
| 647 | fontFamily: "Main", | 643 | fontFamily: "Main", |
| 648 | fontWeight: style?.fontWeight ?? FontWeight.normal, | 644 | fontWeight: style?.fontWeight ?? FontWeight.normal, |
| @@ -659,9 +655,7 @@ class LatexMath extends InlineMd { | @@ -659,9 +655,7 @@ class LatexMath extends InlineMd { | ||
| 659 | return Text( | 655 | return Text( |
| 660 | workaround(mathText), | 656 | workaround(mathText), |
| 661 | textDirection: textDirection, | 657 | textDirection: textDirection, |
| 662 | - style: | ||
| 663 | - style?.copyWith(color: Theme.of(context).colorScheme.error) ?? | ||
| 664 | - TextStyle(color: Theme.of(context).colorScheme.error), | 658 | + style: style?.copyWith(color: Theme.of(context).colorScheme.error) ?? TextStyle(color: Theme.of(context).colorScheme.error), |
| 665 | ); | 659 | ); |
| 666 | }, | 660 | }, |
| 667 | ), | 661 | ), |
| @@ -683,6 +677,7 @@ class ItalicMd extends InlineMd { | @@ -683,6 +677,7 @@ class ItalicMd extends InlineMd { | ||
| 683 | final void Function(String url, String title)? onLinkTab, | 677 | final void Function(String url, String title)? onLinkTab, |
| 684 | final String Function(String tex)? latexWorkaround, | 678 | final String Function(String tex)? latexWorkaround, |
| 685 | final Widget Function(BuildContext context, String tex)? latexBuilder, | 679 | final Widget Function(BuildContext context, String tex)? latexBuilder, |
| 680 | + final Widget Function(BuildContext context, String tex)? codeBuilder, | ||
| 686 | ) { | 681 | ) { |
| 687 | var match = exp.firstMatch(text.trim()); | 682 | var match = exp.firstMatch(text.trim()); |
| 688 | return TextSpan( | 683 | return TextSpan( |
| @@ -694,6 +689,7 @@ class ItalicMd extends InlineMd { | @@ -694,6 +689,7 @@ class ItalicMd extends InlineMd { | ||
| 694 | onLinkTab, | 689 | onLinkTab, |
| 695 | latexWorkaround, | 690 | latexWorkaround, |
| 696 | latexBuilder, | 691 | latexBuilder, |
| 692 | + codeBuilder, | ||
| 697 | ), | 693 | ), |
| 698 | style: (style ?? const TextStyle()).copyWith(fontStyle: FontStyle.italic), | 694 | style: (style ?? const TextStyle()).copyWith(fontStyle: FontStyle.italic), |
| 699 | ); | 695 | ); |
| @@ -714,6 +710,7 @@ class ATagMd extends InlineMd { | @@ -714,6 +710,7 @@ class ATagMd extends InlineMd { | ||
| 714 | final void Function(String url, String title)? onLinkTab, | 710 | final void Function(String url, String title)? onLinkTab, |
| 715 | final String Function(String tex)? latexWorkaround, | 711 | final String Function(String tex)? latexWorkaround, |
| 716 | final Widget Function(BuildContext context, String tex)? latexBuilder, | 712 | final Widget Function(BuildContext context, String tex)? latexBuilder, |
| 713 | + final Widget Function(BuildContext context, String tex)? codeBuilder, | ||
| 717 | ) { | 714 | ) { |
| 718 | var match = exp.firstMatch(text.trim()); | 715 | var match = exp.firstMatch(text.trim()); |
| 719 | if (match?[1] == null && match?[2] == null) { | 716 | if (match?[1] == null && match?[2] == null) { |
| @@ -759,13 +756,13 @@ class ImageMd extends InlineMd { | @@ -759,13 +756,13 @@ class ImageMd extends InlineMd { | ||
| 759 | final void Function(String url, String title)? onLinkTab, | 756 | final void Function(String url, String title)? onLinkTab, |
| 760 | final String Function(String tex)? latexWorkaround, | 757 | final String Function(String tex)? latexWorkaround, |
| 761 | final Widget Function(BuildContext context, String tex)? latexBuilder, | 758 | final Widget Function(BuildContext context, String tex)? latexBuilder, |
| 759 | + final Widget Function(BuildContext context, String tex)? codeBuilder, | ||
| 762 | ) { | 760 | ) { |
| 763 | var match = exp.firstMatch(text.trim()); | 761 | var match = exp.firstMatch(text.trim()); |
| 764 | double? height; | 762 | double? height; |
| 765 | double? width; | 763 | double? width; |
| 766 | if (match?[1] != null) { | 764 | if (match?[1] != null) { |
| 767 | - var size = RegExp(r"^([0-9]+)?x?([0-9]+)?") | ||
| 768 | - .firstMatch(match![1].toString().trim()); | 765 | + var size = RegExp(r"^([0-9]+)?x?([0-9]+)?").firstMatch(match![1].toString().trim()); |
| 769 | width = double.tryParse(size?[1]?.toString().trim() ?? 'a'); | 766 | width = double.tryParse(size?[1]?.toString().trim() ?? 'a'); |
| 770 | height = double.tryParse(size?[2]?.toString().trim() ?? 'a'); | 767 | height = double.tryParse(size?[2]?.toString().trim() ?? 'a'); |
| 771 | } | 768 | } |
| @@ -778,16 +775,12 @@ class ImageMd extends InlineMd { | @@ -778,16 +775,12 @@ class ImageMd extends InlineMd { | ||
| 778 | image: NetworkImage( | 775 | image: NetworkImage( |
| 779 | "${match?[2]}", | 776 | "${match?[2]}", |
| 780 | ), | 777 | ), |
| 781 | - loadingBuilder: (BuildContext context, Widget child, | ||
| 782 | - ImageChunkEvent? loadingProgress) { | 778 | + loadingBuilder: (BuildContext context, Widget child, ImageChunkEvent? loadingProgress) { |
| 783 | if (loadingProgress == null) { | 779 | if (loadingProgress == null) { |
| 784 | return child; | 780 | return child; |
| 785 | } | 781 | } |
| 786 | return CustomImageLoading( | 782 | return CustomImageLoading( |
| 787 | - progress: loadingProgress.expectedTotalBytes != null | ||
| 788 | - ? loadingProgress.cumulativeBytesLoaded / | ||
| 789 | - loadingProgress.expectedTotalBytes! | ||
| 790 | - : 1, | 783 | + progress: loadingProgress.expectedTotalBytes != null ? loadingProgress.cumulativeBytesLoaded / loadingProgress.expectedTotalBytes! : 1, |
| 791 | ); | 784 | ); |
| 792 | }, | 785 | }, |
| 793 | fit: BoxFit.fill, | 786 | fit: BoxFit.fill, |
| @@ -811,15 +804,12 @@ class TableMd extends BlockMd { | @@ -811,15 +804,12 @@ class TableMd extends BlockMd { | ||
| 811 | void Function(String url, String title)? onLinkTab, | 804 | void Function(String url, String title)? onLinkTab, |
| 812 | final String Function(String tex)? latexWorkaround, | 805 | final String Function(String tex)? latexWorkaround, |
| 813 | final Widget Function(BuildContext context, String tex)? latexBuilder, | 806 | final Widget Function(BuildContext context, String tex)? latexBuilder, |
| 807 | + final Widget Function(BuildContext context, String tex)? codeBuilder, | ||
| 814 | ) { | 808 | ) { |
| 815 | final List<Map<int, String>> value = text | 809 | final List<Map<int, String>> value = text |
| 816 | .split('\n') | 810 | .split('\n') |
| 817 | .map<Map<int, String>>( | 811 | .map<Map<int, String>>( |
| 818 | - (e) => e | ||
| 819 | - .split('|') | ||
| 820 | - .where((element) => element.isNotEmpty) | ||
| 821 | - .toList() | ||
| 822 | - .asMap(), | 812 | + (e) => e.split('|').where((element) => element.isNotEmpty).toList().asMap(), |
| 823 | ) | 813 | ) |
| 824 | .toList(); | 814 | .toList(); |
| 825 | bool heading = RegExp( | 815 | bool heading = RegExp( |
| @@ -850,9 +840,7 @@ class TableMd extends BlockMd { | @@ -850,9 +840,7 @@ class TableMd extends BlockMd { | ||
| 850 | (entry) => TableRow( | 840 | (entry) => TableRow( |
| 851 | decoration: (heading) | 841 | decoration: (heading) |
| 852 | ? BoxDecoration( | 842 | ? BoxDecoration( |
| 853 | - color: (entry.key == 0) | ||
| 854 | - ? Theme.of(context).colorScheme.surfaceVariant | ||
| 855 | - : null, | 843 | + color: (entry.key == 0) ? Theme.of(context).colorScheme.surfaceVariant : null, |
| 856 | ) | 844 | ) |
| 857 | : null, | 845 | : null, |
| 858 | children: List.generate( | 846 | children: List.generate( |
| @@ -860,15 +848,13 @@ class TableMd extends BlockMd { | @@ -860,15 +848,13 @@ class TableMd extends BlockMd { | ||
| 860 | (index) { | 848 | (index) { |
| 861 | var e = entry.value; | 849 | var e = entry.value; |
| 862 | String data = e[index] ?? ""; | 850 | String data = e[index] ?? ""; |
| 863 | - if (RegExp(r"^--+$").hasMatch(data.trim()) || | ||
| 864 | - data.trim().isEmpty) { | 851 | + if (RegExp(r"^--+$").hasMatch(data.trim()) || data.trim().isEmpty) { |
| 865 | return const SizedBox(); | 852 | return const SizedBox(); |
| 866 | } | 853 | } |
| 867 | 854 | ||
| 868 | return Center( | 855 | return Center( |
| 869 | child: Padding( | 856 | child: Padding( |
| 870 | - padding: const EdgeInsets.symmetric( | ||
| 871 | - horizontal: 8, vertical: 4), | 857 | + padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4), |
| 872 | child: MdWidget( | 858 | child: MdWidget( |
| 873 | (e[index] ?? "").trim(), | 859 | (e[index] ?? "").trim(), |
| 874 | textDirection: textDirection, | 860 | textDirection: textDirection, |
| @@ -909,13 +895,14 @@ class CodeBlockMd extends BlockMd { | @@ -909,13 +895,14 @@ class CodeBlockMd extends BlockMd { | ||
| 909 | final void Function(String url, String title)? onLinkTab, | 895 | final void Function(String url, String title)? onLinkTab, |
| 910 | final String Function(String tex)? latexWorkaround, | 896 | final String Function(String tex)? latexWorkaround, |
| 911 | final Widget Function(BuildContext context, String tex)? latexBuilder, | 897 | final Widget Function(BuildContext context, String tex)? latexBuilder, |
| 898 | + final Widget Function(BuildContext context, String tex)? codeBuilder, | ||
| 912 | ) { | 899 | ) { |
| 913 | String codes = exp.firstMatch(text)?[2] ?? ""; | 900 | String codes = exp.firstMatch(text)?[2] ?? ""; |
| 914 | String name = exp.firstMatch(text)?[1] ?? ""; | 901 | String name = exp.firstMatch(text)?[1] ?? ""; |
| 915 | codes = codes.replaceAll(r"```", "").trim(); | 902 | codes = codes.replaceAll(r"```", "").trim(); |
| 916 | return Padding( | 903 | return Padding( |
| 917 | padding: const EdgeInsets.all(16.0), | 904 | padding: const EdgeInsets.all(16.0), |
| 918 | - child: CodeField(name: name, codes: codes), | 905 | + child: codeBuilder != null ? codeBuilder(context, codes) : CodeField(name: name, codes: codes), |
| 919 | ); | 906 | ); |
| 920 | } | 907 | } |
| 921 | } | 908 | } |
| @@ -944,8 +931,7 @@ class _CodeFieldState extends State<CodeField> { | @@ -944,8 +931,7 @@ class _CodeFieldState extends State<CodeField> { | ||
| 944 | Row( | 931 | Row( |
| 945 | children: [ | 932 | children: [ |
| 946 | Padding( | 933 | Padding( |
| 947 | - padding: | ||
| 948 | - const EdgeInsets.symmetric(horizontal: 16.0, vertical: 8), | 934 | + padding: const EdgeInsets.symmetric(horizontal: 16.0, vertical: 8), |
| 949 | child: Text(widget.name), | 935 | child: Text(widget.name), |
| 950 | ), | 936 | ), |
| 951 | const Spacer(), | 937 | const Spacer(), |
| @@ -957,8 +943,7 @@ class _CodeFieldState extends State<CodeField> { | @@ -957,8 +943,7 @@ class _CodeFieldState extends State<CodeField> { | ||
| 957 | ), | 943 | ), |
| 958 | ), | 944 | ), |
| 959 | onPressed: () async { | 945 | onPressed: () async { |
| 960 | - await Clipboard.setData(ClipboardData(text: widget.codes)) | ||
| 961 | - .then((value) { | 946 | + await Clipboard.setData(ClipboardData(text: widget.codes)).then((value) { |
| 962 | setState(() { | 947 | setState(() { |
| 963 | _copied = true; | 948 | _copied = true; |
| 964 | }); | 949 | }); |
| @@ -5,16 +5,19 @@ import 'package:gpt_markdown/markdown_component.dart'; | @@ -5,16 +5,19 @@ import 'package:gpt_markdown/markdown_component.dart'; | ||
| 5 | 5 | ||
| 6 | /// It creates a markdown widget closed to each other. | 6 | /// It creates a markdown widget closed to each other. |
| 7 | class MdWidget extends StatelessWidget { | 7 | class MdWidget extends StatelessWidget { |
| 8 | - const MdWidget(this.exp, | ||
| 9 | - {super.key, | ||
| 10 | - this.style, | ||
| 11 | - this.textDirection = TextDirection.ltr, | ||
| 12 | - this.onLinkTab, | ||
| 13 | - this.textAlign, | ||
| 14 | - this.textScaleFactor, | ||
| 15 | - this.latexWorkaround, | ||
| 16 | - this.latexBuilder, | ||
| 17 | - this.followLinkColor = false}); | 8 | + const MdWidget( |
| 9 | + this.exp, { | ||
| 10 | + super.key, | ||
| 11 | + this.style, | ||
| 12 | + this.textDirection = TextDirection.ltr, | ||
| 13 | + this.onLinkTab, | ||
| 14 | + this.textAlign, | ||
| 15 | + this.textScaleFactor, | ||
| 16 | + this.latexWorkaround, | ||
| 17 | + this.latexBuilder, | ||
| 18 | + this.followLinkColor = false, | ||
| 19 | + this.codeBuilder, | ||
| 20 | + }); | ||
| 18 | final String exp; | 21 | final String exp; |
| 19 | final TextDirection textDirection; | 22 | final TextDirection textDirection; |
| 20 | final TextStyle? style; | 23 | final TextStyle? style; |
| @@ -24,6 +27,7 @@ class MdWidget extends StatelessWidget { | @@ -24,6 +27,7 @@ class MdWidget extends StatelessWidget { | ||
| 24 | final String Function(String tex)? latexWorkaround; | 27 | final String Function(String tex)? latexWorkaround; |
| 25 | final Widget Function(BuildContext context, String tex)? latexBuilder; | 28 | final Widget Function(BuildContext context, String tex)? latexBuilder; |
| 26 | final bool followLinkColor; | 29 | final bool followLinkColor; |
| 30 | + final Widget Function(BuildContext context, String tex)? codeBuilder; | ||
| 27 | 31 | ||
| 28 | @override | 32 | @override |
| 29 | Widget build(BuildContext context) { | 33 | Widget build(BuildContext context) { |
| @@ -46,6 +50,7 @@ class MdWidget extends StatelessWidget { | @@ -46,6 +50,7 @@ class MdWidget extends StatelessWidget { | ||
| 46 | onLinkTab, | 50 | onLinkTab, |
| 47 | latexWorkaround, | 51 | latexWorkaround, |
| 48 | latexBuilder, | 52 | latexBuilder, |
| 53 | + codeBuilder, | ||
| 49 | ), | 54 | ), |
| 50 | ); | 55 | ); |
| 51 | return Text.rich( | 56 | return Text.rich( |
-
Please register or login to post a comment