Skip to content

vectorjohn/cal-grep

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

10 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Calendar Pipe

Takes an iCal file and lets you filter and modify it like grep or sed do.

Sometimes a big shared group event calendar might be full of stuff you may or may not be interested in. You may like to add it to your personal calendar, but it would obscure all your existing events with stuff that doesn't interest you.

CLI Usage

cat calendar.ical | calpipe "Thursday" > filtered.ical
cat calendar.ical | calpipe -d monday,wednesday "standup" > filtered.ical
cat calendar.ical | calpipe -v "boring" > filtered.ical
  • -d <days> — filter events by day of week (comma-separated)
  • -v — invert the match
  • -h — show help

Library API

Reader

parseCalendar(input: Readable): Promise<Calendar> — parses an iCal stream into a Calendar object.

Writer

writeCalendar(calendar: Calendar): Readable — serializes a Calendar object back to iCal format.

Filters

withKeyword(keyword: string): (event: VEvent) => boolean — returns a predicate that matches events whose SUMMARY or DESCRIPTION contains the keyword (case-insensitive).

onDays(days: WeekDay[]): (event: VEvent) => boolean — returns a predicate that matches events whose DTSTART falls on any of the given days.

Types

interface Calendar {
  properties: Map<string, string>;
  events: VEvent[];
}

interface VEvent {
  properties: Map<string, string>;
}

enum VEventField {
  SUMMARY, DESCRIPTION, LOCATION, STATUS, UID,
  DTSTART, DTEND, CREATED, DTSTAMP, SEQUENCE, URL, CONTACT,
}

enum WeekDay {
  SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY,
}

Example

import { createReadStream } from "node:fs";
import { parseCalendar } from "calendar-pipe/ical-reader";
import { writeCalendar } from "calendar-pipe/ical-writer";
import { withKeyword, onDays } from "calendar-pipe/filters";
import { WeekDay } from "calendar-pipe/types";

const input = createReadStream("calendar.ical");
const calendar = await parseCalendar(input);

calendar.events = calendar.events
  .filter(withKeyword("standup"))
  .filter(onDays([WeekDay.MONDAY, WeekDay.WEDNESDAY, WeekDay.FRIDAY]));

const output = writeCalendar(calendar);
output.pipe(process.stdout);

About

Tools for manipulating ical files

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors