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

Last change on this file since 81745 was 81745, checked in by xdjuj@…, 6 years ago

Houuuuuu la vilaine coquille que même que ça plantait.

File size: 5.2 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(
38                            $package->getFromName( $this->absoluteZipPath(dirname($rel["Target"]) . "/" . dirname($slideRel["Target"]) . "/" . basename($slideRel["Target"])) )
39                        );
40                        // Search for slide notes
41                        $slideNotesRelations = simplexml_load_string($package->getFromName( $this->absoluteZipPath(dirname($rel["Target"]) . "/" . dirname($slideRel["Target"]) . "/_rels/" . basename($slideRel["Target"]) . ".rels")) );                                             
42                        foreach ($slideNotesRelations->Relationship as $slideNoteRel) {
43                            if ($slideNoteRel["Type"] == SimplePPTX::SCHEMA_SLIDENOTESRELATION) {
44                                // Found slide notes!
45                                $slideNotes[ str_replace( 'rId', '', (string)$slideRel["Id"] ) ] = simplexml_load_string(
46                                    $package->getFromName( $this->absoluteZipPath(dirname($rel["Target"]) . "/" . dirname($slideRel["Target"]) . "/" . dirname($slideNoteRel["Target"]) . "/" . basename($slideNoteRel["Target"])) )
47                                );
48
49                                break;
50                            }
51                        }
52                                               
53                                         }
54                                }                               
55                         break;
56                        }
57                }
58               
59                // Sort slides
60        ksort($slides);
61        ksort($slideNotes);
62               
63        // Extract contents from slides
64        foreach ($slides as $slideKey => $slide) {
65            // Register namespaces
66            $slide->registerXPathNamespace("p", SimplePPTX::SCHEMA_PRESENTATIONML);
67            $slide->registerXPathNamespace("a", SimplePPTX::SCHEMA_DRAWINGML);
68
69            // Fetch all text
70            $textElements = $slide->xpath('//a:t');
71            foreach ($textElements as $textElement) {
72                $documentBody[] = (string)$textElement;
73            }
74
75            // Extract contents from slide notes
76            if (isset($slideNotes[$slideKey])) {
77                // Fetch slide note
78                $slideNote = $slideNotes[$slideKey];
79
80                // Register namespaces
81                $slideNote->registerXPathNamespace("p", SimplePPTX::SCHEMA_PRESENTATIONML);
82                $slideNote->registerXPathNamespace("a", SimplePPTX::SCHEMA_DRAWINGML);
83
84                // Fetch all text
85                $textElements = $slideNote->xpath('//a:t');
86                foreach ($textElements as $textElement) {
87                    $documentBody[] = (string)$textElement;
88                }
89            }
90        }
91               
92        // Close file
93        $package->close();
94        // Store filename
95        $this->nom_fichier = $fileName;
96
97            // Store contents
98        if ($storeContent) {
99                   $this->contenu = implode(' ', $documentBody);
100        } 
101
102               
103        }
104       
105        function absoluteZipPath($path) {
106        $path = str_replace(array('/', '\\'), DIRECTORY_SEPARATOR, $path);
107        $parts = array_filter(explode(DIRECTORY_SEPARATOR, $path), 'strlen');
108        $absolutes = array();
109        foreach ($parts as $part) {
110            if ('.' == $part) continue;
111            if ('..' == $part) {
112                array_pop($absolutes);
113            } else {
114                $absolutes[] = $part;
115            }
116        }
117        return implode('/', $absolutes);
118    }
119}
120?>
Note: See TracBrowser for help on using the repository browser.