Browse Source

不要高亮了

master
hejl 2 months ago
parent
commit
371a3a052d
  1. 106
      win_text_editor/lib/app/widgets/text_tab.dart
  2. 16
      win_text_editor/pubspec.lock
  3. 3
      win_text_editor/pubspec.yaml

106
win_text_editor/lib/app/widgets/text_tab.dart

@ -6,9 +6,6 @@ import 'package:flutter/services.dart'; // 复制功能需要
import 'package:win_text_editor/app/providers/editor_provider.dart'; import 'package:win_text_editor/app/providers/editor_provider.dart';
import 'package:file_picker/file_picker.dart'; import 'package:file_picker/file_picker.dart';
import 'dart:io'; import 'dart:io';
import 'package:flutter_highlight/flutter_highlight.dart';
import 'package:flutter_highlight/themes/github.dart';
import 'package:flutter_highlight/themes/monokai-sublime.dart';
class TextTab extends StatefulWidget { class TextTab extends StatefulWidget {
final String tabId; final String tabId;
@ -24,74 +21,29 @@ class _TextTabState extends State<TextTab> {
late EditorProvider _provider; late EditorProvider _provider;
late FocusNode _focusNode; late FocusNode _focusNode;
late ScrollController _scrollController; late ScrollController _scrollController;
String _language = 'plaintext';
@override
@override @override
void initState() { void initState() {
super.initState(); super.initState();
_provider = Provider.of<EditorProvider>(context, listen: false); _provider = Provider.of<EditorProvider>(context, listen: false);
_controller = TextEditingController(text: _getCurrentContent()); _controller = TextEditingController(text: _getCurrentContent());
_focusNode = FocusNode(); _focusNode = FocusNode();
_scrollController = ScrollController(); // _scrollController = ScrollController();
_detectLanguage(); WidgetsBinding.instance.addPostFrameCallback((_) {
FocusScope.of(context).requestFocus(_focusNode);
});
} }
String _getCurrentContent() { String _getCurrentContent() {
return _provider.tabs.firstWhere((t) => t.id == widget.tabId).content; return _provider.tabs.firstWhere((t) => t.id == widget.tabId).content;
} }
void _detectLanguage() {
final tab = _provider.tabs.firstWhere((t) => t.id == widget.tabId);
final fileName = tab.title.toLowerCase();
final content = tab.content.trim();
if (fileName.endsWith('.dart')) {
_language = 'dart';
} else if (fileName.endsWith('.java')) {
_language = 'java';
} else if (fileName.endsWith('.py')) {
_language = 'python';
} else if (fileName.endsWith('.js')) {
_language = 'javascript';
} else if (fileName.endsWith('.html')) {
_language = 'html';
} else if (fileName.endsWith('.css')) {
_language = 'css';
} else if (fileName.endsWith('.json')) {
_language = 'json';
} else if (fileName.endsWith('.yaml') || fileName.endsWith('.yml')) {
_language = 'yaml';
} else if (fileName.endsWith('.xml')) {
_language = 'xml';
}
//
else if (_isLikelyXml(content)) {
_language = 'xml';
} else {
_language = 'plaintext';
}
}
bool _isLikelyXml(String content) {
if (content.isEmpty) return false;
// '<''>'
final trimmed = content.trim();
if (!trimmed.startsWith('<') || !trimmed.endsWith('>')) {
return false;
}
// XML标签模式
final xmlTagRegex = RegExp(r'<[^/>]+>.*<\/[^>]+>|<[^/>]+\/>');
return xmlTagRegex.hasMatch(content);
}
@override @override
void didUpdateWidget(TextTab oldWidget) { void didUpdateWidget(TextTab oldWidget) {
super.didUpdateWidget(oldWidget); super.didUpdateWidget(oldWidget);
if (oldWidget.tabId != widget.tabId) { if (oldWidget.tabId != widget.tabId) {
_controller.text = _getCurrentContent(); _controller.text = _getCurrentContent();
_detectLanguage();
} }
} }
@ -106,7 +58,6 @@ class _TextTabState extends State<TextTab> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final tab = _provider.tabs.firstWhere((t) => t.id == widget.tabId); final tab = _provider.tabs.firstWhere((t) => t.id == widget.tabId);
final isDarkMode = Theme.of(context).brightness == Brightness.dark;
return Column( return Column(
children: [ children: [
@ -142,31 +93,6 @@ class _TextTabState extends State<TextTab> {
tooltip: '保存到文件', tooltip: '保存到文件',
onPressed: tab.content.isEmpty ? null : () => _saveFile(context, tab.content), onPressed: tab.content.isEmpty ? null : () => _saveFile(context, tab.content),
), ),
DropdownButton<String>(
value: _language,
icon: const Icon(Icons.code, size: 20),
underline: Container(),
onChanged: (String? newValue) {
setState(() {
_language = newValue!;
});
},
items:
<String>[
'xml',
'plaintext',
'dart',
'java',
'python',
'javascript',
'html',
'css',
'json',
'yaml',
].map<DropdownMenuItem<String>>((String value) {
return DropdownMenuItem<String>(value: value, child: Text(value));
}).toList(),
),
], ],
), ),
], ],
@ -182,31 +108,21 @@ class _TextTabState extends State<TextTab> {
controller: _scrollController, // controller: _scrollController, //
child: Stack( child: Stack(
children: [ children: [
//
HighlightView(
tab.content,
language: _language,
theme: isDarkMode ? monokaiSublimeTheme : githubTheme,
padding: const EdgeInsets.all(16),
textStyle: const TextStyle(fontFamily: 'monospace', fontSize: 14),
),
// TextField // TextField
TextField( TextField(
controller: _controller, controller: _controller,
focusNode: _focusNode, focusNode: _focusNode,
maxLines: null, maxLines: null,
//scrollController: _scrollController, // 使
onChanged: (text) => _provider.updateContent(widget.tabId, text, tab.fileName), onChanged: (text) => _provider.updateContent(widget.tabId, text, tab.fileName),
decoration: const InputDecoration( decoration: const InputDecoration(
border: InputBorder.none, border: InputBorder.none,
contentPadding: EdgeInsets.all(16), contentPadding: EdgeInsets.all(16),
), ),
style: const TextStyle( style: TextStyle(
fontFamily: 'monospace', fontFamily: 'monospace',
fontSize: 14, fontSize: 14,
color: Colors.transparent, color: Theme.of(context).textTheme.bodyLarge?.color, // 使
), ),
cursorColor: Colors.black,
), ),
], ],
), ),
@ -217,7 +133,6 @@ class _TextTabState extends State<TextTab> {
); );
} }
// _openFile方法现在需要更新控制器
Future<void> _openFile(BuildContext context) async { Future<void> _openFile(BuildContext context) async {
try { try {
final result = await FilePicker.platform.pickFiles(type: FileType.any, allowMultiple: false); final result = await FilePicker.platform.pickFiles(type: FileType.any, allowMultiple: false);
@ -226,13 +141,10 @@ class _TextTabState extends State<TextTab> {
final file = File(result.files.single.path!); final file = File(result.files.single.path!);
final content = await file.readAsString(); final content = await file.readAsString();
// provider和控制器
_provider.updateContent(widget.tabId, content, result.files.first.name); _provider.updateContent(widget.tabId, content, result.files.first.name);
setState(() { _controller.text = content; //
_controller.text = content;
_detectLanguage();
});
//
if (context.mounted) { if (context.mounted) {
ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text('已加载: ${file.path}'))); ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text('已加载: ${file.path}')));
} }

16
win_text_editor/pubspec.lock

@ -126,14 +126,6 @@ packages:
description: flutter description: flutter
source: sdk source: sdk
version: "0.0.0" version: "0.0.0"
flutter_highlight:
dependency: "direct main"
description:
name: flutter_highlight
sha256: "7b96333867aa07e122e245c033b8ad622e4e3a42a1a2372cbb098a2541d8782c"
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.7.0"
flutter_lints: flutter_lints:
dependency: "direct dev" dependency: "direct dev"
description: description:
@ -168,14 +160,6 @@ packages:
description: flutter description: flutter
source: sdk source: sdk
version: "0.0.0" version: "0.0.0"
highlight:
dependency: "direct main"
description:
name: highlight
sha256: "5353a83ffe3e3eca7df0abfb72dcf3fa66cc56b953728e7113ad4ad88497cf21"
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.7.0"
leak_tracker: leak_tracker:
dependency: transitive dependency: transitive
description: description:

3
win_text_editor/pubspec.yaml

@ -16,8 +16,7 @@ dependencies:
bitsdojo_window: ^0.1.1+2 bitsdojo_window: ^0.1.1+2
flutter_syntax_view: ^4.1.7 flutter_syntax_view: ^4.1.7
expandable: ^5.0.1 expandable: ^5.0.1
flutter_highlight: ^0.7.0
highlight: ^0.7.0
dev_dependencies: dev_dependencies:

Loading…
Cancel
Save