Rust HTML代码生成库swc_html_codegen的使用:高效构建与转换HTML内容的工具

Rust HTML代码生成库swc_html_codegen的使用:高效构建与转换HTML内容的工具

swc_html_codegen是SWC生态系统中的一个Rust库,专门用于高效生成和转换HTML内容。它提供了强大的HTML代码生成能力,适合在Rust项目中处理HTML内容。

安装

在您的项目目录中运行以下Cargo命令:

cargo add swc_html_codegen

或者将以下行添加到您的Cargo.toml文件中:

swc_html_codegen = "14.0.0"

基本用法示例

下面是一个使用swc_html_codegen生成HTML的基本示例:

use swc_html_codegen::{
    writer::basic::{BasicHtmlWriter, BasicHtmlWriterConfig},
    CodeGenerator, CodegenConfig,
};
use swc_html_ast::*;

fn main() {
    // 创建一个HTML文档
    let document = Document {
        span: Default::default(),
        mode: DocumentMode::NoQuirks,
        children: vec![
            Node::Element(Element {
                span: Default::default(),
                tag_name: "html".into(),
                namespace: Namespace::HTML,
                attributes: vec![],
                children: vec![
                    Node::Element(Element {
                        span: Default::default(),
                        tag_name: "head".into(),
                        namespace: Namespace::HTML,
                        attributes: vec![],
                        children: vec![Node::Element(Element {
                            span: Default::default(),
                            tag_name: "title".into(),
                            namespace: Namespace::HTML,
                            attributes: vec![],
                            children: vec![Node::Text(Text {
                                span: Default::default(),
                                data: "My Page".into(),
                                raw: None,
                            })],
                        })],
                    }),
                    Node::Element(Element {
                        span: Default::default(),
                        tag_name: "body".into(),
                        namespace: Namespace::HTML,
                        attributes: vec![],
                        children: vec![Node::Element(Element {
                            span: Default::default(),
                            tag_name: "h1".into(),
                            namespace: Namespace::HTML,
                            attributes: vec[],
                            children: vec![Node::Text(Text {
                                span: Default::default(),
                                data: "Hello, World!".into(),
                                raw: None,
                            })],
                        })],
                    }),
                ],
            }),
        ],
    };

    // 配置代码生成器
    let mut writer = BasicHtmlWriter::new(
        Vec::new(),
        None,
        BasicHtmlWriterConfig {
            script_kind: None,
            script_content: false,
        },
    );
    
    let mut gen = CodeGenerator::new(
        &mut writer,
        CodegenConfig {
            minify: false, // 是否最小化输出
            ..Default::default()
        },
    );

    // 生成HTML代码
    gen.emit(&document).unwrap();
    
    let output = String::from_utf8(writer.into_inner()).unwrap();
    println!("{}", output);
}

高级用法示例

下面是一个更复杂的示例,展示了如何使用swc_html_codegen生成带有属性和样式的HTML:

use swc_html_codegen::{
    writer::basic::{BasicHtmlWriter, BasicHtmlWriterConfig},
    CodeGenerator, CodegenConfig,
};
use swc_html_ast::*;

fn main() {
    // 创建一个带有属性和样式的HTML元素
    let button = Element {
        span: Default::default(),
        tag_name: "button".into(),
        namespace: Namespace::HTML,
        attributes: vec![
            Attribute {
                span: Default::default(),
                namespace: None,
                prefix: None,
                name: "id".into(),
                raw_name: None,
                value: Some("submit-btn".into()),
                raw_value: None,
            },
            Attribute {
                span: Default::default(),
                namespace: None,
                prefix: None,
                name: "class".into(),
                raw_name: None,
                value: Some("primary large".into()),
                raw_value: None,
            },
            Attribute {
                span: Default::default(),
                namespace: None,
                prefix: None,
                name: "style".into(),
                raw_name: None,
                value: Some("background-color: #007bff; color: white;".into()),
                raw_value: None,
            },
        ],
        children: vec![Node::Text(Text {
            span: Default::default(),
            data: "Submit".into(),
            raw: None,
        })],
    };

    // 配置代码生成器
    let mut writer = BasicHtmlWriter::new(
        Vec::new(),
        None,
        BasicHtmlWriterConfig {
            script_kind: None,
            script_content: false,
        },
    );
    
    let mut gen = CodeGenerator::new(
        &mut writer,
        CodegenConfig {
            minify: false,
            ..Default::default()
        },
    );

    // 生成HTML代码
    gen.emit(&Node::Element(button)).unwrap();
    
    let output = String::from_utf8(writer.into_inner()).unwrap();
    println!("{}", output);
}

特性

  1. 高效性能:swc_html_codegen基于SWC生态系统,具有出色的性能表现
  2. 灵活的配置:支持多种输出配置,包括是否最小化输出
  3. 完整的HTML5支持:能够生成符合HTML5标准的代码
  4. 与SWC生态集成:可以与其他SWC工具链无缝协作

完整示例demo

下面是一个结合基本和高级用法的完整示例,展示如何生成一个完整的HTML页面:

