Flutter HTML转Markdown插件html2md的使用

发布于 1周前 作者 gougou168 来自 Flutter

Flutter HTML转Markdown插件html2md的使用

html2md简介

html2md 是一个用于将HTML转换为Markdown的Dart库。它支持CommonMark、简单的表格和自定义转换规则。

使用方法

简单示例

import 'package:html2md/html2md.dart' as html2md;

void main() {
  var html = '<h1>HTML2MD Demo</h1>';
  print(html2md.convert(html));
}

在Flutter中使用

在Flutter中,你可以结合flutter_markdown包来渲染Markdown内容:

import 'package:html2md/html2md.dart' as html2md;
import 'package:flutter_markdown/flutter_markdown.dart';
import 'package:flutter/material.dart';

class HtmlToMarkdownDemo extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    // 注意!这并不是最佳实践,你不应该在build方法中调用convert,
    // 转换后的Markdown应存储在状态中。
    var html = '<h1>HTML2MD Demo</h1>';
    var markdown = html2md.convert(html);
    return Scaffold(
      appBar: AppBar(title: Text('HTML to Markdown Demo')),
      body: Padding(
        padding: const EdgeInsets.all(8.0),
        child: Markdown(data: markdown),
      ),
    );
  }
}

配置选项

你可以通过传递styleOptionsignorerules来自定义转换风格:

html2md.convert(html,
    styleOptions: {'headingStyle': 'atx'},
    ignore: ['script'],
    rules: [Rule('custom')]);

默认和可用的样式选项如下:

名称 默认值 可选值
headingStyle “setext” “setext”, “atx”
hr “* * *” “* * *”, “- - -”, “_ _ _”
bulletListMarker “*” “*”, “-”, “_”
codeBlockStyle “indented” “indented”, “fenced”
fence " | "”, “~~~”
emDelimiter “_” “_”, “*”
strongDelimiter “**” “**”, “__”
linkStyle “inlined” “inlined”, “referenced”
linkReferenceStyle “full” “full”, “collapsed”, “shortcut”

表格支持

html2md 支持基本的表格转换。例如:

HTML表格源代码:

<table>
    <tr>
        <th>First Header</th>
        <th>Second Header</th> 
    </tr>
    <tr>
        <td>Content Cell</td>
        <td>Content Cell</td>
    </tr>
    <tr>
        <td>Content Cell</td>
        <td>Content Cell</td>
    </tr>
</table>

转换后的Markdown表格:

First Header Second Header
Content Cell Content Cell
Content Cell Content Cell

## 自定义规则

如果你想自定义元素转换,可以编写自己的规则。以下是将Discourse帖子的一键链接部分转换为链接的示例:

