@@ -14,11 +14,38 @@ class EditorParams {
1414}
1515
1616class CodeController extends TextEditingController {
17+ Mode ? _language;
18+
1719 /// A highlight language to parse the text with
18- final Mode ? language;
20+ Mode ? get language => _language;
21+
22+ set language (Mode ? language) {
23+ if (language == _language) {
24+ return ;
25+ }
26+
27+ if (language != null ) {
28+ _languageId = _genId ();
29+ highlight.registerLanguage (_languageId, language);
30+ }
31+
32+ _language = language;
33+ notifyListeners ();
34+ }
35+
36+ Map <String , TextStyle >? _theme;
1937
2038 /// The theme to apply to the [language] parsing result
21- final Map <String , TextStyle >? theme;
39+ Map <String , TextStyle >? get theme => _theme;
40+
41+ set theme (Map <String , TextStyle >? theme) {
42+ if (theme == _theme) {
43+ return ;
44+ }
45+
46+ _theme = theme;
47+ notifyListeners ();
48+ }
2249
2350 /// A map of specific regexes to style
2451 final Map <String , TextStyle >? patternMap;
@@ -43,15 +70,18 @@ class CodeController extends TextEditingController {
4370 final void Function (String )? onChange;
4471
4572 /* Computed members */
46- final String languageId = _genId ();
73+ String _languageId = _genId ();
74+
75+ String get languageId => _languageId;
76+
4777 final styleList = < TextStyle > [];
4878 final modifierMap = < String , CodeModifier > {};
4979 RegExp ? styleRegExp;
5080
5181 CodeController ({
5282 String ? text,
53- this . language,
54- this . theme,
83+ Mode ? language,
84+ Map < String , TextStyle > ? theme,
5585 this .patternMap,
5686 this .stringMap,
5787 this .params = const EditorParams (),
@@ -62,13 +92,10 @@ class CodeController extends TextEditingController {
6292 ],
6393 this .webSpaceFix = true ,
6494 this .onChange,
65- }) : super (text: text) {
66- // PatternMap
67- if (language != null && theme == null ) throw Exception ("A theme must be provided for language parsing" );
68- // Register language
69- if (language != null ) {
70- highlight.registerLanguage (languageId, language! );
71- }
95+ }) : _theme = theme,
96+ super (text: text) {
97+ this .language = language;
98+
7299 // Create modifier map
73100 modifiers.forEach ((el) {
74101 modifierMap[el.char] = el;
@@ -207,7 +234,7 @@ class CodeController extends TextEditingController {
207234
208235 TextSpan _processLanguage (String text, TextStyle ? style) {
209236 final rawText = _webSpaceFix ? _middleDotsToSpaces (text) : text;
210- final result = highlight.parse (rawText, language: languageId );
237+ final result = highlight.parse (rawText, language: _languageId );
211238
212239 final nodes = result.nodes;
213240
@@ -220,14 +247,14 @@ class CodeController extends TextEditingController {
220247 final nodeChildren = node.children;
221248 if (val != null ) {
222249 if (_webSpaceFix) val = _spacesToMiddleDots (val);
223- var child = TextSpan (text: val, style: theme ? [node.className]);
224- if (styleRegExp != null ) child = _processPatterns (val, theme ? [node.className]);
250+ var child = TextSpan (text: val, style: _theme ? [node.className]);
251+ if (styleRegExp != null ) child = _processPatterns (val, _theme ? [node.className]);
225252 currentSpans.add (child);
226253 } else if (nodeChildren != null ) {
227254 List <TextSpan > tmp = [];
228255 currentSpans.add (TextSpan (
229256 children: tmp,
230- style: theme ? [node.className],
257+ style: _theme ? [node.className],
231258 ));
232259 stack.add (currentSpans);
233260 currentSpans = tmp;
@@ -263,7 +290,7 @@ class CodeController extends TextEditingController {
263290 styleRegExp = RegExp (patternList.join ('|' ), multiLine: true );
264291
265292 // Return parsing
266- if (language != null )
293+ if (_language != null && _theme != null )
267294 return _processLanguage (text, style);
268295 else if (styleRegExp != null )
269296 return _processPatterns (text, style);
0 commit comments