14个版本 (9个破坏性版本)
使用旧版Rust 2015
0.11.0 | 2024年3月13日 |
---|---|
0.9.0 | 2023年11月29日 |
0.8.0 | 2023年2月2日 |
0.7.0 | 2020年9月28日 |
0.1.0 |
|
#112 in 解析实现
每月下载量4,700
在 10 个crate中使用 (直接使用8个)
72KB
1.5K SLoC
ical-rs
这个库解析了RFC5545中定义的iCalendar格式,以及类似vCard的格式。
可能有一些问题需要解决,但这个库应该适用于大多数情况。如果您想帮忙,并想讨论任何API更改,请联系我或创建一个问题。
最初的目标是将JavaScript库ical.js移植过来。最初从它那里借鉴了很多代码/算法;但为了使其更具“Rusty”风格,进行了完全重写。
文档
安装
将以下内容放入您的Cargo.toml
[dependencies]
ical = "0.10"
概述
根据您想要解析的级别,使用ical
crate有几种方法。在未来的版本中可能会出现一些新的包装器/格式化程序。
默认情况下,所有功能都包含在内,但您可以在项目中只包含您需要的功能。
警告
解析器(PropertyParser
和 IcalParser
)仅解析内容并将不区分大小写的字段转换为大写。不会检查字段的合法性。
IcalParser
/ VcardParser
将PropertyParser
的结果包装成组件。
每个组件可以包含属性(例如:Property
)或子组件。
IcalParser
返回IcalCalendar
VcardParser
返回VcardContact
Cargo.toml
[dependencies.ical]
version = "0.10"
default-features = false
features = ["ical", "vcard"]
代码
extern crate ical;
use std::io::BufReader;
use std::fs::File;
fn main() {
let buf = BufReader::new(File::open("/tmp/component.ics")
.unwrap());
let reader = ical::IcalParser::new(buf);
for line in reader {
println!("{:?}", line);
}
}
输出
IcalCalendar {
properties: [],
events: [
IcalEvent {
properties: [ Property { ... }, ... ],
alarms: [
IcalAlarm {
properties: [ Property { ... } ]
}
]
}
],
alarms: [],
todos: [],
journals: [],
free_busys: [],
timezones: []
}
PropertyParser
将LineReader
的结果解析为三部分
- 行属性的名称,格式化为大写。
- 参数的键值对元组的向量
- 参数键格式化为大写。
- 参数值未修改。
- 属性值未修改。
它适用于vCard和iCal格式。
示例
Cargo.toml
[dependencies.ical]
version = "0.10"
default-features = false
features = ["property"]
代码
extern crate ical;
use std::io::BufReader;
use std::fs::File;
fn main() {
let buf = BufReader::new(File::open("/tmp/component.ics")
.unwrap());
let reader = ical::PropertyParser::from_reader(buf);
for line in reader {
println!("{:?}", line);
}
}
输入 -> 输出
begin:VCALENDAR Ok(Property { name: "BEGIN", params: None, value: Some("VCALENDAR") })
ATTENDEE;cn=FooBar:mailto:foo3@bar -> Ok(Property { name: "ATTENDEE", params: Some([("CN", "FooBar")]), value: Some("mailto:foo3@bar") })
DESCRIPTION: Ok(Property { name: "DESCRIPTION": params: None, value: None })
END:VCALENDAR Ok(Property { name: "END", params: None, value: Some("VCALENDAR") })
行读取器
这是一个非常底层的解析器。它会清除空行并展开它们。
它适用于vCard和iCal格式。
示例
Cargo.toml
[dependencies.ical]
version = "0.10"
default-features = false
features = ["line"]
代码
extern crate ical;
use std::io::BufReader;
use std::fs::File;
fn main() {
let buf = BufReader::new(File::open("/tmp/component.ics")
.unwrap());
let reader = ical::LineReader::new(buf);
for line in reader {
println!("{}", line);
}
}
输入 -> 输出
BEGIN:VCALENDAR Line 0: BEGIN:VCALENDAR
BEGIN:VEVENT Line 1: BEGIN:VEVENT
SUMMARY:foo and -> Line 3: SUMMARY:foo andbar
bar
END:VEVENT Line 4: END:VEVENT
END:VCALENDAR Line 5: END:VCALENDAR
生成器
使用ical
的另一种方法是生成ical/ics文件。事件、日历和vCard的构建器确保必填字段被填写。
要创建可用的ics文件,需要对iCal标准有相当的了解,尽管IcalEventBuilder
可以帮助遵守正式规则。
Cargo.toml
[dependencies.ical]
version = "0.10"
default-features = false
features = ["ical", "vcard", "generator"]
代码
extern crate ical;
use crate::ical::{generator::*, *};
fn main() {
let mut cal = IcalCalendarBuilder::version("2.0")
.gregorian()
.prodid("-//ical-rs//github.com//")
.build();
let event = IcalEventBuilder::tzid("Europe/Berlin")
.uid("UID for identifying this event.")
.changed("20210115")
.one_day("20220101")
.set(ical_property!("SUMMARY", "New Year"))
.build();
cal.events.push(event);
print!("{}", cal.generate());
}
依赖关系
~0.3–0.8MB
~19K SLoC