├── CHANGELOG.md ├── phpstan.neon ├── ecs.php ├── src ├── translations │ └── en │ │ └── icalendar.php ├── services │ ├── Parse.php │ └── Convert.php ├── variables │ └── ICalendarVariable.php ├── twigextensions │ └── ICalendarTwigExtension.php ├── ICalendar.php └── icon.svg ├── Makefile ├── LICENSE.md ├── composer.json └── README.md /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # iCalendar Changelog 2 | 3 | ## 5.0.0 - 2024.10.09 4 | ### Added 5 | * Initial Craft CMS 5 release 6 | -------------------------------------------------------------------------------- /phpstan.neon: -------------------------------------------------------------------------------- 1 | includes: 2 | - %currentWorkingDirectory%/vendor/craftcms/phpstan/phpstan.neon 3 | 4 | parameters: 5 | level: 5 6 | paths: 7 | - src 8 | -------------------------------------------------------------------------------- /ecs.php: -------------------------------------------------------------------------------- 1 | paths([ 8 | __DIR__ . '/src', 9 | __FILE__, 10 | ]); 11 | $ecsConfig->parallel(); 12 | $ecsConfig->sets([SetList::CRAFT_CMS_4]); 13 | }; 14 | -------------------------------------------------------------------------------- /src/translations/en/icalendar.php: -------------------------------------------------------------------------------- 1 | '{name} plugin loaded', 18 | ]; 19 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | MAJOR_VERSION?=5 2 | PLUGINDEV_PROJECT_DIR?=/Users/andrew/webdev/sites/plugindev/cms_v${MAJOR_VERSION}/ 3 | VENDOR?=nystudio107 4 | PROJECT_PATH?=${VENDOR}/$(shell basename $(CURDIR)) 5 | 6 | .PHONY: dev docs release 7 | 8 | # Start up the buildchain dev server 9 | dev: 10 | # Start up the docs dev server 11 | docs: 12 | ${MAKE} -C docs/ dev 13 | # Run code quality tools, tests, and build the buildchain & docs in preparation for a release 14 | release: --code-quality --code-tests --buildchain-clean-build --docs-clean-build 15 | # The internal targets used by the dev & release targets 16 | --buildchain-clean-build: 17 | --code-quality: 18 | ${MAKE} -C ${PLUGINDEV_PROJECT_DIR} -- ecs check vendor/${PROJECT_PATH}/src --fix 19 | ${MAKE} -C ${PLUGINDEV_PROJECT_DIR} -- phpstan analyze -c vendor/${PROJECT_PATH}/phpstan.neon 20 | --code-tests: 21 | --docs-clean-build: 22 | ${MAKE} -C docs/ clean 23 | ${MAKE} -C docs/ image-build 24 | ${MAKE} -C docs/ fix 25 | -------------------------------------------------------------------------------- /src/services/Parse.php: -------------------------------------------------------------------------------- 1 | convert->rfc2445($text)); 39 | } 40 | 41 | /** 42 | * Return the ICal object (or null) for the events feed 43 | * 44 | * @param mixed|array|string $files 45 | * @param array $config 46 | * 47 | * @return ICal 48 | */ 49 | public function ics(mixed $files, array $config = []): ICal 50 | { 51 | return ICalendar::$plugin->parse->ics($files, $config); 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /src/twigextensions/ICalendarTwigExtension.php: -------------------------------------------------------------------------------- 1 | [iCalendar Documentation](https://nystudio107.com/plugins/icalendar/documentation) 32 | 33 | ## iCalendar Roadmap 34 | 35 | Some things to do, and ideas for potential features: 36 | 37 | * Release it 38 | 39 | Brought to you by [nystudio107](https://nystudio107.com) 40 | -------------------------------------------------------------------------------- /src/ICalendar.php: -------------------------------------------------------------------------------- 1 | ConvertService::class, 75 | 'parse' => ParseService::class, 76 | ]; 77 | 78 | parent::__construct($id, $parent, $config); 79 | } 80 | 81 | /** 82 | * @inheritdoc 83 | */ 84 | public function init(): void 85 | { 86 | parent::init(); 87 | self::$plugin = $this; 88 | self::$variable = new ICalendarVariable(); 89 | // Register Twig extension 90 | Craft::$app->view->registerTwigExtension(new ICalendarTwigExtension()); 91 | // Register variable 92 | Event::on( 93 | CraftVariable::class, 94 | CraftVariable::EVENT_INIT, 95 | static function(Event $event) { 96 | /** @var CraftVariable $variable */ 97 | $variable = $event->sender; 98 | $variable->set('icalendar', self::$variable); 99 | } 100 | ); 101 | 102 | Craft::info( 103 | Craft::t( 104 | 'icalendar', 105 | '{name} plugin loaded', 106 | ['name' => $this->name] 107 | ), 108 | __METHOD__ 109 | ); 110 | } 111 | 112 | // Protected Methods 113 | // ========================================================================= 114 | } 115 | -------------------------------------------------------------------------------- /src/services/Convert.php: -------------------------------------------------------------------------------- 1 | \r", "
\r"], self::RFC2455_LITERAL_NEWLINE . self::RFC2455_LITERAL_NEWLINE, $text); 48 | $text = str_replace(["