source: spip-zone/_plugins_/fulltext/trunk/lib/simplepptx.class.php @ 85892

Last change on this file since 85892 was 85892, checked in by kent1@…, 5 years ago

Indentation

File size: 4.4 KB
Line 
1<?php
2
3if (!defined("_ECRIRE_INC_VERSION")) return;
4
5// Classe SimplePPTX v0.1 pour SPIP.
6// Tres inspire de Zend Search Lucene (http://www.chisimba.com/apidocs/fwdocs/Zend_Search_Lucene/Document/Zend_Search_Lucene_Document_Pptx.html) et de la classe SimpleXLSX de Sergey Schuchkin
7
8class SimplePPTX {
9        // scheme
10        const SCHEMA_OFFICEDOCUMENT = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument';
11        const SCHEMA_PRESENTATIONML = 'http://schemas.openxmlformats.org/presentationml/2006/main';
12        const SCHEMA_DRAWINGML = 'http://schemas.openxmlformats.org/drawingml/2006/main';
13        const SCHEMA_SLIDERELATION = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/slide';
14        const SCHEMA_SLIDENOTESRELATION = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/notesSlide';
15
16        function __construct($fileName, $storeContent) {
17                // Document data holders
18                $slides = array();
19                $slideNotes = array();
20                $documentBody = array();
21                $coreProperties = array();
22
23                // Open OpenXML package
24                $package = new ZipArchive();
25                $package -> open($fileName);
26
27                // Read relations and search for officeDocument
28                $relationsXml = $package -> getFromName('_rels/.rels');
29                $relations = simplexml_load_string($relationsXml);
30                foreach ($relations->Relationship as $rel) {
31                        if ($rel["Type"] == SimplePPTX::SCHEMA_OFFICEDOCUMENT) {
32                                // Found office document! Search for slides...
33                                $slideRelations = simplexml_load_string($package -> getFromName($this -> absoluteZipPath(dirname($rel["Target"]) . "/_rels/" . basename($rel["Target"]) . ".rels")));
34                                foreach ($slideRelations->Relationship as $slideRel) {
35                                        if ($slideRel["Type"] == SimplePPTX::SCHEMA_SLIDERELATION) {
36                                                // Found slide!
37                                                $slides[str_replace('rId', '', (string)$slideRel["Id"])] = simplexml_load_string($package -> getFromName($this -> absoluteZipPath(dirname($rel["Target"]) . "/" . dirname($slideRel["Target"]) . "/" . basename($slideRel["Target"]))));
38                                                // Search for slide notes
39                                                $slideNotesRelations = simplexml_load_string($package -> getFromName($this -> absoluteZipPath(dirname($rel["Target"]) . "/" . dirname($slideRel["Target"]) . "/_rels/" . basename($slideRel["Target"]) . ".rels")));
40                                                foreach ($slideNotesRelations->Relationship as $slideNoteRel) {
41                                                        if ($slideNoteRel["Type"] == SimplePPTX::SCHEMA_SLIDENOTESRELATION) {
42                                                                // Found slide notes!
43                                                                $slideNotes[str_replace('rId', '', (string)$slideRel["Id"])] = simplexml_load_string($package -> getFromName($this -> absoluteZipPath(dirname($rel["Target"]) . "/" . dirname($slideRel["Target"]) . "/" . dirname($slideNoteRel["Target"]) . "/" . basename($slideNoteRel["Target"]))));
44
45                                                                break;
46                                                        }
47                                                }
48
49                                        }
50                                }
51                                break;
52                        }
53                }
54
55                // Sort slides
56                ksort($slides);
57                ksort($slideNotes);
58
59                // Extract contents from slides
60                foreach ($slides as $slideKey => $slide) {
61                        // Register namespaces
62                        $slide -> registerXPathNamespace("p", SimplePPTX::SCHEMA_PRESENTATIONML);
63                        $slide -> registerXPathNamespace("a", SimplePPTX::SCHEMA_DRAWINGML);
64
65                        // Fetch all text
66                        $textElements = $slide -> xpath('//a:t');
67                        foreach ($textElements as $textElement) {
68                                $documentBody[] = (string)$textElement;
69                        }
70
71                        // Extract contents from slide notes
72                        if (isset($slideNotes[$slideKey])) {
73                                // Fetch slide note
74                                $slideNote = $slideNotes[$slideKey];
75
76                                // Register namespaces
77                                $slideNote -> registerXPathNamespace("p", SimplePPTX::SCHEMA_PRESENTATIONML);
78                                $slideNote -> registerXPathNamespace("a", SimplePPTX::SCHEMA_DRAWINGML);
79
80                                // Fetch all text
81                                $textElements = $slideNote -> xpath('//a:t');
82                                foreach ($textElements as $textElement) {
83                                        $documentBody[] = (string)$textElement;
84                                }
85                        }
86                }
87
88                // Close file
89                $package -> close();
90                // Store filename
91                $this -> nom_fichier = $fileName;
92
93                // Store contents
94                if ($storeContent) {
95                        $this -> contenu = implode(' ', $documentBody);
96                }
97
98        }
99
100        function absoluteZipPath($path) {
101                $path = str_replace(array('/', '\\'), DIRECTORY_SEPARATOR, $path);
102                $parts = array_filter(explode(DIRECTORY_SEPARATOR, $path), 'strlen');
103                $absolutes = array();
104                foreach ($parts as $part) {
105                        if ('.' == $part)
106                                continue;
107                        if ('..' == $part) {
108                                array_pop($absolutes);
109                        } else {
110                                $absolutes[] = $part;
111                        }
112                }
113                return implode('/', $absolutes);
114        }
115
116}
117?>
Note: See TracBrowser for help on using the repository browser.