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 2016年11月23日

#112 in 解析实现

Download history 2102/week @ 2024-03-30 2058/week @ 2024-04-06 1450/week @ 2024-04-13 1465/week @ 2024-04-20 1582/week @ 2024-04-27 1525/week @ 2024-05-04 1560/week @ 2024-05-11 1417/week @ 2024-05-18 1292/week @ 2024-05-25 1294/week @ 2024-06-01 1079/week @ 2024-06-08 988/week @ 2024-06-15 1305/week @ 2024-06-22 1086/week @ 2024-06-29 1030/week @ 2024-07-06 1116/week @ 2024-07-13

每月下载量4,700
10 个crate中使用 (直接使用8个)

自定义许可证

72KB
1.5K SLoC

license Build Status Latest version Documentation

ical-rs

这个库解析了RFC5545中定义的iCalendar格式,以及类似vCard的格式。

可能有一些问题需要解决,但这个库应该适用于大多数情况。如果您想帮忙,并想讨论任何API更改,请联系我或创建一个问题。

最初的目标是将JavaScript库ical.js移植过来。最初从它那里借鉴了很多代码/算法;但为了使其更具“Rusty”风格,进行了完全重写。

文档

安装

将以下内容放入您的Cargo.toml

[dependencies]
ical = "0.10"

概述

根据您想要解析的级别,使用ical crate有几种方法。在未来的版本中可能会出现一些新的包装器/格式化程序。

默认情况下,所有功能都包含在内,但您可以在项目中只包含您需要的功能。

警告

解析器(PropertyParserIcalParser)仅解析内容并将不区分大小写的字段转换为大写。不会检查字段的合法性。

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