Rust HTML生成库build_html的使用:高效构建和操作HTML文档的Rust工具

Rust HTML生成库build_html的使用:高效构建和操作HTML文档的Rust工具

build_html是一个允许使用Builder模式从Rust代码生成HTML字符串的库。通过链式调用添加元素来构建HTML文档,最后将结构体转换为字符串以便在程序中使用。

基本用法

use build_html::{HtmlElement, HtmlTag, Html};

let element = HtmlElement::new(HtmlTag::Div)
    .with_child(
        HtmlElement::new(HtmlTag::ParagraphText)
            .with_child("Paragraph Text".into())
            .into()
    )
    .with_child(
        HtmlElement::new(HtmlTag::PreformattedText)
            .with_child("Preformatted Text".into())
            .into()
    )
    .to_html_string();

assert_eq!(element, "<div><p>Paragraph Text</p><pre>Preformatted Text</pre></div>");

完整HTML页面生成

use build_html::{HtmlPage, Html, HtmlContainer};

let page = HtmlPage::new()
    .with_title("TITLE")
    .with_paragraph("PARAGRAPH")
    .to_html_string();

assert_eq!(page, concat!(
    "<!DOCTYPE html><html>",
    "<head><title>TITLE</title></head>",
    "<body><p>PARAGRAPH</p></body>",
    "</html>"
));

更复杂的示例

use build_html::*;

let html: String = HtmlPage::new()
    .with_title("My Page")
    .with_header(1, "Main Content:")
    .with_html(
        HtmlElement::new(HtmlTag::Article)
            .with_attribute("id", "article1")
            .with_header_attr(2, "Hello, World", [("id", "article-head"), ("class", "header")])
            .with_paragraph("This is a simple HTML demo")
    )
    .to_html_string();

生成的HTML字符串等价于:

<!DOCTYPE html>
<html>
    <head>
        <title>My Page</title>
    </head>
    <body>
        <h1>Main Content:</h1>
        <article id="article1">
            <h2 id="article-head" class="header">Hello World</h2>
            <p>This is a simple HTML demo</p>
        </article>
    </body>
</html>

完整示例Demo

use build_html::*;

fn main() {
    // 创建一个完整的HTML页面
    let html_page = HtmlPage::new()
        .with_title("Rust HTML生成示例")
        .with_header(1, "欢迎使用build_html")
        .with_html(
            HtmlElement::new(HtmlTag::Div)
                .with_attribute("class", "container")
                .with_child(
                    HtmlElement::new(HtmlTag::Article)
                        .with_attribute("id", "main-article")
                        .with_header_attr(2, "文章标题", [("class", "article-title")])
                        .with_paragraph("这是一个使用Rust生成的HTML文档示例。")
                        .with_html(
                            HtmlElement::new(HtmlTag::Ul)
                                .with_child(
                                    HtmlElement::new(HtmlTag::Li)
                                        .with_child("列表项1".into())
                                        .into()
                                )
                                .with_child(
                                    HtmlElement::new(HtmlTag::Li)
                                        .with_child("列表项2".into())
                                        .into()
                                )
                                .into()
                        )
                        .into()
                )
                .into()
        )
        .to_html_string();

    println!("{}", html_page);
}

这个库的主要目的是提供一种简单的方法来构建动态元素,这些元素可以注入到HTML页面或框架中。优点是允许您使用现代编辑器功能(如语法高亮)编写大部分HTML,然后使用标准库的include_str!宏导入HTML文件,并使用format!宏注入新元素。

如果页面非常简单或整个页面都是动态的,您可能希望完全从Rust代码创建整个页面。为了满足这个用例,库提供了HtmlPage结构体。


1 回复

Rust HTML生成库build_html的使用:高效构建和操作HTML文档的Rust工具

build_html是一个简单易用的Rust库,用于以类型安全的方式构建HTML文档。它提供了流畅的API来创建HTML元素、属性和内容,无需手动拼接字符串。

安装

在Cargo.toml中添加依赖:

[dependencies]
build_html = "2.0"

基本用法

创建简单HTML文档

use build_html::*;

