From c894fd2752e09eb6a26153fe4c74b31151d19f37 Mon Sep 17 00:00:00 2001 From: shish Date: Tue, 11 Dec 2007 18:40:44 +0000 Subject: [PATCH] SVG handler git-svn-id: file:///home/shish/svn/shimmie2/trunk@658 7f39781d-f577-437e-ae19-be835c7a54ca --- contrib/handle_svg/main.php | 79 +++++++++++++++++++++++++++++++++++ contrib/handle_svg/theme.php | 15 +++++++ contrib/handle_svg/thumb.jpg | Bin 0 -> 5619 bytes 3 files changed, 94 insertions(+) create mode 100644 contrib/handle_svg/main.php create mode 100644 contrib/handle_svg/theme.php create mode 100644 contrib/handle_svg/thumb.jpg diff --git a/contrib/handle_svg/main.php b/contrib/handle_svg/main.php new file mode 100644 index 00000000..9617bcb7 --- /dev/null +++ b/contrib/handle_svg/main.php @@ -0,0 +1,79 @@ + + * Description: Handle SVG files + */ + +class SVGFileHandler extends Extension { + var $theme; + + public function receive_event($event) { + if(is_null($this->theme)) $this->theme = get_theme_object("handle_svg", "SVGFileHandlerTheme"); + + if(is_a($event, 'DataUploadEvent') && $event->type == "svg" && $this->check_contents($event->tmpname)) { + $hash = $event->hash; + $ha = substr($hash, 0, 2); + if(!copy($event->tmpname, "images/$ha/$hash")) { + $event->veto("SVG Handler failed to move file from uploads to archive"); + return; + } + send_event(new ThumbnailGenerationEvent($event->hash, $event->type)); + $image = $this->create_image_from_data("images/$ha/$hash", $event->metadata); + if(is_null($image)) { + $event->veto("SVG Handler failed to create image object from data"); + return; + } + send_event(new ImageAdditionEvent($event->user, $image)); + } + + if(is_a($event, 'ThumbnailGenerationEvent') && $event->type == "svg") { + $hash = $event->hash; + $ha = substr($hash, 0, 2); + // FIXME: scale image, as not all boards use 192x192 + copy("ext/handle_svg/thumb.jpg", "thumbs/$ha/$hash"); + } + + if(is_a($event, 'DisplayingImageEvent') && $event->image->ext == "svg") { + $this->theme->display_image($event->page, $event->image); + } + + if(is_a($event, 'PageRequestEvent') && ($event->page_name == "get_svg")) { + global $database; + $id = int_escape($event->get_arg(0)); + $image = $database->get_image($id); + $hash = $image->hash; + $ha = substr($hash, 0, 2); + + $event->page->set_type("image/svg+xml"); + $event->page->set_mode("data"); + $event->page->set_data(file_get_contents("images/$ha/$hash")); + } + } + + private function create_image_from_data($filename, $metadata) { + global $config; + + $image = new Image(); + + // FIXME: ugh, xml parsing :| + $image->width = 0; + $image->height = 0; + + $image->filesize = $metadata['size']; + $image->hash = $metadata['hash']; + $image->filename = $metadata['filename']; + $image->ext = $metadata['extension']; + $image->tag_array = tag_explode($metadata['tags']); + $image->source = $metadata['source']; + + return $image; + } + + private function check_contents($file) { + // FIXME: magic header? + return (file_exists($file)); + } +} +add_event_listener(new SVGFileHandler()); +?> diff --git a/contrib/handle_svg/theme.php b/contrib/handle_svg/theme.php new file mode 100644 index 00000000..15ef3a2a --- /dev/null +++ b/contrib/handle_svg/theme.php @@ -0,0 +1,15 @@ +id}/{$image->id}.svg"); + // FIXME: object and embed have "height" and "width" + $html = " + + + + "; + $page->add_block(new Block("Image", $html, "main", 0)); + } +} +?> diff --git a/contrib/handle_svg/thumb.jpg b/contrib/handle_svg/thumb.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d89117b53600b21921ecce3bbeaa3d21ff5597db GIT binary patch literal 5619 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