Flutter HTML转Quill Delta格式插件flutter_quill_delta_from_html的使用
Flutter HTML转Quill Delta格式插件flutter_quill_delta_from_html的使用
flutter_quill_delta_from_html
是一个 Dart 包,用于将 HTML 输入转换为 Quill Delta 格式。这种格式被广泛应用于 Quill Js
编辑器中。
支持的HTML标签
文本格式化
<b>
,<strong>
: 加粗文本<i>
,<em>
: 斜体文本<u>
,<ins>
: 下划线文本<s>
,<del>
: 删除线文本<sup>
: 上标文本<sub>
: 下标文本
标题
<h1>
到<h6>
: 各种级别的标题
列表和嵌套列表
<ul>
: 无序列表<ol>
: 有序列表<li>
: 列表项<li data-checked="true">
: 带有复选框的列表项<input type="checkbox">
: 另一种创建带复选框列表项的方法
链接
<a>
: 超链接(支持href
属性)
图片
<img>
: 图片(支持src
,align
和样式属性)
视频
<video>
: 视频(支持src
属性)
引用块
<blockquote>
: 引用段落
代码块
<pre>
,<code>
: 代码块
文本对齐
<p style="text-align:left|center|right|justify">
: 段落样式对齐<p align="left|center|right|justify">
: 段落对齐方式<p dir="rtl">
: 段落方向
自定义块
<pullquote data-author="john">
: 自定义 HTML
快速开始
首先,在 pubspec.yaml
文件中添加依赖:
dependencies:
flutter_quill_delta_from_html: <latest_version>
然后在你的 Flutter 应用程序中导入并使用它:
import 'package:flutter_quill_delta_from_html/flutter_quill_delta_from_html.dart';
void main() {
String htmlContent = "<p>Hello, <b>world</b>!</p>";
var delta = HtmlToDelta().convert(htmlContent);
/*
{ "insert": "hello, " },
{ "insert": "world", "attributes": {"bold": true} },
{ "insert": "!" },
{ "insert": "\n" }
*/
}
创建自定义 CustomHtmlPart
如果你需要处理自定义 HTML 标签,比如 <pullquote>
,你可以定义自己的 CustomHtmlPart
类:
import 'package:flutter_quill_delta_from_html/flutter_quill_delta_from_html.dart';
import 'package:html/dom.dart' as dom;
/// Custom block handler for <pullquote> elements.
class PullquoteBlock extends CustomHtmlPart {
[@override](/user/override)
bool matches(dom.Element element) {
return element.localName == 'pullquote';
}
[@override](/user/override)
List<Operation> convert(dom.Element element, {Map<String, dynamic>? currentAttributes}) {
final Delta delta = Delta();
final Map<String, dynamic> attributes = currentAttributes != null ? Map.from(currentAttributes) : {};
final author = element.attributes['data-author'];
final style = element.attributes['data-style'];
if (author != null) {
delta.insert('Pullquote: "${element.text}" by $author', attributes);
} else {
delta.insert('Pullquote: "${element.text}"', attributes);
}
if (style != null && style.toLowerCase() == 'italic') {
attributes['italic'] = true;
}
delta.insert('\n', attributes);
return delta.toList();
}
}
接着,将你的 PullquoteBlock
添加到 HtmlToDelta
中:
import 'package:flutter_quill_delta_from_html/flutter_quill_delta_from_html.dart';
void main() {
final htmlText = '''
<html>
<body>
<p>Regular paragraph before the custom block</p>
<pullquote data-author="John Doe" data-style="italic">This is a custom pullquote</pullquote>
<p>Regular paragraph after the custom block</p>
</body>
</html>
''';
final customBlocks = [PullquoteBlock()];
final converter = HtmlToDelta(customBlocks: customBlocks);
final delta = converter.convert(htmlText);
/*
This should be resulting delta
{"insert": "Regular paragraph before the custom block"},
{"insert": "Pullquote: \"This is a custom pullquote\" by John Doe", "attributes": {"italic": true}},
{"insert": "\n"},
{"insert": "Regular paragraph after the custom block\n"}
*/
}
完整示例 Demo
以下是一个完整的示例,展示了如何将 HTML 转换为 Quill Delta 格式,并将其显示在 flutter_quill
编辑器中:
import 'package:flutter/material.dart';
import 'package:flutter_quill/flutter_quill.dart';
import 'package:flutter_quill_delta_from_html/flutter_quill_delta_from_html.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(title: Text('Flutter Quill Delta from HTML Example')),
body: Center(child: QuillEditorFromHtml()),
),
);
}
}
class QuillEditorFromHtml extends StatefulWidget {
[@override](/user/override)
_QuillEditorFromHtmlState createState() => _QuillEditorFromHtmlState();
}
class _QuillEditorFromHtmlState extends State<QuillEditorFromHtml> {
QuillController? _controller;
[@override](/user/override)
void initState() {
super.initState();
String htmlContent = """
<p>This is a <b>bold</b> text and this is an <i>italic</i> text.</p>
<h1>Heading 1</h1>
<h2>Heading 2</h2>
<ul>
<li>List item 1</li>
<li>List item 2</li>
</ul>
<p><a href="https://example.com">Link to example.com</a></p>
""";
var delta = HtmlToDelta().convert(htmlContent);
_controller = QuillController(document: Document.fromJson(delta), selection: TextSelection.collapsed(offset: 0));
}
[@override](/user/override)
Widget build(BuildContext context) {
return Padding(
padding: const EdgeInsets.all(16.0),
child: QuillEditor.basic(controller: _controller!, readOnly: false),
);
}
}
更多关于Flutter HTML转Quill Delta格式插件flutter_quill_delta_from_html的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter HTML转Quill Delta格式插件flutter_quill_delta_from_html的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是如何在Flutter项目中使用flutter_quill_delta_from_html
插件将HTML内容转换为Quill Delta格式的示例代码。这个插件假设你已经有一个HTML字符串,并且你想将它转换为Quill Delta格式,通常用于富文本编辑器中。
首先,确保你已经将flutter_quill_delta_from_html
插件添加到你的pubspec.yaml
文件中:
dependencies:
flutter:
sdk: flutter
flutter_quill_delta_from_html: ^最新版本号 # 请替换为实际可用的最新版本号
然后,运行flutter pub get
来安装该依赖。
接下来,在你的Flutter项目中,你可以按照以下步骤进行HTML到Quill Delta的转换:
- 导入必要的包:
import 'package:flutter/material.dart';
import 'package:quill_delta/quill_delta.dart';
import 'package:flutter_quill_delta_from_html/flutter_quill_delta_from_html.dart';
- 创建转换函数:
Future<Delta> convertHtmlToDelta(String html) async {
try {
// 使用 flutter_quill_delta_from_html 插件进行转换
final delta = await htmlToDelta(html);
return delta;
} catch (e) {
// 处理可能的错误
print("Error converting HTML to Delta: $e");
return Delta.empty();
}
}
- 在你的UI中使用转换后的Delta:
假设你有一个TextEditingController
用于处理文本输入,并且你有一个富文本编辑器(这里假设你使用的是支持Quill Delta的编辑器,比如quill_delta_rich_text_editor
)。
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
final TextEditingController _controller = TextEditingController();
Delta? _delta;
@override
void initState() {
super.initState();
// 示例HTML内容
String htmlContent = "<h1>Hello, World!</h1><p>This is a <b>bold</b> paragraph.</p>";
convertHtmlToDelta(htmlContent).then((delta) {
setState(() {
_delta = delta;
});
});
}
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('HTML to Quill Delta Example'),
),
body: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
children: [
// 这里假设你有一个Quill Delta编辑器
// 例如: QuillDeltaRichTextEditor(controller: _quillController, delta: _quillDelta),
// 但为了简单起见,这里仅显示Delta内容(转换为字符串)
if (_delta != null)
Text(
_delta!.toJson().toString(),
style: TextStyle(fontSize: 16),
),
],
),
),
),
);
}
}
void main() {
runApp(MyApp());
}
注意:
- 上述示例中,
QuillDeltaRichTextEditor
是一个假设的组件,实际使用时你需要使用支持Quill Delta的富文本编辑器组件。 delta.toJson().toString()
仅用于演示目的,将Delta对象转换为JSON字符串。在实际应用中,你可能需要将Delta对象传递给富文本编辑器组件。
确保你已经安装了所有必要的依赖,并且根据你所使用的富文本编辑器组件的API文档进行适当的调整。