如何向flutter | 您所在的位置:网站首页 › markdown代码语法高亮 › 如何向flutter |
我刚刚写了一期:) 请查看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 实验室设备网 版权所有 |