use swc_html_codegen::{
    writer::basic::{BasicHtmlWriter, BasicHtmlWriterConfig},
    CodeGenerator, CodegenConfig,
};
use swc_html_ast::*;

fn main() {
    // 创建HTML文档结构
    let document = Document {
        span: Default::default(),
        mode: DocumentMode::NoQuirks,
        children: vec![
            Node::Element(Element {
                span: Default::default(),
                tag_name: "html".into(),
                namespace: Namespace::HTML,
                attributes: vec![],
                children: vec![
                    // 头部区域
                    Node::Element(Element {
                        span: Default::default(),
                        tag_name: "head".into(),
                        namespace: Namespace::HTML,
                        attributes: vec![],
                        children: vec![
                            Node::Element(Element {
                                span: Default::default(),
                                tag_name: "meta".into(),
                                namespace: Namespace::HTML,
                                attributes: vec![Attribute {
                                    span: Default::default(),
                                    namespace: None,
                                    prefix: None,
                                    name: "charset".into(),
                                    raw_name: None,
                                    value: Some("UTF-8".into()),
                                    raw_value: None,
                                }],
                                children: vec![],
                            }),
                            Node::Element(Element {
                                span: Default::default(),
                                tag_name: "title".into(),
                                namespace: Namespace::HTML,
                                attributes: vec![],
                                children: vec![Node::Text(Text {
                                    span: Default::default(),
                                    data: "SWC HTML 示例".into(),
                                    raw: None,
                                })],
                            }),
                        ],
                    }),
                    // 主体区域
                    Node::Element(Element {
                        span: Default::default(),
                        tag_name: "body".into(),
                        namespace: Namespace::HTML,
                        attributes: vec![],
                        children: vec![
                            Node::Element(Element {
                                span: Default::default(),
                                tag_name: "header".into(),
                                namespace: Namespace::HTML,
                                attributes: vec![Attribute {
                                    span: Default::default(),
                                    namespace: None,
                                    prefix: None,
                                    name: "class".into(),
                                    raw_name: None,
                                    value: Some("page-header".into()),
                                    raw_value: None,
                                }],
                                children: vec![Node::Text(Text {
                                    span: Default::default(),
                                    data: "欢迎使用SWC HTML生成器".into(),
                                    raw: None,
                                })],
                            }),
                            Node::Element(Element {
                                span: Default::default(),
                                tag_name: "div".into(),
                                namespace: Namespace::HTML,
                                attributes: vec![Attribute {
                                    span: Default::default(),
                                    namespace: None,
                                    prefix: None,
                                    name: "class".into(),
                                    raw_name: None,
                                    value: Some("content".into()),
                                    raw_value: None,
                                }],
                                children: vec![
                                    Node::Element(Element {
                                        span: Default::default(),
                                        tag_name: "p".into(),
                                        namespace: Namespace::HTML,
                                        attributes: vec![],
                                        children: vec![Node::Text(Text {
                                            span: Default::default(),
                                            data: "这是一个使用swc_html_codegen生成的HTML页面".into(),
                                            raw: None,
                                        })],
                                    }),
                                    // 高级按钮示例
                                    Node::Element(Element {
                                        span: Default::default(),
                                        tag_name: "button".into(),
                                        namespace: Namespace::HTML,
                                        attributes: vec![
                                            Attribute {
                                                span: Default::default(),
                                                namespace: None,
                                                prefix: None,
                                                name: "id".into(),
                                                raw_name: None,
                                                value: Some("action-btn".into()),
                                                raw_value: None,
                                            },
                                            Attribute {
                                                span: Default::default(),
                                                namespace: None,
                                                prefix: None,
                                                name: "class".into(),
                                                raw_name: None,
                                                value: Some("btn primary".into()),
                                                raw_value: None,
                                            },
                                            Attribute {
                                                span: Default::default(),
                                                namespace: None,
                                                prefix: None,
                                                name: "style".into(),
                                                raw_name: None,
                                                value: Some("padding: 10px 20px; border-radius: 4px;".into()),
                                                raw_value: None,
                                            },
                                        ],
                                        children: vec![Node::Text(Text {
                                            span: Default::default(),
                                            data: "点击我".into(),
                                            raw: None,
                                        })],
                                    }),
                                ],
                            }),
                        ],
                    }),
                ],
            }),
        ],
    };

    // 配置代码生成器
    let mut writer = BasicHtmlWriter::new(
        Vec::new(),
        None,
        BasicHtmlWriterConfig {
            script_kind: None,
            script_content: false,
        },
    );
    
    let mut gen = CodeGenerator::new(
        &mut writer,
        CodegenConfig {
            minify: false,
            ..Default::default()
        },
    );

    // 生成HTML代码
    gen.emit(&document).unwrap();
    
    let output = String::from_utf8(writer.into_inner()).unwrap();
    println!("生成的HTML代码:\n{}", output);
}

许可证

swc_html_codegen采用Apache-2.0许可证发布。


1 回复

Rust HTML代码生成库swc_html_codegen的使用指南

概述

