Crate table_to_html
source ·Expand description
table_to_html
The library provides a interface to build a HTML table (<table>
).
Example building a table from iterator
use table_to_html::HtmlTable;
let data = vec![
vec!["Debian", "", "0"],
vec!["Arch", "", "0"],
vec!["Manjaro", "Arch", "0"],
];
let html_table = HtmlTable::new(data);
assert_eq!(
html_table.to_string(),
concat!(
"<table>\n",
" <tbody>\n",
" <tr>\n",
" <td>\n",
" <div>\n",
" <p>\n",
" Debian\n",
" </p>\n",
" </div>\n",
" </td>\n",
" <td>\n",
" <div>\n",
" <p>\n",
" \n",
" </p>\n",
" </div>\n",
" </td>\n",
" <td>\n",
" <div>\n",
" <p>\n",
" 0\n",
" </p>\n",
" </div>\n",
" </td>\n",
" </tr>\n",
" <tr>\n",
" <td>\n",
" <div>\n",
" <p>\n",
" Arch\n",
" </p>\n",
" </div>\n",
" </td>\n",
" <td>\n",
" <div>\n",
" <p>\n",
" \n",
" </p>\n",
" </div>\n",
" </td>\n",
" <td>\n",
" <div>\n",
" <p>\n",
" 0\n",
" </p>\n",
" </div>\n",
" </td>\n",
" </tr>\n",
" <tr>\n",
" <td>\n",
" <div>\n",
" <p>\n",
" Manjaro\n",
" </p>\n",
" </div>\n",
" </td>\n",
" <td>\n",
" <div>\n",
" <p>\n",
" Arch\n",
" </p>\n",
" </div>\n",
" </td>\n",
" <td>\n",
" <div>\n",
" <p>\n",
" 0\n",
" </p>\n",
" </div>\n",
" </td>\n",
" </tr>\n",
" </tbody>\n",
"</table>"
),
)
Example building a table using Tabled
.
use table_to_html::{HtmlTable, Alignment, Entity};
use tabled::{Table, Tabled};
#[derive(Debug, Tabled)]
struct Distribution {
name: &'static str,
based_on: &'static str,
is_active: bool,
}
impl Distribution {
fn new(name: &'static str, base: &'static str, is_active: bool) -> Self {
Self {
based_on: base,
is_active,
name,
}
}
}
let data = [
Distribution::new("Debian", "", true),
Distribution::new("Arch", "", true),
Distribution::new("Manjaro", "Arch", true),
];
let mut html_table = HtmlTable::with_header(Vec::<Vec<String>>::from(Table::builder(&data)));
html_table.set_alignment(Entity::Row(1), Alignment::center());
assert_eq!(
html_table.to_string(),
concat!(
"<style>\n",
" tbody > :nth-child(2) > td, thead > :nth-child(2) > th {\n",
" text-align: center;\n",
" }\n",
"</style>\n",
"<table>\n",
" <thead>\n",
" <tr>\n",
" <th>\n",
" <div>\n",
" <p>\n",
" name\n",
" </p>\n",
" </div>\n",
" </th>\n",
" <th>\n",
" <div>\n",
" <p>\n",
" based_on\n",
" </p>\n",
" </div>\n",
" </th>\n",
" <th>\n",
" <div>\n",
" <p>\n",
" is_active\n",
" </p>\n",
" </div>\n",
" </th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <td>\n",
" <div>\n",
" <p>\n",
" Debian\n",
" </p>\n",
" </div>\n",
" </td>\n",
" <td>\n",
" <div>\n",
" <p>\n",
" \n",
" </p>\n",
" </div>\n",
" </td>\n",
" <td>\n",
" <div>\n",
" <p>\n",
" true\n",
" </p>\n",
" </div>\n",
" </td>\n",
" </tr>\n",
" <tr>\n",
" <td>\n",
" <div>\n",
" <p>\n",
" Arch\n",
" </p>\n",
" </div>\n",
" </td>\n",
" <td>\n",
" <div>\n",
" <p>\n",
" \n",
" </p>\n",
" </div>\n",
" </td>\n",
" <td>\n",
" <div>\n",
" <p>\n",
" true\n",
" </p>\n",
" </div>\n",
" </td>\n",
" </tr>\n",
" <tr>\n",
" <td>\n",
" <div>\n",
" <p>\n",
" Manjaro\n",
" </p>\n",
" </div>\n",
" </td>\n",
" <td>\n",
" <div>\n",
" <p>\n",
" Arch\n",
" </p>\n",
" </div>\n",
" </td>\n",
" <td>\n",
" <div>\n",
" <p>\n",
" true\n",
" </p>\n",
" </div>\n",
" </td>\n",
" </tr>\n",
" </tbody>\n",
"</table>",
),
)
The default table might look not very represenative. But it’s considered that you might improve it by suplying your own CSS.
In a mean time there’s some regular style options.
Also notice that table elements does not have any special id
, class
attributes.
It’s supposed that you might add them if nessary your self, by using HtmlTable::visit_mut
Adding custom ids example.
use table_to_html::{HtmlTable, html::{Attribute, HtmlVisitorMut, HtmlElement}};
struct CellIdIndex {
i: usize
}
impl HtmlVisitorMut for CellIdIndex {
fn visit_element_mut(&mut self, e: &mut HtmlElement) -> bool {
if e.tag() == "td" {
let mut attrs = e.attrs().to_vec();
attrs.push(Attribute::new("id", self.i.to_string()));
*e = HtmlElement::new("td", attrs, e.value().cloned());
self.i += 1;
} else if e.tag() == "th" {
let mut attrs = e.attrs().to_vec();
attrs.push(Attribute::new("id", self.i.to_string()));
*e = HtmlElement::new("th", attrs, e.value().cloned());
self.i += 1;
}
true
}
}
let data = vec![
vec!["Debian", "", "0"],
vec!["Arch", "", "0"],
vec!["Manjaro", "Arch", "0"],
];
let mut html_table = HtmlTable::new(data);
html_table.visit_mut(CellIdIndex{ i: 0 });
assert_eq!(
html_table.to_string(),
concat!(
"<table>\n",
" <tbody>\n",
" <tr>\n",
" <td id=\"0\">\n",
" <div>\n",
" <p>\n",
" Debian\n",
" </p>\n",
" </div>\n",
" </td>\n",
" <td id=\"1\">\n",
" <div>\n",
" <p>\n",
" \n",
" </p>\n",
" </div>\n",
" </td>\n",
" <td id=\"2\">\n",
" <div>\n",
" <p>\n",
" 0\n",
" </p>\n",
" </div>\n",
" </td>\n",
" </tr>\n",
" <tr>\n",
" <td id=\"3\">\n",
" <div>\n",
" <p>\n",
" Arch\n",
" </p>\n",
" </div>\n",
" </td>\n",
" <td id=\"4\">\n",
" <div>\n",
" <p>\n",
" \n",
" </p>\n",
" </div>\n",
" </td>\n",
" <td id=\"5\">\n",
" <div>\n",
" <p>\n",
" 0\n",
" </p>\n",
" </div>\n",
" </td>\n",
" </tr>\n",
" <tr>\n",
" <td id=\"6\">\n",
" <div>\n",
" <p>\n",
" Manjaro\n",
" </p>\n",
" </div>\n",
" </td>\n",
" <td id=\"7\">\n",
" <div>\n",
" <p>\n",
" Arch\n",
" </p>\n",
" </div>\n",
" </td>\n",
" <td id=\"8\">\n",
" <div>\n",
" <p>\n",
" 0\n",
" </p>\n",
" </div>\n",
" </td>\n",
" </tr>\n",
" </tbody>\n",
"</table>"
),
)
Modules
- The module contains a html primitives.
Structs
- Alignment represent a horizontal and vertical alignment setting for any cell on a
Table
. - The structure represents an HTML
<table>
.
Enums
- Entity a structure which represent a set of cells.
Type Aliases
- A Html element margin in PX.
- A Html element padding in PX.
- Position is a (row, col) position on a Grid.