{"id":16171332,"url":"https://github.com/bmarsaud/calendar-shaper","last_synced_at":"2025-10-03T17:35:51.128Z","repository":{"id":90229603,"uuid":"217713607","full_name":"bmarsaud/calendar-shaper","owner":"bmarsaud","description":"🗓️ iCalendar proxy reshaping the data for your needs","archived":false,"fork":false,"pushed_at":"2022-05-20T21:13:58.000Z","size":46,"stargazers_count":2,"open_issues_count":1,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-02-13T11:52:39.072Z","etag":null,"topics":["calendar","data-transformation","icalendar","proxy"],"latest_commit_sha":null,"homepage":null,"language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/bmarsaud.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2019-10-26T13:35:17.000Z","updated_at":"2023-09-08T17:59:32.000Z","dependencies_parsed_at":null,"dependency_job_id":"b53ecb6b-ffba-4c04-a145-125428d15095","html_url":"https://github.com/bmarsaud/calendar-shaper","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bmarsaud%2Fcalendar-shaper","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bmarsaud%2Fcalendar-shaper/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bmarsaud%2Fcalendar-shaper/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bmarsaud%2Fcalendar-shaper/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/bmarsaud","download_url":"https://codeload.github.com/bmarsaud/calendar-shaper/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247615481,"owners_count":20967182,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["calendar","data-transformation","icalendar","proxy"],"created_at":"2024-10-10T03:21:47.359Z","updated_at":"2025-10-03T17:35:46.067Z","avatar_url":"https://github.com/bmarsaud.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# calendar-shaper\n\nAn iCalendar \u0026#128467; proxy that allows you to shape the data to your needs for a better integration in your beloved calendar client.\n\n## How it works ?\ncalendar-shaper forwards all requests that it receive to the calendar server, receives the response, applies a set of rules and transformations and forwards it back to the client.\n\nAll configured calendars configured will be accessible using their name on the host.\n\nThere are 3 type of rules that allow you to process the data at a certain level of the calendar : for the whole file, at an event level and at a tag level.\nThus a deep personalisation is possible.\n\nYou can configure the calendars rule by editing the `calendars.json` file under the `config` folder.\n\n## Build\ncalendar-shaper use Maven for its build, and can be simply built using the `package` job :\n```bash\nmvn clean compile package\n```\n\n## General configuration\nYou can configure the general properties of calendar-shaper by editing the `config/config.json` file.\n\nList of properties available :\n\n|Property|Description|Default value|\n|---|---|---|\n|`port`|The port the server will be started to|80|\n\n## Calendars configuration\ncalendar-shaper can handle multiple calendars. Each one will be available from the outside using its name.\n\nThe `config/calendar.json` file represents a list of calendar object.\nEach calendar is defined by a name, the server URL to forward requests and a list of rules.\n\nExample of a calendar with an empty set of rules:\n```json\n{\n    \"name\": \"4-ifa\",\n    \"url\": \"https://ade.insa-lyon.fr/4-ifa\",\n    \"rules\": [ ]\n}\n```\n\nYou can find example of calendars configuration under the [example](example) folder.\n\n### The rules\nThere are 3 types of rules :\n* `CalendarRule` are rules that apply on the whole calendar\n* `EventRule` are rules that apply on each event of the calendar\n* `TagRule` are rules that apply on each values of a certain tag within the event context\n\nAll rules are composed of a type and a list of transformation. Note that the `TagRule` has an additional property : the tag name.\n\nExample of a TagRule with an empty set of transformations:\n\n```json\n{\n    \"type\": \"TagRule\",\n    \"tag\": \"DESCRIPTION\",\n    \"transformations\": [ ]\n}\n```\n\n### The transformations\nThe transformations are the concept that allows you modify your data according to your configuration.\\\nEach transformation is defined by a type and a set of parameters.\n\nYou can combined as many transformations as you want. All will be executed in the given order.\n\nExample of a ReplaceTransformation :\n```json\n{\n    \"type\": \"Replace\",\n    \"params\": {\n        \"regex\": \"wrong\",\n        \"replacement\": \"right\"\n    }\n}\n```\n\n#### Remove\nRemoves all occurrences of a regex pattern found \n\n|Parameter|Description|\n|---|---|\n|`regex`|The pattern to be removed|\n\n#### Replace\nReplaces all occurrences of a regex pattern by a literal string.\n \n|Parameter|Description|\n|---|---|\n|`regex`|The pattern to find|\n|`replacement`|The string literal to replace to|\n\n#### FindAndReplace\nReplaces all occurrences of a regex pattern by the value of a replacement pattern.\nYou can specify the regex group to use for both pattern.\n \n|Parameter|Description|\n|---|---|\n|`findRegex`|The pattern to find|\n|`findGroupId`|The group index to replace inside the pattern|\n|`replaceRegex`|The pattern that will replace the found one|\n|`replaceGroupId`|The group index inside the replace pattern to use as a replacement|\n\n#### Selection\nSelects only a part of the data defined by a regex pattern.\n\n|Parameter|Description|\n|---|---|\n|`regex`|The pattern to replace the data by|\n|`groupId`|The group index inside the pattern|\n\n#### TagValue\nReplaces the data by the value of a given tag.\n\nIf you are in a `CalendarRule` the first occurrence of the tag will be used.\\\nIf you are in a `TagRule` the value will be taken in the nearest `VEVENT` parent.\n\n|Parameter|Description|\n|---|---|\n|`tag`|The tag to extract the value from|\n\n#### SetValue\nReplaces the data by a literal string.\n\n|Parameter|Description|\n|---|---|\n|`value`|The value to replace the data by|\n\n## Docker image\nA docker image is available under the `docker` folder.\\\nIt can be easily built using the `build.sh` script configured to your needs.\n\nYou probably want to access your configuration from the outside of the container.\nYou can create a volume pointing to `/opt/calendar-shaper/config` folder.\n\n```bash\ndocker run -p 80:80 -v /my/cfg/fldr:/opt/calendar-shaper/config -d bmarsaud/calendar-shaper\n```\n\n## Dependencies\n* Java 11\n* [gson](https://github.com/google/gson) - JSON serialization/deserialization library\n* [log4j](https://logging.apache.org/log4j/2.x/) - Logging library\n\n## Contributors\nBrought to you with ❤️ by :\n\n|Name|Role|\n|---|---|\n|Bastien Marsaud|Developer|","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbmarsaud%2Fcalendar-shaper","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbmarsaud%2Fcalendar-shaper","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbmarsaud%2Fcalendar-shaper/lists"}