如何向flutter 您所在的位置:网站首页 markdown代码语法高亮 如何向flutter

如何向flutter

2024-05-02 18:16| 来源: 网络整理| 查看: 265

我刚刚写了一期:)

请查看Feature: Get Syntax Language when customizing properties syntaxHighlighter #355.

这就是那个问题的内容。

相关问题

问题#227 StackOverflow - How to add code syntax highlighter to flutter markdown

处理语法语言突出显示。

可能的解决方案

这取决于highlight,当然还有flutter_markdown。

首先使用,在将数据传递给Markdown之前使用RegExp获取语法语言。

第二个,用相同的LANG_MARKER标记语言,比如L@NG!。

这是一个示例代码。

代码语言:javascript复制 String parseSyntaxLanguage(String data) { String parsed = data; RegExp codeSign = new RegExp(r'`{3} *'); RegExp pattern = new RegExp(r'`{3} *[\w]+'); for (RegExpMatch match in pattern.allMatches(this.data)) { String lang = match.group(0).split(codeSign)[1]; // get a syntax language parsed = parsed.replaceFirst(match.group(0), '```\n$LANG_MARKER$lang$LANG_MARKER'); } // CAUTION "\n" newline is required! return parsed; }

第三个,使语法高亮扩展了SyntaxHighlighter

这是一个示例代码。

代码语言:javascript复制import 'package:flutter/material.dart'; import 'package:flutter/painting.dart'; import 'package:flutter_markdown/flutter_markdown.dart'; import 'package:highlight/highlight.dart' show highlight, Node; class LangSyntaxHighlighter extends SyntaxHighlighter { final String language; final String _rootKey = 'root'; final String _defaultLang = 'dart'; final String _defaultFontFamily = 'monospace'; final Color _defaultFontColor = Color(0xfffdfeff); final Map theme; // User's code theme LangSyntaxHighlighter(this.theme); @override TextSpan format(String source) { String lang; if (source.startsWith(LANG_MARKER)) { int idx = source.indexOf(LANG_MARKER, LANG_MARKER.length); lang = source.substring(LANG_MARKER.length, idx); source = source.substring(idx + LANG_MARKER.length); } TextStyle _textStyle = TextStyle( fontFamily: this._defaultFontFamily, color: this.theme[this._rootKey].color ?? this._defaultFontColor, ); return TextSpan( style: _textStyle, children: this._convert(highlight .parse(source, autoDetection: true, language: lang ?? this._defaultLang) .nodes), ); } List _convert(List nodes) { List spans = []; var currentSpans = spans; List stack = []; _traverse(Node node) { if (node.value != null) { currentSpans.add(node.className == null ? TextSpan(text: node.value) : TextSpan(text: node.value, style: theme[node.className])); } else if (node.children != null) { List tmp = []; currentSpans.add(TextSpan(children: tmp, style: theme[node.className])); stack.add(currentSpans); currentSpans = tmp; node.children.forEach((n) { _traverse(n); if (n == node.children.last) currentSpans = stack.isEmpty ? spans : stack.removeLast(); }); } } for (var node in nodes) _traverse(node); return spans; } }

最后一个,结合了语法高亮和解析器。

代码语言:javascript复制Widget build(BuildContext context) { Future parseMarkdown = new Future(() { return MarkdownBody( data: parseSyntaxLanguage(this.data), // markdown source syntaxHighlighter: LangSyntaxHighlighter(), styleSheet: MarkdownStyleSheet( ...

我不确定这是否适合功能请求。但是,我希望这个问题能对某些人有所帮助:)



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有