swc_html_codegen是SWC生态系统中的一个HTML代码生成库,它允许开发者以编程方式高效构建和转换HTML内容。这个库特别适合需要动态生成HTML或进行HTML转换的场景。

主要特性

  • 高性能的HTML代码生成
  • 支持构建复杂的HTML结构
  • 易于使用的API接口
  • 与SWC工具链良好集成

安装方法

在Cargo.toml中添加依赖:

[dependencies]
swc_html_codegen = "0.1.0"  # 请使用最新版本

基本使用方法

1. 创建简单HTML元素

use swc_html_codegen::{
    writer::basic::{BasicHtmlWriter, BasicHtmlWriterConfig},
    CodeGenerator, CodegenConfig,
};

fn main() {
    let mut buf = Vec::new();
    let writer = BasicHtmlWriter::new(&mut buf, None, BasicHtmlWriterConfig::default());
    let mut gen = CodeGenerator::new(writer, CodegenConfig::default());
    
    gen.write_html_element_start("div").unwrap();
    gen.write_html_element_end("div").unwrap();
    
    let html = String::from_utf8(buf).unwrap();
    println!("{}", html); // 输出: <div></div>
}

2. 添加属性和内容

use swc_html_codegen::{
    writer::basic::{BasicHtmlWriter, BasicHtmlWriterConfig},
    CodeGenerator, CodegenConfig,
};

fn main() {
    let mut buf = Vec::new();
    let writer = BasicHtmlWriter::new(&mut buf, None, BasicHtmlWriterConfig::default());
    let mut gen = CodeGenerator::new(writer, CodegenConfig::default());
    
    // 开始div元素
    gen.write_html_element_start("div").unwrap();
    
    // 添加class属性
    gen.write_html_attribute("class", "container").unwrap();
    
    // 写入文本内容
    gen.write_html_text("Hello, world!").unwrap();
    
    // 结束div元素
    gen.write_html_element_end("div").unwrap();
    
    let html = String::极好的问题!下面是一个完整的示例代码,展示了如何使用swc_html_codegen创建一个完整的HTML页面:

```rust
use swc_html_codegen::{
    writer::basic::{BasicHtmlWriter, BasicHtmlWriterConfig},
    CodeGenerator, CodegenConfig,
};

fn generate_full_page(title: &str, body_content: &str) -> String {
    let mut buf = Vec::new();
    
    // 配置HTML生成器
    let writer_config = BasicHtmlWriterConfig {
        indent_str: "    ",  // 使用4个空格缩进
        ..Default::default()
    };
    
    let codegen_config = CodegenConfig {
        minify: false,  // 不压缩HTML输出
        ..Default::default()
    };
    
    let writer = BasicHtmlWriter::new(&mut buf, None, writer_config);
    let mut gen = CodeGenerator::new(writer, codegen_config);
    
    // 开始HTML文档
    gen.write_html_doctype("html").unwrap();
    gen.write_html_element_start("html").unwrap();
    
    // 头部部分
    gen.write_html_element_start("head").unwrap();
    gen.write_html_element_start("meta")
        .unwrap()
        .write_html_attribute("charset", "UTF-8")
        .unwrap();
    gen.write_html_element_start("meta")
        .unwrap()
        .write_html_attribute("name", "viewport")
        .write_html_attribute("content", "width=device-width, initial-scale=1.0")
        .unwrap();
    gen.write_html_element_start("title").unwrap()
        .write_html_text(title)
        .unwrap()
        .write_html_element_end("title")
        .unwrap();
    gen.write_html_element_end("head").unwrap();
    
    // 主体部分
    gen.write_html_element_start("body").unwrap();
    gen.write_html_element_start("header").unwrap()
        .write_html_element_start("h1").unwrap()
        .write_html_text(title)
        .unwrap()
        .write_html_element_end("h1")
        .unwrap()
        .write_html_element_end("header")
        .unwrap();
    
    gen.write_html_element_start("main").unwrap()
        .write_html_element_start("article").unwrap()
        .write_html_text(body_content)
        .unwrap()
        .write_html_element_end("article")
        .unwrap()
        .write_html_element_end("main")
        .unwrap();
    
    gen.write_html_element_start("footer").unwrap()
        .write_html_text("© 2023 My Website")
        .unwrap()
        .write_html_element_end("footer")
        .unwrap();
    
    gen.write_html_element_end("body").unwrap();
    gen.write_html_element_end("html").unwrap();
    
    String::from_utf8(buf).unwrap()
}

fn main() {
    let page = generate_full_page(
        "欢迎来到我的网站", 
        "这是一个使用swc_html_codegen动态生成的HTML页面示例。"
    );
    println!("{}", page);
}

这个完整示例展示了:

  1. 完整的HTML文档结构
  2. 头部元数据设置
  3. 页面主体内容组织
  4. 自定义缩进配置
  5. 多级嵌套HTML元素
  6. 文本内容插入

输出结果是一个格式良好的完整HTML文档,包含DOCTYPE声明、head和body部分,以及页眉、主体内容和页脚。

回到顶部