1 个不稳定版本
0.2.0 | 2023年12月4日 |
---|
#203 in 文本编辑器
76KB
1K SLoC
markupsth
一个用于编写几乎所有类型格式化文本文件的简单Rust库,特别是标记文件,如HTML和XML。其原始目的是开发一个文本到HTML的转换器,但逐步扩展。默认支持HTML和XML,但你也可以通过配置自定义语法来定义自己的标记语言。还有一些预定义的格式化器,可以对标记输出进行无格式化,或者提供一些现成的格式化样式,以实现美观和可读的HTML代码。
对于自定义语法样式(自定义标记语言),请参阅 syntax
模块。对于自定义格式化样式(为该crate实现自己的 Formatter
),请参阅 format
模块。
更改请求
如果感兴趣,我也愿意在任何时候通过新的标记语言、格式化样式或其他任何有意义的修改来扩展这个crate。请通过cargo manifest文件中提供的电子邮件联系我。
示例
通过使用内置的标记语言(如HTML或XML)和预定义的 Formatter
,您可以快速编写一些转换器或HTML生成器。以下是一个快速入门指南的示例。
可读的HTML
要生成以下HTML代码
<!DOCTYPE html>
<html>
<head>
<title>New Website</title>
<link href="css/style.css" rel="stylesheet">
</head>
<body>
<section>
<div>
<div><img src="image.jpg"></div>
<p>This is HTML</p>
</div>
</section>
</body>
</html>
您需要实现
use markupsth::{
AutoIndent, FixedRule, Language, MarkupSth, properties,
};
// Setup a document (String), MarkupSth and a default formatter.
let mut document = String::new();
let mut mus = MarkupSth::new(&mut document, Language::Html).unwrap();
// Default Formatter is an AutoIndent, so get it, configure it!
let fmtr = mus.formatter.optional_fixed_ruleset().unwrap();
fmtr.add_tags_to_rule(&["head", "body", "section"], FixedRule::IndentAlways)
.unwrap();
fmtr.add_tags_to_rule(&["html"], FixedRule::LfAlways).unwrap();
fmtr.add_tags_to_rule(&["title", "link", "div", "p"], FixedRule::LfClosing)
.unwrap();
// Generate the content of example shown above.
mus.open("html").unwrap();
mus.open("head").unwrap();
mus.open_close_w("title", "New Website").unwrap();
mus.self_closing("link").unwrap();
properties!(mus, "href", "css/style.css", "rel", "stylesheet").unwrap();
mus.close().unwrap();
mus.open("body").unwrap();
mus.open("section").unwrap();
mus.open("div").unwrap();
mus.new_line().unwrap();
mus.open("div").unwrap();
mus.self_closing("img").unwrap();
properties!(mus, "src", "image.jpg").unwrap();
mus.close().unwrap();
mus.open_close_w("p", "This is HTML").unwrap();
mus.close_all().unwrap();
mus.finalize().unwrap();
# assert_eq!(document, markupsth::testfile("formatted_html_auto_indent.html"));
可读的XML
要生成以下输出
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<directory>
<title>Wikipedia List of Cities</title>
<entry>
<keyword>Hamburg</keyword>
<entrystext>Hamburg is the residence of ...</entrystext>
</entry>
<entry>
<keyword>Munich</keyword>
<entrystext>Munich is the residence of ...</entrystext>
</entry>
</directory>
您必须实现
use markupsth::{AutoIndent, FixedRule, Language, MarkupSth, properties};
let do_entry = |mus: &mut MarkupSth, name: &str| {
mus.open("entry").unwrap();
mus.open("keyword").unwrap();
mus.text(name).unwrap();
mus.close().unwrap();
mus.open("entrystext").unwrap();
mus.text(&format!("{} is the residence of ...", name))
.unwrap();
mus.close().unwrap();
mus.close().unwrap();
};
// Setup a document (String), MarkupSth and a default formatter.
let mut document = String::new();
let mut mus = MarkupSth::new(&mut document, Language::Html).unwrap();
// Default Formatter is an AutoIndent, so get it, configure it!
let fmtr = mus.formatter.optional_fixed_ruleset().unwrap();
fmtr.add_tags_to_rule(&["directory", "entry"], FixedRule::IndentAlways).unwrap();
fmtr.add_tags_to_rule(&["title", "keyword", "entrystext"], FixedRule::LfClosing).unwrap();
// Generate the content of example shown above.
mus.open("directory").unwrap();
mus.open("title").unwrap();
mus.text("Wikipedia List of Cities").unwrap();
mus.close().unwrap();
do_entry(&mut mus, "Hamburg");
do_entry(&mut mus, "Munich");
mus.close_all().unwrap();
mus.finalize().unwrap();
更多信息
请通过使用cargo查看crate的代码文档。