let html = HtmlPage::new()
    .with_title("My Page")
    .with_header(1, "Welcome to my website!")
    .with_paragraph("This is a paragraph of text.")
    .to_html_string();

println!("{}", html);

输出结果

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>My Page</title>
</head>
<body>
    <h1>Welcome to my website!</h1>
    <p>This is a paragraph of text.</p>
</body>
</html>

主要功能

1. 创建容器元素

use build_html::*;

let html = Container::new()
    .with_attributes([("class", "my-container")])
    .with_paragraph("First paragraph")
    .with_paragraph("Second paragraph")
    .to_html_string();

println!("{}", html);

2. 创建列表

use build_html::*;

let html = Container::new()
    .with_ul()
    .with_li("First item")
    .with_li("Second item")
    .with_li("Third item")
    .to_html_string();

println!("{}", html);

3. 添加链接和图片

use build_html::*;

let html = Container::new()
    .with_link("https://www.rust-lang.org", "Visit Rust")
    .with_image("rust-logo.png", "Rust Logo")
    .to_html_string();

println!("{}", html);

4. 创建表格

use build_html::*;

let html = Container::new()
    .with_table()
    .with_header_row(["Name", "Age", "Occupation"])
    .with_row(["Alice", "30", "Engineer"])
    .with_row(["Bob", "25", "Designer"])
    .to_html_string();

println!("{}", html);

5. 自定义元素

use build_html::*;

let html = Container::new()
    .with_element(
        "div",
        [("class", "custom-div"), ("id", "main-content")],
        "This is a custom div element"
    )
    .to_html_string();

println!("{}", html);

高级用法

嵌套结构

use build_html::*;

let html = HtmlPage::new()
    .with_title("Nested Example")
    .with_container(
        Container::new()
            .with_attributes([("class", "main-content")])
            .with_heading(2, "Section 1")
            .with_paragraph("Content for section 1")
            .with_container(
                Container::new()
                    .with_attributes([("class", "sub-section")])
                    .with_heading(3, "Subsection")
                    .with_paragraph("Nested content")
            )
    )
    .to_html_string();

println!("{}", html);

动态生成内容

use build_html::*;

let items = vec!["Apple", "Banana", "Cherry"];
let mut container = Container::new().with_ul();

for item in items {
    container = container.with_li(item);
}

let html = HtmlPage::new()
    .with_title("Dynamic Content")
    .with_container(container)
    .to_html_string();

println!("{}", html);

完整示例

下面是一个结合了多种功能的完整示例:

use build_html::*;

fn main() {
    // 创建HTML页面
    let html = HtmlPage::new()
        .with_title("Complete Example")
        // 添加导航栏
        .with_container(
            Container::new()
                .with_attributes([("class", "navbar")])
                .with_link("#home", "Home")
                .with_link("#about", "About")
                .with_link("#contact", "Contact")
        )
        // 添加主要内容区域
        .with_container(
            Container::new()
                .with_attributes([("class", "main-content")])
                .with_heading(1, "Welcome to our Website")
                .with_paragraph("This is a complete example of using build_html library.")
                // 添加产品列表
                .with_heading(2, "Our Products")
                .with_ul()
                .with_li("Product 1")
                .with_li("Product 2")
                .with_li("Product 3")
                // 添加表格
                .with_heading(2, "Pricing")
                .with_table()
                .with_header_row(["Product", "Price", "Stock"])
                .with_row(["Product 1", "$10.99", "100"])
                .with_row(["Product 2", "$15.99", "50"])
                .with_row(["Product 3", "$20.99", "25"])
        )
        // 添加页脚
        .with_container(
            Container::new()
                .with_attributes([("class", "footer")])
                .with_paragraph("© 2023 My Company. All rights reserved.")
        )
        .to_html_string();

    println!("{}", html);
}

特点

  1. 类型安全:编译时检查HTML结构
  2. 流畅API:链式调用简化代码
  3. 无需字符串拼接:自动处理HTML转义
  4. 可组合:可以轻松组合和嵌套元素
  5. 轻量级:没有复杂的依赖关系

build_html非常适合需要以编程方式生成HTML的场景,如网页模板、报告生成或电子邮件内容创建。

回到顶部