HTML代码:
```html
<aside class="onebox">
  <header class="source">
      <img src="https://discoursesite/uploads/default/original/1X/test.png" class="site-icon" width="32" height="32">
      <a href="https://events.google.com/io/program/content?4=topic_flutter&lng=zh-CN" target="_blank" rel="noopener">Google I/O 2021</a>
  </header>
</aside>

Dart代码:

Rule(
  'discourse-onebox',
  filterFn: (node) {
    if (node.nodeName == 'aside' && node.className.contains('onebox')) {
      return true;
    }
    return false;
  },
  replacement: (content, node) {
    var header = node.firstChild;
    var link = header!
        .childNodes()
        .firstWhere((element) => element.nodeName == 'a');
    var href = link.getAttribute('href');
    if (href != null && href.isNotEmpty) {
      return '[$href]($href)'; // 构建链接
    }
    return '';
  },
)

测试

要运行测试,请执行以下命令:

dart run test

特性和Bug

请在issue tracker中提交特性请求和Bug报告。

示例代码

以下是一个完整的示例代码,展示了如何使用html2md

import 'package:html2md/html2md.dart' as html2md;

void main() {
  var html = '''
    <h1>HTML2MD Demo</h1>

    <p>This demonstrates <a href="https://github.com/jarontai/html2md">html2md</a> – an HTML to Markdown converter in Dart.</p>

    <h2>Usage</h2>

    <pre><code class="language-dart">import 'package:html2md/html2md.dart' as html2md;
    void main() {
      print(html2md.convert('&lt;h1&gt;Hello world&lt;/h1&gt;'));
    }</code></pre>

    <hr />

    <p>It aims to be <a href="http://commonmark.org/">CommonMark</a> compliant, and includes options to style the output. These options include:</p>

    <ul>
      <li>headingStyle (setext or atx)</li>
      <li>horizontalRule (*, -, or _)</li>
      <li>bullet (*, -, or +)</li>
      <li>codeBlockStyle (indented or fenced)</li>
      <li>fence (` or ~)</li>
      <li>emDelimiter (_ or *)</li>
      <li>strongDelimiter (** or __)</li>
      <li>linkStyle (inlined or referenced)</li>
      <li>linkReferenceStyle (full, collapsed, or shortcut)</li>
    </ul>
  ''';
  print(html2md.convert(html));
}

这个示例展示了如何将一段复杂的HTML代码转换为Markdown,并打印出结果。希望这些信息能帮助你在Flutter项目中成功使用html2md插件。


更多关于Flutter HTML转Markdown插件html2md的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter HTML转Markdown插件html2md的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter项目中使用html2md插件将HTML转换为Markdown的示例代码。这个插件允许你将HTML内容解析并转换为Markdown格式。

第一步:添加依赖

首先,你需要在pubspec.yaml文件中添加html2md的依赖:

dependencies:
  flutter:
    sdk: flutter
  html2md: ^x.y.z  # 请使用最新版本号替换x.y.z

第二步:导入包

在你的Dart文件中,导入html2md包:

import 'package:html2md/html2md.dart';

第三步:使用插件

以下是一个简单的示例,展示了如何使用html2md将HTML字符串转换为Markdown字符串:

import 'package:flutter/material.dart';
import 'package:html2md/html2md.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('HTML to Markdown Example'),
        ),
        body: Center(
          child: HtmlToMarkdownExample(),
        ),
      ),
    );
  }
}

class HtmlToMarkdownExample extends StatelessWidget {
  final String htmlContent = """
    <h1>Hello, World!</h1>
    <p>This is a paragraph with some <strong>bold</strong> and <em>italic</em> text.</p>
    <ul>
      <li>Item 1</li>
      <li>Item 2</li>
      <li>Item 3</li>
    </ul>
  """;

  @override
  Widget build(BuildContext context) {
    // 使用html2md进行转换
    String markdownContent = Html2Md().convert(htmlContent);

    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: <Widget>[
        Text('Original HTML:', style: TextStyle(fontWeight: FontWeight.bold)),
        Text(htmlContent, style: TextStyle(fontSize: 16)),
        SizedBox(height: 20),
        Text('Converted Markdown:', style: TextStyle(fontWeight: FontWeight.bold)),
        Text(markdownContent, style: TextStyle(fontSize: 16)),
      ],
    );
  }
}

解释

  1. 添加依赖:在pubspec.yaml文件中添加html2md依赖。
  2. 导入包:在需要使用html2md的Dart文件中导入该包。
  3. 转换HTML:使用Html2Md().convert(htmlContent)方法将HTML字符串转换为Markdown字符串。
  4. 展示结果:在UI中展示原始的HTML内容和转换后的Markdown内容。

注意

  • 确保使用html2md的最新版本,以获取最新的功能和修复。
  • 插件可能不支持所有的HTML标签和属性,具体支持情况请参考html2md的官方文档或源代码。

这个示例展示了如何在Flutter应用中使用html2md插件进行HTML到Markdown的转换,并展示了转换前后的内容。希望这对你有所帮助!

回到顶部