From 74bd6999c5e5c23ebbf90dbb6bdaabbddd7594cf Mon Sep 17 00:00:00 2001 From: sembrestels Date: Thu, 13 Oct 2011 15:23:11 +0200 Subject: Rename lib/dokuwiki to vendors/dokuwiki --- vendors/dokuwiki/lib/plugins/odt/ChangeLog.txt | 255 ++++ vendors/dokuwiki/lib/plugins/odt/README.txt | 16 + vendors/dokuwiki/lib/plugins/odt/ZipLib.class.php | 391 +++++++ vendors/dokuwiki/lib/plugins/odt/action.php | 41 + vendors/dokuwiki/lib/plugins/odt/conf/default.php | 7 + vendors/dokuwiki/lib/plugins/odt/conf/metadata.php | 8 + vendors/dokuwiki/lib/plugins/odt/info.txt | 8 + vendors/dokuwiki/lib/plugins/odt/lang/de/lang.php | 9 + vendors/dokuwiki/lib/plugins/odt/lang/en/lang.php | 12 + vendors/dokuwiki/lib/plugins/odt/lang/es/lang.php | 19 + vendors/dokuwiki/lib/plugins/odt/lang/fr/lang.php | 12 + vendors/dokuwiki/lib/plugins/odt/lang/it/lang.php | 7 + vendors/dokuwiki/lib/plugins/odt/lang/ja/lang.php | 12 + vendors/dokuwiki/lib/plugins/odt/lang/ru/lang.php | 12 + vendors/dokuwiki/lib/plugins/odt/lang/zh/lang.php | 12 + vendors/dokuwiki/lib/plugins/odt/odt.png | Bin 0 -> 3320 bytes vendors/dokuwiki/lib/plugins/odt/renderer.php | 1232 ++++++++++++++++++++ vendors/dokuwiki/lib/plugins/odt/styles.xml | 158 +++ vendors/dokuwiki/lib/plugins/odt/syntax.php | 96 ++ 19 files changed, 2307 insertions(+) create mode 100644 vendors/dokuwiki/lib/plugins/odt/ChangeLog.txt create mode 100644 vendors/dokuwiki/lib/plugins/odt/README.txt create mode 100644 vendors/dokuwiki/lib/plugins/odt/ZipLib.class.php create mode 100644 vendors/dokuwiki/lib/plugins/odt/action.php create mode 100644 vendors/dokuwiki/lib/plugins/odt/conf/default.php create mode 100644 vendors/dokuwiki/lib/plugins/odt/conf/metadata.php create mode 100644 vendors/dokuwiki/lib/plugins/odt/info.txt create mode 100644 vendors/dokuwiki/lib/plugins/odt/lang/de/lang.php create mode 100644 vendors/dokuwiki/lib/plugins/odt/lang/en/lang.php create mode 100644 vendors/dokuwiki/lib/plugins/odt/lang/es/lang.php create mode 100644 vendors/dokuwiki/lib/plugins/odt/lang/fr/lang.php create mode 100644 vendors/dokuwiki/lib/plugins/odt/lang/it/lang.php create mode 100644 vendors/dokuwiki/lib/plugins/odt/lang/ja/lang.php create mode 100644 vendors/dokuwiki/lib/plugins/odt/lang/ru/lang.php create mode 100644 vendors/dokuwiki/lib/plugins/odt/lang/zh/lang.php create mode 100644 vendors/dokuwiki/lib/plugins/odt/odt.png create mode 100644 vendors/dokuwiki/lib/plugins/odt/renderer.php create mode 100644 vendors/dokuwiki/lib/plugins/odt/styles.xml create mode 100644 vendors/dokuwiki/lib/plugins/odt/syntax.php (limited to 'vendors/dokuwiki/lib/plugins/odt') diff --git a/vendors/dokuwiki/lib/plugins/odt/ChangeLog.txt b/vendors/dokuwiki/lib/plugins/odt/ChangeLog.txt new file mode 100644 index 000000000..4c9835a1d --- /dev/null +++ b/vendors/dokuwiki/lib/plugins/odt/ChangeLog.txt @@ -0,0 +1,255 @@ +2010-07-17 Aurélien Bompard + + * action.php, syntax.php: Better handling of the cache system The + template used for the ODT export is now added in the page's + dependencies, so the cached ODT page will not be used if the + template has been updated. + +2010-05-24 Aurélien Bompard + + * lang/ru/lang.php, lang/ru/settings.php: Add translation by Yuri + Timofeev + +2010-05-12 Aurélien Bompard + + * lang/zh/lang.php, lang/zh/settings.php: Add Chinese translation by + lainme + +2010-04-04 Aurélien Bompard + + * ChangeLog, ChangeLog.txt: Add .txt to the ChangeLog for our + Windows-based friends + +2010-04-04 Aurélien Bompard + + * ChangeLog: Cleanup changelog + +2010-04-04 Aurélien Bompard + + * renderer.php: Fix a small syntax error + +2010-04-04 Aurélien Bompard + + * renderer.php: Better tag replacement in the template ODT file + +2010-04-04 Aurélien Bompard + + * README.txt, info.txt: Prepare for a new release + +2010-04-04 Aurélien Bompard + + * renderer.php: Add options to cut off a part of the ODT template + In an ODT file, the only styles that will be saved are the styles + which are applied to some content in the document. If you want to + create an empty ODT document for this plugin, and still want to + define styles which will be applied to the wiki content, you have to + write some dummy text, apply the styles to this text, and surround + the text in the DOKUWIKI-ODT-CUT-START and DOKUWIKI-ODT-CUT-STOP + tags. This way, the styles will be retained in the ODT file, but the + dummy text will be removed on export. + +2010-04-04 Aurélien Bompard + + * renderer.php: Better tag replacement in the template ODT file + +2010-04-04 Aurélien Bompard + + * renderer.php: Better tag replacement in the template ODT file + +2010-04-04 Aurélien Bompard + + * renderer.php: replace with unicode entities instead of HTML (not + always defined) + +2009-08-15 Martin Braure de Calignon + + * syntax.php: Fix button link to export old revisions + +2009-07-02 Aurélien Bompard + + * ChangeLog, info.txt: prepare for release + +2009-07-02 Aurélien Bompard + + * ChangeLog, renderer.php: Fixes from Andy Webber (thanks !) + +2009-06-07 Aurélien Bompard + + * ChangeLog, renderer.php: use $['savedir'] as suggested on the wiki + page + +2009-06-07 Aurélien Bompard + + * ChangeLog, info.txt: release + +2009-06-07 Aurélien Bompard + + * renderer.php: add patch by Korsani + +2009-06-07 Aurélien Bompard + + * renderer.php: typo + +2009-02-11 Aurélien Bompard + + * info.txt, renderer.php: Make the renderer class a singleton Only + make a single instance of the renderer. This is needed for Dokuwiki + >= rc2009-02-06. For details, see: + http://bugs.splitbrain.org/index.php?do=details&task_id=1598 + +2009-02-09 Aurélien Bompard + + * renderer.php: Revert "Create zipper on-demand" This reverts + commit 5e746e84b62fb0fdcd5607d7f9abc636a7710e2e. + +2009-02-08 Aurélien Bompard + + * renderer.php: Create zipper on-demand + +2009-01-15 Aurélien Bompard + + * ChangeLog, info.txt: prepare for new release + +2009-01-15 Aurélien Bompard + + * ChangeLog, renderer.php: don't compress mimetype declaration + +2008-11-11 Aurélien Bompard + + * renderer.php: more safeguards. wiki:syntax now passes validators + +2008-09-28 Aurélien Bompard + + * lang/ja/lang.php, lang/ja/settings.php: Add Japanese translation + from Ikuo Obataya. Thanks ! + +2008-05-07 Aurélien Bompard + + * ChangeLog, info.txt: new release + +2008-05-07 Aurélien Bompard + + * ChangeLog: update ChangeLog + +2008-05-07 Aurélien Bompard + + * lang/es/lang.php, lang/es/settings.php: complete spanish + translation + +2008-05-07 Aurélien Bompard + + * renderer.php, syntax.php: leftover from history cleaning + +2008-05-07 Aurélien Bompard + + * lang/es/lang.php: spanish translation, 1st part + +2008-05-06 Aurélien Bompard + + * ChangeLog: add changelog in changelog... + +2008-05-05 Aurélien Bompard + + * ChangeLog: add ChangeLog (thanks to http://josefsson.org/git2cl/) + + +2008-05-05 Aurélien Bompard + + * README.txt, info.txt: update metadata for new release + +2008-05-05 Aurélien Bompard + + * renderer.php: use new headers/caching system if available + +2008-04-22 Aurélien Bompard + + * renderer.php: choose appropriate ZipLib file + +2008-04-21 Aurélien Bompard + + * renderer.php: dokuwiki's future temp dir is data/tmp, not + data/temp + +2008-04-08 Aurélien Bompard + + * README.txt, TODO, TODO.txt, info.txt: ready for release + +2008-04-08 Aurélien Bompard + + * lang/it/lang.php: add italian translation + +2008-04-07 Aurélien Bompard + + * README.txt, TODO, info.txt: get ready for release + +2008-03-08 Aurélien Bompard + + * .gitignore: ignore Makefile + +2008-03-06 Aurélien Bompard + + * renderer.php: fix quotes + +2008-03-06 root + + * renderer.php: extract template before checking for the styles + +2008-03-04 Aurélien Bompard + + * syntax.php: leftover + +2008-03-05 root + + * syntax.php: Revert "leftover" This reverts commit + 93d7c67d705f3a6a5847554b15384dc5a1a50de6. + +2008-03-05 root + + * renderer.php: fix tag in list items + +2008-03-04 Aurélien Bompard + + * syntax.php: leftover + +2008-03-04 Aurélien Bompard + + * renderer.php: cleanup for patch + +2008-03-04 Aurélien Bompard + + * README.txt, info.txt: even better doc + +2008-03-04 Aurélien Bompard + + * README.txt: better doc + +2008-03-04 Aurélien Bompard + + * README.txt: doc + +2008-03-03 Aurélien Bompard + + * renderer.php: spit into the fields plugin + +2008-03-01 Aurélien Bompard + + * TODO, renderer.php, styles.xml, syntax.php: closer to upstream + +2008-03-01 Aurélien Bompard + + * TODO, admin.php, conf/default.php, conf/metadata.php, + lang/de/lang.php, lang/en/lang.php, lang/en/settings.php, + lang/fr/lang.php, lang/fr/settings.php, renderer.php: niiice :) + +2008-02-29 Aurélien Bompard + + * admin.php, lang/en/lang.php: bla + +2008-02-28 Aurélien Bompard + + * admin.php, lang/en/lang.php: niice + +2008-05-07 Aurélien Bompard + + * initial commit from existing repo + diff --git a/vendors/dokuwiki/lib/plugins/odt/README.txt b/vendors/dokuwiki/lib/plugins/odt/README.txt new file mode 100644 index 000000000..3d4c97f8d --- /dev/null +++ b/vendors/dokuwiki/lib/plugins/odt/README.txt @@ -0,0 +1,16 @@ +====== Dokuwiki ODT plugin ====== + +This plugin lets you export wiki pages to ODT, the OpenDocument Text format as +used by many applications, included OpenOffice.org + +Further documentation on the OpenDocument format is available here : +http://en.wikipedia.org/wiki/OpenDocument + + +===== Official documentation ===== + +For installation and usage documentation, please refer to +http://www.dokuwiki.org/plugin:odt + +This version of the plugin works with Dokuwiki 2007-06-26 and later. + diff --git a/vendors/dokuwiki/lib/plugins/odt/ZipLib.class.php b/vendors/dokuwiki/lib/plugins/odt/ZipLib.class.php new file mode 100644 index 000000000..20e74a0e8 --- /dev/null +++ b/vendors/dokuwiki/lib/plugins/odt/ZipLib.class.php @@ -0,0 +1,391 @@ + + */ +class ZipLib +{ + + var $datasec, $ctrl_dir = array(); + var $eof_ctrl_dir = "\x50\x4b\x05\x06\x00\x00\x00\x00"; + var $old_offset = 0; var $dirs = Array("."); + + function get_List($zip_name) + { + $zip = @fopen($zip_name, 'rb'); + if(!$zip) return(0); + $centd = $this->ReadCentralDir($zip,$zip_name); + + @rewind($zip); + @fseek($zip, $centd['offset']); + + for ($i=0; $i<$centd['entries']; $i++) + { + $header = $this->ReadCentralFileHeaders($zip); + $header['index'] = $i;$info['filename'] = $header['filename']; + $info['stored_filename'] = $header['stored_filename']; + $info['size'] = $header['size'];$info['compressed_size']=$header['compressed_size']; + $info['crc'] = strtoupper(dechex( $header['crc'] )); + $info['mtime'] = $header['mtime']; $info['comment'] = $header['comment']; + $info['folder'] = ($header['external']==0x41FF0010||$header['external']==16)?1:0; + $info['index'] = $header['index'];$info['status'] = $header['status']; + $ret[]=$info; unset($header); + } + return $ret; + } + + function Add($files,$compact) + { + if(!is_array($files[0])) $files=Array($files); + + for($i=0;$files[$i];$i++){ + $fn = $files[$i]; + if(!in_Array(dirname($fn[0]),$this->dirs)) + $this->add_Dir(dirname($fn[0])); + if(basename($fn[0])) + $ret[basename($fn[0])]=$this->add_File($fn[1],$fn[0],$compact); + } + return $ret; + } + + /** + * Zips recursively the $folder directory, from the $basedir directory + */ + function Compress($folder, $basedir=null, $parent=null) + { + $full_path = $basedir."/".$parent.$folder; + $zip_path = $parent.$folder; + if ($zip_path) { + $zip_path .= "/"; + $this->add_dir($zip_path); + } + $dir = opendir($full_path); + while (false !== ($filename = readdir($dir))) { + if ($filename != "." && $filename != "..") { + if (is_dir($full_path."/".$filename)) { + $this->Compress($filename, $basedir, $zip_path); + } else { + $content = join('', file($full_path.'/'.$filename)); + $this->add_File($content, $zip_path.$filename); + } + } + } + } + + /** + * Returns the Zip file + */ + function get_file() + { + $data = implode('', $this -> datasec); + $ctrldir = implode('', $this -> ctrl_dir); + + return $data . $ctrldir . $this -> eof_ctrl_dir . + pack('v', sizeof($this -> ctrl_dir)).pack('v', sizeof($this -> ctrl_dir)). + pack('V', strlen($ctrldir)) . pack('V', strlen($data)) . "\x00\x00"; + } + + function add_dir($name) + { + $name = str_replace("\\", "/", $name); + $fr = "\x50\x4b\x03\x04\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x00"; + + $fr .= pack("V",0).pack("V",0).pack("V",0).pack("v", strlen($name) ); + $fr .= pack("v", 0 ).$name.pack("V", 0).pack("V", 0).pack("V", 0); + $this -> datasec[] = $fr; + + $new_offset = strlen(implode("", $this->datasec)); + + $cdrec = "\x50\x4b\x01\x02\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x00"; + $cdrec .= pack("V",0).pack("V",0).pack("V",0).pack("v", strlen($name) ); + $cdrec .= pack("v", 0 ).pack("v", 0 ).pack("v", 0 ).pack("v", 0 ); + $ext = "\xff\xff\xff\xff"; + $cdrec .= pack("V", 16 ).pack("V", $this -> old_offset ).$name; + + $this -> ctrl_dir[] = $cdrec; + $this -> old_offset = $new_offset; + $this -> dirs[] = $name; + } + + /** + * Add a file named $name from a string $data + */ + function add_File($data, $name, $compact = 1) + { + $name = str_replace('\\', '/', $name); + $dtime = dechex($this->DosTime()); + + $hexdtime = '\x' . $dtime[6] . $dtime[7].'\x'.$dtime[4] . $dtime[5] + . '\x' . $dtime[2] . $dtime[3].'\x'.$dtime[0].$dtime[1]; + eval('$hexdtime = "' . $hexdtime . '";'); + + if($compact) + $fr = "\x50\x4b\x03\x04\x14\x00\x00\x00\x08\x00".$hexdtime; + else $fr = "\x50\x4b\x03\x04\x0a\x00\x00\x00\x00\x00".$hexdtime; + $unc_len = strlen($data); $crc = crc32($data); + + if($compact){ + $zdata = gzcompress($data); $c_len = strlen($zdata); + $zdata = substr(substr($zdata, 0, strlen($zdata) - 4), 2); + }else{ + $zdata = $data; + } + $c_len=strlen($zdata); + $fr .= pack('V', $crc).pack('V', $c_len).pack('V', $unc_len); + $fr .= pack('v', strlen($name)).pack('v', 0).$name.$zdata; + + $fr .= pack('V', $crc).pack('V', $c_len).pack('V', $unc_len); + + $this -> datasec[] = $fr; + $new_offset = strlen(implode('', $this->datasec)); + if($compact) + $cdrec = "\x50\x4b\x01\x02\x00\x00\x14\x00\x00\x00\x08\x00"; + else $cdrec = "\x50\x4b\x01\x02\x14\x00\x0a\x00\x00\x00\x00\x00"; + $cdrec .= $hexdtime.pack('V', $crc).pack('V', $c_len).pack('V', $unc_len); + $cdrec .= pack('v', strlen($name) ).pack('v', 0 ).pack('v', 0 ); + $cdrec .= pack('v', 0 ).pack('v', 0 ).pack('V', 32 ); + $cdrec .= pack('V', $this -> old_offset ); + + $this -> old_offset = $new_offset; + $cdrec .= $name; + $this -> ctrl_dir[] = $cdrec; + return true; + } + + function DosTime() { + $timearray = getdate(); + if ($timearray['year'] < 1980) { + $timearray['year'] = 1980; $timearray['mon'] = 1; + $timearray['mday'] = 1; $timearray['hours'] = 0; + $timearray['minutes'] = 0; $timearray['seconds'] = 0; + } + return (($timearray['year'] - 1980) << 25) | ($timearray['mon'] << 21) | ($timearray['mday'] << 16) | ($timearray['hours'] << 11) | + ($timearray['minutes'] << 5) | ($timearray['seconds'] >> 1); + } + + /** + * Extract a zip file $zn to the $to directory + */ + function Extract ( $zn, $to, $index = Array(-1) ) + { + if(!@is_dir($to)) @mkdir($to,0777); + $ok = 0; $zip = @fopen($zn,'rb'); + if(!$zip) return(-1); + $cdir = $this->ReadCentralDir($zip,$zn); + $pos_entry = $cdir['offset']; + + if(!is_array($index)){ $index = array($index); } + for($i=0; isset($index[$i]);$i++){ + if(intval($index[$i])!=$index[$i]||$index[$i]>$cdir['entries']) + return(-1); + } + + for ($i=0; $i<$cdir['entries']; $i++) + { + @fseek($zip, $pos_entry); + $header = $this->ReadCentralFileHeaders($zip); + $header['index'] = $i; $pos_entry = ftell($zip); + @rewind($zip); fseek($zip, $header['offset']); + if(in_array("-1",$index)||in_array($i,$index)) + $stat[$header['filename']]=$this->ExtractFile($header, $to, $zip); + + } + fclose($zip); + return $stat; + } + + function ReadFileHeader($zip, $header) + { + $binary_data = fread($zip, 30); + $data = unpack('vchk/vid/vversion/vflag/vcompression/vmtime/vmdate/Vcrc/Vcompressed_size/Vsize/vfilename_len/vextra_len', $binary_data); + + $header['filename'] = fread($zip, $data['filename_len']); + if ($data['extra_len'] != 0) { + $header['extra'] = fread($zip, $data['extra_len']); + } else { $header['extra'] = ''; } + + $header['compression'] = $data['compression']; + $header['flag'] = $data['flag']; + $header['mdate'] = $data['mdate'];$header['mtime'] = $data['mtime']; + if (($header['flag'] & 8) != 8) { // Purpose bit flag bit 3 not set, overwrite the central header values + foreach (array('size','compressed_size','crc') as $hd) { + $header[$hd] = $data[$hd]; + } + } + + if ($header['mdate'] && $header['mtime']){ + $hour=($header['mtime']&0xF800)>>11;$minute=($header['mtime']&0x07E0)>>5; + $seconde=($header['mtime']&0x001F)*2;$year=(($header['mdate']&0xFE00)>>9)+1980; + $month=($header['mdate']&0x01E0)>>5;$day=$header['mdate']&0x001F; + $header['mtime'] = mktime($hour, $minute, $seconde, $month, $day, $year); + }else{$header['mtime'] = time();} + + $header['stored_filename'] = $header['filename']; + $header['status'] = "ok"; + return $header; + } + + function ReadCentralFileHeaders($zip){ + $binary_data = fread($zip, 46); + $header = unpack('vchkid/vid/vversion/vversion_extracted/vflag/vcompression/vmtime/vmdate/Vcrc/Vcompressed_size/Vsize/vfilename_len/vextra_len/vcomment_len/vdisk/vinternal/Vexternal/Voffset', $binary_data); + + if ($header['filename_len'] != 0) + $header['filename'] = fread($zip,$header['filename_len']); + else $header['filename'] = ''; + + if ($header['extra_len'] != 0) + $header['extra'] = fread($zip, $header['extra_len']); + else $header['extra'] = ''; + + if ($header['comment_len'] != 0) + $header['comment'] = fread($zip, $header['comment_len']); + else $header['comment'] = ''; + + if ($header['mdate'] && $header['mtime']) + { + $hour = ($header['mtime'] & 0xF800) >> 11; + $minute = ($header['mtime'] & 0x07E0) >> 5; + $seconde = ($header['mtime'] & 0x001F)*2; + $year = (($header['mdate'] & 0xFE00) >> 9) + 1980; + $month = ($header['mdate'] & 0x01E0) >> 5; + $day = $header['mdate'] & 0x001F; + $header['mtime'] = mktime($hour, $minute, $seconde, $month, $day, $year); + } else { + $header['mtime'] = time(); + } + $header['stored_filename'] = $header['filename']; + $header['status'] = 'ok'; + if (substr($header['filename'], -1) == '/') + $header['external'] = 0x41FF0010; + return $header; + } + + function ReadCentralDir($zip,$zip_name) + { + $size = filesize($zip_name); + if ($size < 277) $maximum_size = $size; + else $maximum_size=277; + + @fseek($zip, $size-$maximum_size); + $pos = ftell($zip); $bytes = 0x00000000; + + while ($pos < $size) + { + $byte = @fread($zip, 1); + $bytes=(($bytes << 8) & 0xFFFFFFFF) | Ord($byte); + if ($bytes == 0x504b0506){ $pos++; break; } $pos++; + } + + $data=unpack('vdisk/vdisk_start/vdisk_entries/ventries/Vsize/Voffset/vcomment_size', + fread($zip, 18)); + + if ($data['comment_size'] != 0) + $centd['comment'] = fread($zip, $data['comment_size']); + else $centd['comment'] = ''; $centd['entries'] = $data['entries']; + $centd['disk_entries'] = $data['disk_entries']; + $centd['offset'] = $data['offset'];$centd['disk_start'] = $data['disk_start']; + $centd['size'] = $data['size']; $centd['disk'] = $data['disk']; + return $centd; + } + + function ExtractFile($header,$to,$zip) + { + $header = $this->readfileheader($zip, $header); + + if(substr($to,-1)!="/") $to.="/"; + if(substr($header['filename'],-1)=="/") + { +// @mkdir($to.$header['filename']); --CS + $this->_mkdir($to.$header['filename']); //-- CS + return +2; + } + +// $pth = explode("/",dirname($header['filename'])); +// for($i=0,$tmp="";isset($pth[$i]);$i++){ +// if(!$pth[$i]) continue; +// if(!is_dir($to.$tmp.$pth[$i])) @mkdir($to.$pth[$i],0777); +// $tmp.=$pth[$i]."/"; +// } + if (!$this->_mkdir($to.dirname($header['filename']))) return (-1); //--CS + + if (!array_key_exists("external", $header) || (!($header['external']==0x41FF0010)&&!($header['external']==16))) + { + if ($header['compression']==0) + { + $fp = @fopen($to.$header['filename'], 'wb'); + if(!$fp) return(-1); + $size = $header['compressed_size']; + + while ($size != 0) + { + $read_size = ($size < 2048 ? $size : 2048); + $buffer = fread($zip, $read_size); + $binary_data = pack('a'.$read_size, $buffer); + @fwrite($fp, $binary_data, $read_size); + $size -= $read_size; + } + fclose($fp); + touch($to.$header['filename'], $header['mtime']); + + }else{ + if (!is_dir(dirname($to.$header['filename']))) $this->_mkdir(dirname($to.$header['filename'])); //-CS + $fp = fopen($to.$header['filename'].'.gz','wb'); + if(!$fp) return(-1); + $binary_data = pack('va1a1Va1a1', 0x8b1f, Chr($header['compression']), + Chr(0x00), time(), Chr(0x00), Chr(3)); + + fwrite($fp, $binary_data, 10); + $size = $header['compressed_size']; + + while ($size != 0) + { + $read_size = ($size < 1024 ? $size : 1024); + $buffer = fread($zip, $read_size); + $binary_data = pack('a'.$read_size, $buffer); + @fwrite($fp, $binary_data, $read_size); + $size -= $read_size; + } + + $binary_data = pack('VV', $header['crc'], $header['size']); + fwrite($fp, $binary_data,8); fclose($fp); + + $gzp = @gzopen($to.$header['filename'].'.gz','rb'); + if(!$gzp){ + @gzclose($gzp); @unlink($to.$header['filename']); + die("Archive is compressed whereas ZLIB is not enabled."); + } + $fp = @fopen($to.$header['filename'],'wb'); + if(!$fp) return(-1); + $size = $header['size']; + + while ($size != 0) + { + $read_size = ($size < 2048 ? $size : 2048); + $buffer = gzread($gzp, $read_size); + $binary_data = pack('a'.$read_size, $buffer); + @fwrite($fp, $binary_data, $read_size); + $size -= $read_size; + } + fclose($fp); gzclose($gzp); + + touch($to.$header['filename'], $header['mtime']); + @unlink($to.$header['filename'].'.gz'); + + }} + return true; + } + + //--CS start + // centralize mkdir calls and use dokuwiki io functions + function _mkdir($d) { + return io_mkdir_p($d); // --AB + //return ap_mkdir($d); + } + //--CS end +} + diff --git a/vendors/dokuwiki/lib/plugins/odt/action.php b/vendors/dokuwiki/lib/plugins/odt/action.php new file mode 100644 index 000000000..0ca861518 --- /dev/null +++ b/vendors/dokuwiki/lib/plugins/odt/action.php @@ -0,0 +1,41 @@ + + */ +// must be run within Dokuwiki +if(!defined('DOKU_INC')) die(); + +if(!defined('DOKU_PLUGIN')) define('DOKU_PLUGIN',DOKU_INC.'lib/plugins/'); +require_once(DOKU_PLUGIN.'action.php'); + +/** + * Add the template as a page dependency for the caching system + */ +class action_plugin_odt extends DokuWiki_Action_Plugin { + + function register($controller) { + $controller->register_hook('PARSER_CACHE_USE','BEFORE', $this, 'handle_cache_prepare'); + } + + function handle_cache_prepare(&$event, $param) { + global $conf, $ID; + $cache =& $event->data; + // only the ODT rendering mode needs caching tweaks + if ($cache->mode != "odt") return; + $odt_meta = p_get_metadata($ID, 'relation odt'); + $template_name = $odt_meta["template"]; + if (!$template_name) { + return; + } + $template_path = $conf['mediadir'].'/'.$this->getConf("tpl_dir")."/".$template_name; + if (file_exists($template_path)) { + $cache->depends['files'][] = $template_path; + } + } + +} + +//Setup VIM: ex: et ts=4 enc=utf-8 : diff --git a/vendors/dokuwiki/lib/plugins/odt/conf/default.php b/vendors/dokuwiki/lib/plugins/odt/conf/default.php new file mode 100644 index 000000000..d69966874 --- /dev/null +++ b/vendors/dokuwiki/lib/plugins/odt/conf/default.php @@ -0,0 +1,7 @@ + + */ + +// Directory of the templates in the media manager +$conf['tpl_dir'] = 'odt'; diff --git a/vendors/dokuwiki/lib/plugins/odt/conf/metadata.php b/vendors/dokuwiki/lib/plugins/odt/conf/metadata.php new file mode 100644 index 000000000..7614f3c73 --- /dev/null +++ b/vendors/dokuwiki/lib/plugins/odt/conf/metadata.php @@ -0,0 +1,8 @@ + + */ + +$meta['tpl_dir'] = array('string'); diff --git a/vendors/dokuwiki/lib/plugins/odt/info.txt b/vendors/dokuwiki/lib/plugins/odt/info.txt new file mode 100644 index 000000000..3006078be --- /dev/null +++ b/vendors/dokuwiki/lib/plugins/odt/info.txt @@ -0,0 +1,8 @@ +# General Plugin Info do not edit + +author Andreas Gohr, Aurelien Bompard +email andi@splitbrain.org, aurelien@bompard.org +date 2010-07-24 +name Open Document Plugin +desc Export the current Wiki page to a OpenOffice ODT file +url http://www.dokuwiki.org/plugin:odt diff --git a/vendors/dokuwiki/lib/plugins/odt/lang/de/lang.php b/vendors/dokuwiki/lib/plugins/odt/lang/de/lang.php new file mode 100644 index 000000000..607ff99e3 --- /dev/null +++ b/vendors/dokuwiki/lib/plugins/odt/lang/de/lang.php @@ -0,0 +1,9 @@ + + */ + + +// settings must be present and set appropriately for the language +$lang['encoding'] = 'utf-8'; +$lang['direction'] = 'ltr'; + +// export button +$lang['view'] = 'Exportar página en formato Open Document'; + +// template not found in the directory +$lang['tpl_not_found'] = 'ATENCION : la plantilla ODT "%s" no ha sido encontrada en el directorio de plantillas "%s". Se usa la plantilla por defecto.'; + diff --git a/vendors/dokuwiki/lib/plugins/odt/lang/fr/lang.php b/vendors/dokuwiki/lib/plugins/odt/lang/fr/lang.php new file mode 100644 index 000000000..4290573ec --- /dev/null +++ b/vendors/dokuwiki/lib/plugins/odt/lang/fr/lang.php @@ -0,0 +1,12 @@ + + */ + +$lang['view'] = 'Esporta pagina in formato Open Document'; diff --git a/vendors/dokuwiki/lib/plugins/odt/lang/ja/lang.php b/vendors/dokuwiki/lib/plugins/odt/lang/ja/lang.php new file mode 100644 index 000000000..6df1be2d0 --- /dev/null +++ b/vendors/dokuwiki/lib/plugins/odt/lang/ja/lang.php @@ -0,0 +1,12 @@ + + * @author Aurelien Bompard + */ +// must be run within Dokuwiki +if(!defined('DOKU_INC')) die(); + +require_once DOKU_INC.'inc/parser/renderer.php'; + +// ZipLib.class.php +$dw_version = preg_replace('/[^\d]/', '', getversion()); +if (version_compare($dw_version, "20070626") and + version_compare(PHP_VERSION,'5.0.0','>')) { + // If strictly newer than 2007-06-26 and use PHP5, fixes to ZipLib are + // included in Dokuwiki's ZipLib + require_once DOKU_INC.'inc/ZipLib.class.php'; +} else { // for DW up to 2007-06-26, we need the patched version + require_once 'ZipLib.class.php'; +} + +/** + * The Renderer + */ +class renderer_plugin_odt extends Doku_Renderer { + var $ZIP = null; + var $meta; + var $store = ''; + var $footnotes = array(); + var $manifest = array(); + var $headers = array(); + var $template = ""; + var $fields = array(); + var $in_list_item = false; + var $in_paragraph = false; + // Automatic styles. Will always be added to content.xml and styles.xml + var $autostyles = array( + "pm1"=>' + + + + + + + ', + "sub"=>' + + + ', + "sup"=>' + + + ', + "del"=>' + + + ', + "underline"=>' + + + ', + "media"=>' + + + ', + "medialeft"=>' + + + ', + "mediaright"=>' + + + ', + "mediacenter"=>' + + + ', + "tablealigncenter"=>' + + + ', + "tablealignright"=>' + + + ', + "tablealignleft"=>' + + + ', + "tableheader"=>' + + + ', + "tablecell"=>' + + + ', + "legendcenter"=>' + + + ', + ); + // Regular styles. May not be present if in template mode, in which case they will be added to styles.xml + var $styles = array( + "Source_20_Text"=>' + + + ', + "Preformatted_20_Text"=>' + + + + ', + "Horizontal_20_Line"=>' + + + + ', + "Footnote"=>' + + + + ', + "Emphasis"=>' + + + ', + "Strong_20_Emphasis"=>' + + + ', + ); + // Font definitions. May not be present if in template mode, in which case they will be added to styles.xml + var $fonts = array( + "StarSymbol"=>'', // for bullets + "Bitstream Vera Sans Mono"=>'', // for source code + ); + + /** + * Return version info + */ + function getInfo(){ + return confToHash(dirname(__FILE__).'/info.txt'); + } + + /** + * Returns the format produced by this renderer. + */ + function getFormat(){ + return "odt"; + } + + /** + * Do not make multiple instances of this class + */ + function isSingleton(){ + return true; + } + + + /** + * Initialize the rendering + */ + function document_start() { + global $ID; + + // If older or equal to 2007-06-26, we need to disable caching + $dw_version = preg_replace('/[^\d]/', '', getversion()); + if (version_compare($dw_version, "20070626", "<=")) { + $this->info["cache"] = false; + } + + // prepare the zipper + $this->ZIP = new ZipLib(); + + // prepare meta data + $this->meta = array( + 'meta:generator' => 'DokuWiki '.getversion(), + 'meta:initial-creator' => 'Generated', + 'meta:creation-date' => date('Y-m-d\\TH::i:s', null), //FIXME + 'dc:creator' => 'Generated', + 'dc:date' => date('Y-m-d\\TH::i:s', null), + 'dc:language' => 'en-US', + 'meta:editing-cycles' => '1', + 'meta:editing-duration' => 'PT0S', + ); + + // send the content type header, new method after 2007-06-26 (handles caching) + $output_filename = str_replace(':','-',$ID).".odt"; + if (version_compare($dw_version, "20070626")) { + // store the content type headers in metadata + $headers = array( + 'Content-Type' => 'application/vnd.oasis.opendocument.text', + 'Content-Disposition' => 'attachment; filename="'.$output_filename.'";', + ); + p_set_metadata($ID,array('format' => array('odt' => $headers) )); + } else { // older method + header('Content-Type: application/vnd.oasis.opendocument.text'); + header('Content-Disposition: attachment; filename="'.$output_filename.'";'); + } + } + + /** + * Prepare meta.xml + */ + function _odtMeta(){ + $value = '<' . '?xml version="1.0" encoding="UTF-8"?' . ">\n"; + $value .= ' $meta_value) + # $value .= '<' . $meta_key . '>' . ODUtils::encode($meta_value) . ''; + $value .= ''; + $value .= ''; + $this->ZIP->add_File($value,'meta.xml'); + } + + /** + * Prepare manifest.xml + */ + function _odtManifest(){ + $value = '<' . '?xml version="1.0" encoding="UTF-8"?' . ">\n"; + $value .= ''; + $value .= ''; + $value .= ''; + $value .= ''; + $value .= ''; + $value .= ''; + + foreach($this->manifest as $path => $type){ + $value .= ''; + } + + $value .= ''; + $this->ZIP->add_File($value,'META-INF/manifest.xml'); + } + + /** + * Prepare settings.xml + */ + function _odtSettings(){ + $value = '<' . '?xml version="1.0" encoding="UTF-8"?' . ">\n"; + $value .= 'true'; + $this->ZIP->add_File($value,'settings.xml'); + } + + + + + /** + * Closes the document + */ + function document_end(){ + global $conf; + if ($this->template) { // template chosen + if (file_exists($conf['mediadir'].'/'.$this->getConf("tpl_dir")."/".$this->template)) { //template found + $this->document_end_template(); + } else { // template chosen but not found : warn the user and use the default template + $this->doc = '' + .$this->_xmlEntities( sprintf($this->getLang('tpl_not_found'),$this->template,$this->getConf("tpl_dir")) ) + .''.$this->doc; + $this->document_end_scratch(); + } + } else { + $this->document_end_scratch(); + } + $this->doc = $this->ZIP->get_file(); + } + + + /** + * Closes the document when not using a template + */ + function document_end_scratch(){ + $autostyles = $this->_odtAutoStyles(); + $userfields = $this->_odtUserFields(); + + // add defaults + $this->ZIP->add_File('application/vnd.oasis.opendocument.text', 'mimetype', 0); + + $this->_odtMeta(); + $this->_odtSettings(); + + $value = '<' . '?xml version="1.0" encoding="UTF-8"?' . ">\n"; + $value .= 'doc; + $value .= ''; + $value .= ''; + $value .= ''; + + $this->ZIP->add_File($value,'content.xml'); + + $value = io_readFile(DOKU_PLUGIN.'odt/styles.xml'); + $value = str_replace('', $autostyles, $value); + $this->ZIP->add_File($value,'styles.xml'); + + // build final manifest + $this->_odtManifest(); + } + + /** + * Closes the document using a template + */ + function document_end_template(){ + global $conf, $ID; // for the temp dir + + // Temp dir + if (is_dir($conf['tmpdir'])) { + $temp_dir = $conf['tmpdir']; // version > 20070626 + } else { + $temp_dir = $conf['savedir'].'/cache/tmp'; // version <= 20070626 + } + $this->temp_dir = $temp_dir."/odt/".str_replace(':','-',$ID); + if (is_dir($this->temp_dir)) { $this->io_rm_rf($this->temp_dir); } + io_mkdir_p($this->temp_dir); + + // Extract template + $template_path = $conf['mediadir'].'/'.$this->getConf("tpl_dir")."/".$this->template; + $this->ZIP->Extract($template_path, $this->temp_dir); + + // Prepare content + $autostyles = $this->_odtAutoStyles(); + $missingstyles = $this->_odtStyles(); + $missingfonts = $this->_odtFonts(); + $userfields = $this->_odtUserFields(); + + // Insert content + $old_content = io_readFile($this->temp_dir.'/content.xml'); + if (strpos($old_content, 'DOKUWIKI-ODT-INSERT') !== FALSE) { // Replace the mark + $this->_odtReplaceInFile('/]*>DOKUWIKI-ODT-INSERT<\/text:p>/', + $this->doc, $this->temp_dir.'/content.xml', true); + } else { // Append to the template + $this->_odtReplaceInFile('', $this->doc.'', $this->temp_dir.'/content.xml'); + } + + // Cut off unwanted content + if (strpos($old_content, 'DOKUWIKI-ODT-CUT-START') !== FALSE + && strpos($old_content, 'DOKUWIKI-ODT-CUT-STOP') !== FALSE) { + $this->_odtReplaceInFile('/DOKUWIKI-ODT-CUT-START.*DOKUWIKI-ODT-CUT-STOP/', + '', $this->temp_dir.'/content.xml', true); + } + + // Insert userfields + if (strpos($old_content, "text:user-field-decls") === FALSE) { // no existing userfields + $this->_odtReplaceInFile('/]*)>/U', ''.$userfields, $this->temp_dir.'/content.xml', TRUE); + } else { + $this->_odtReplaceInFile('', substr($userfields,23), $this->temp_dir.'/content.xml'); + } + + // Insert styles & fonts + $this->_odtReplaceInFile('', substr($autostyles, 25), $this->temp_dir.'/content.xml'); + $this->_odtReplaceInFile('', substr($autostyles, 25), $this->temp_dir.'/styles.xml'); + $this->_odtReplaceInFile('', $missingstyles.'', $this->temp_dir.'/styles.xml'); + $this->_odtReplaceInFile('', $missingfonts.'', $this->temp_dir.'/styles.xml'); + + // Build the Zip + $this->ZIP->Compress(null, $this->temp_dir, null); + $this->io_rm_rf($this->temp_dir); + } + + function _odtReplaceInFile($from, $to, $file, $regexp=FALSE) { + $value = io_readFile($file); + if ($regexp) { + $value = preg_replace($from, $to, $value); + } else { + $value = str_replace($from, $to, $value); + } + $file_f = fopen($file, 'w'); + fwrite($file_f, $value); + fclose($file_f); + } + + /** + * Recursively deletes a directory (equivalent to the "rm -rf" command) + * Found in comments on http://www.php.net/rmdir + */ + function io_rm_rf($f) { + if (is_dir($f)) { + foreach(glob($f.'/*') as $sf) { + if (is_dir($sf) && !is_link($sf)) { + $this->io_rm_rf($sf); + } else { + unlink($sf); + } + } + } else { // avoid nasty consequenses if something wrong is given + die("Error: not a directory - $f"); + } + rmdir($f); + } + + // not supported - use OpenOffice builtin tools instead! + function render_TOC() { return ''; } + + function toc_additem($id, $text, $level) {} + + function _odtAutoStyles() { + $value = ''; + foreach ($this->autostyles as $stylename=>$stylexml) { + $value .= $stylexml; + } + $value .= ''; + return $value; + } + + function _odtUserFields() { + $value = ''; + foreach ($this->fields as $fname=>$fvalue) { + $value .= ''; + } + $value .= ''; + return $value; + } + + /* Add missing styles in the template */ + function _odtStyles() { + $value = ''; + $existing_styles = io_readFile($this->temp_dir.'/styles.xml'); + foreach ($this->styles as $stylename=>$stylexml) { + if (strpos($existing_styles, 'style:name="'.$stylename.'"') === FALSE) { + $value .= $stylexml; + } + } + // Loop on bullet/numerotation styles + if (strpos($existing_styles, 'style:name="List_20_1"') === FALSE) { + $value .= ''; + for ($i=1;$i<=10;$i++) { + $value .= ' + + + '; + } + $value .= ''; + } + if (strpos($existing_styles, 'style:name="Numbering_20_1"') === FALSE) { + $value .= ''; + for ($i=1;$i<=10;$i++) { + $value .= ' + + '; + } + $value .= ''; + } + return $value; + } + + /* Add missing fonts in the template */ + function _odtFonts() { + $value = ''; + $existing_styles = io_readFile($this->temp_dir.'/styles.xml'); + foreach ($this->fonts as $name=>$xml) { + if (strpos($existing_styles, 'style:name="'.$name.'"') === FALSE) { + $value .= $xml; + } + } + return $value; + } + + function cdata($text) { + $this->doc .= $this->_xmlEntities($text); + } + + function p_open($style='Text_20_body'){ + if (!$this->in_paragraph) { // opening a paragraph inside another paragraph is illegal + $this->in_paragraph = true; + $this->doc .= ''; + } + } + + function p_close(){ + if ($this->in_paragraph) { + $this->in_paragraph = false; + $this->doc .= ''; + } + } + + function header($text, $level, $pos){ + $hid = $this->_headerToLink($text,true); + $this->doc .= ''; + $this->doc .= ''; + $this->doc .= $this->_xmlEntities($text); + $this->doc .= ''; + $this->doc .= ''; + } + + function hr() { + $this->doc .= ''; + } + + function linebreak() { + $this->doc .= ''; + } + + function strong_open() { + $this->doc .= ''; + } + + function strong_close() { + $this->doc .= ''; + } + + function emphasis_open() { + $this->doc .= ''; + } + + function emphasis_close() { + $this->doc .= ''; + } + + function underline_open() { + $this->doc .= ''; + } + + function underline_close() { + $this->doc .= ''; + } + + function monospace_open() { + $this->doc .= ''; + } + + function monospace_close() { + $this->doc .= ''; + } + + function subscript_open() { + $this->doc .= ''; + } + + function subscript_close() { + $this->doc .= ''; + } + + function superscript_open() { + $this->doc .= ''; + } + + function superscript_close() { + $this->doc .= ''; + } + + function deleted_open() { + $this->doc .= ''; + } + + function deleted_close() { + $this->doc .= ''; + } + + /* + * Tables + */ + function table_open($maxcols = NULL, $numrows = NULL){ + $this->doc .= ''; + for($i=0; $i<$maxcols; $i++){ + $this->doc .= ''; + } + } + + function table_close(){ + $this->doc .= ''; + } + + function tablerow_open(){ + $this->doc .= ''; + } + + function tablerow_close(){ + $this->doc .= ''; + } + + function tableheader_open($colspan = 1, $align = "left"){ + $this->doc .= 'doc .= ' table:style-name="tablealign'.$align.'"'; + if ( $colspan > 1 ) { + $this->doc .= ' table:number-columns-spanned="'.$colspan.'"'; + } + $this->doc .= '>'; + $this->p_open('Table_20_Heading'); + } + + function tableheader_close(){ + $this->p_close(); + $this->doc .= ''; + } + + function tablecell_open($colspan = 1, $align = "left"){ + $this->doc .= ' 1 ) { + $this->doc .= ' table:number-columns-spanned="'.$colspan.'"'; + } + $this->doc .= '>'; + if (!$align) $align = "left"; + $style = "tablealign".$align; + $this->p_open($style); + } + + function tablecell_close(){ + $this->p_close(); + $this->doc .= ''; + } + + /** + * Callback for footnote start syntax + * + * All following content will go to the footnote instead of + * the document. To achieve this the previous rendered content + * is moved to $store and $doc is cleared + * + * @author Andreas Gohr + */ + function footnote_open() { + + // move current content to store and record footnote + $this->store = $this->doc; + $this->doc = ''; + } + + /** + * Callback for footnote end syntax + * + * All rendered content is moved to the $footnotes array and the old + * content is restored from $store again + * + * @author Andreas Gohr + */ + function footnote_close() { + // recover footnote into the stack and restore old content + $footnote = $this->doc; + $this->doc = $this->store; + $this->store = ''; + + // check to see if this footnote has been seen before + $i = array_search($footnote, $this->footnotes); + + if ($i === false) { + $i = count($this->footnotes); + // its a new footnote, add it to the $footnotes array + $this->footnotes[$i] = $footnote; + + $this->doc .= ''; + $this->doc .= ''.($i+1).''; + $this->doc .= ''; + $this->doc .= ''; + $this->doc .= $footnote; + $this->doc .= ''; + $this->doc .= ''; + $this->doc .= ''; + + } else { + // seen this one before - just reference it FIXME: style isn't correct yet + $this->doc .= ''.($i+1).''; + } + } + + function listu_open() { + $this->p_close(); + $this->doc .= ''; + } + + function listu_close() { + $this->doc .= ''; + } + + function listo_open() { + $this->p_close(); + $this->doc .= ''; + } + + function listo_close() { + $this->doc .= ''; + } + + function listitem_open($level) { + $this->in_list_item = true; + $this->doc .= ''; + } + + function listitem_close() { + $this->in_list_item = false; + $this->doc .= ''; + } + + function listcontent_open() { + $this->doc .= ''; + } + + function listcontent_close() { + $this->doc .= ''; + } + + function unformatted($text) { + $this->doc .= $this->_xmlEntities($text); + } + + function acronym($acronym) { + $this->doc .= $this->_xmlEntities($acronym); + } + + function smiley($smiley) { + if ( array_key_exists($smiley, $this->smileys) ) { + $src = DOKU_INC."lib/images/smileys/".$this->smileys[$smiley]; + $this->_odtAddImage($src); + } else { + $this->doc .= $this->_xmlEntities($smiley); + } + } + + function entity($entity) { + # UTF-8 entity decoding is broken in PHP <5 + if (version_compare(phpversion(), "5.0.0") and array_key_exists($entity, $this->entities) ) { + # decoding may fail for missing Multibyte-Support in entity_decode + $dec = @html_entity_decode($this->entities[$entity],ENT_NOQUOTES,'UTF-8'); + if($dec){ + $this->doc .= $this->_xmlEntities($dec); + }else{ + $this->doc .= $this->_xmlEntities($entity); + } + } else { + $this->doc .= $this->_xmlEntities($entity); + } + } + + function multiplyentity($x, $y) { + $this->doc .= $x.'×'.$y; + } + + function singlequoteopening() { + global $lang; + $this->doc .= $lang['singlequoteopening']; + } + + function singlequoteclosing() { + global $lang; + $this->doc .= $lang['singlequoteclosing']; + } + + function apostrophe() { + global $lang; + $this->doc .= $lang['apostrophe']; + } + + function doublequoteopening() { + global $lang; + $this->doc .= $lang['doublequoteopening']; + } + + function doublequoteclosing() { + global $lang; + $this->doc .= $lang['doublequoteclosing']; + } + + function php($text, $wrapper='dummy') { + $this->monospace_open(); + $this->doc .= $this->_xmlEntities($text); + $this->monospace_close(); + } + function phpblock($text) { + $this->file($text); + } + + function html($text, $wrapper='dummy') { + $this->monospace_open(); + $this->doc .= $this->_xmlEntities($text); + $this->monospace_close(); + } + function htmlblock($text) { + $this->file($text); + } + + /** + * static call back to replace spaces + */ + function _preserveSpace($matches){ + $spaces = $matches[1]; + $len = strlen($spaces); + return ''; + } + + function preformatted($text) { + $text = $this->_xmlEntities($text); + if (strpos($text, "\n") !== FALSE and strpos($text, "\n") == 0) { + // text starts with a newline, remove it + $text = substr($text,1); + } + $text = str_replace("\n",'',$text); + $text = preg_replace_callback('/( +)/',array('renderer_plugin_odt','_preserveSpace'),$text); + + if ($this->in_list_item) { // if we're in a list item, we must close the tag + $this->doc .= ''; + $this->doc .= ''; + $this->doc .= $text; + $this->doc .= ''; + $this->doc .= ''; + } else { + $this->doc .= ''; + $this->doc .= $text; + $this->doc .= ''; + } + } + + function file($text) { + $this->preformatted($text); + } + + function quote_open() { + if (!$this->in_paragraph) { // only start a new par if we're not already in one + $this->p_open(); + } + $this->doc .= ">"; + } + + function quote_close() { + if ($this->in_paragraph) { // only close the paragraph if we're actually in one + $this->p_close(); + } + } + + function code($text, $language = NULL) { + // FIXME we could convert GeSHi HTML and CSS classes to ODT XML here + $this->preformatted($text); + } + + function internalmedia ($src, $title=NULL, $align=NULL, $width=NULL, + $height=NULL, $cache=NULL, $linking=NULL) { + global $conf; + global $ID; + resolve_mediaid(getNS($ID),$src, $exists); + list($ext,$mime) = mimetype($src); + + if(substr($mime,0,5) == 'image'){ + $file = mediaFN($src); + $this->_odtAddImage($file, $width, $height, $align, $title); + }else{ + // FIXME build absolute medialink and call externallink() + $this->code('FIXME internalmedia: '.$src); + } + } + + function externalmedia ($src, $title=NULL, $align=NULL, $width=NULL, + $height=NULL, $cache=NULL, $linking=NULL) { + global $conf; + global $ID; + list($ext,$mime) = mimetype($src); + + if(substr($mime,0,5) == 'image'){ + if($width) { + $width = 'svg:width="'.(($width/96.0)*2.54).'cm"'; + } else { + $width = 'svg:rel-width="100%"'; + } + if($height) { + $height = 'svg:height="'.(($height/96.0)*2.54).'cm"'; + } else { + $height = 'svg:rel-height="100%"'; + } + + $style = 'media'.$align; + if($align){ + $anchor = 'paragraph'; + }else{ + $anchor = 'as-char'; + } + + $this->doc .= ''; + $this->doc .= ''; + $this->doc .= ''; + }else{ + $this->externallink($src,$title); + } + } + + function camelcaselink($link) { + $this->internallink($link,$link); + } + + function reference($id, $name = NULL) { + $this->doc .= 'doc .= '>'.$this->_xmlEntities($name).''; + } else { + $this->doc .= '/>'; + } + } + + /** + * Render an internal Wiki Link + * + * @author Andreas Gohr + */ + function internallink($id, $name = NULL) { + global $conf; + global $ID; + // default name is based on $id as given + $default = $this->_simpleTitle($id); + // now first resolve and clean up the $id + resolve_pageid(getNS($ID),$id,$exists); + $name = $this->_getLinkTitle($name, $default, $isImage, $id); + + // build the absolute URL (keeping a hash if any) + list($id,$hash) = explode('#',$id,2); + $url = wl($id,'',true); + if($hash) $url .='#'.$hash; + + if ($ID == $id) { + $this->reference($hash, $name); + } else { + $this->_doLink($url,$name); + } + } + + /** + * Add external link + */ + function externallink($url, $name = NULL) { + global $conf; + + $name = $this->_getLinkTitle($name, $url, $isImage); + + $this->_doLink($url,$name); + } + + /** + * Just print local links + * + * @fixme add image handling + */ + function locallink($hash, $name = NULL){ + $name = $this->_getLinkTitle($name, $hash, $isImage); + $this->doc .= $name; + } + + /** + * InterWiki links + */ + function interwikilink($match, $name = NULL, $wikiName, $wikiUri) { + $name = $this->_getLinkTitle($name, $wikiUri, $isImage); + $url = $this-> _resolveInterWiki($wikiName,$wikiUri); + $this->_doLink($url,$name); + } + + /** + * Just print WindowsShare links + * + * @fixme add image handling + */ + function windowssharelink($url, $name = NULL) { + $name = $this->_getLinkTitle($name, $url, $isImage); + $this->doc .= $name; + } + + /** + * Just print email links + * + * @fixme add image handling + */ + function emaillink($address, $name = NULL) { + $name = $this->_getLinkTitle($name, $address, $isImage); + $this->_doLink("mailto:".$address,$name); + } + + /** + * Add a hyperlink, handling Images correctly + * + * @author Andreas Gohr + */ + function _doLink($url,$name){ + $url = $this->_xmlEntities($url); + if(is_array($name)){ + // Images + if($url) $this->doc .= ''; + + if($name['type'] == 'internalmedia'){ + $this->internalmedia($name['src'], + $name['title'], + $name['align'], + $name['width'], + $name['height'], + $name['cache'], + $name['linking']); + } + + if($url) $this->doc .= ''; + }else{ + // Text + if($url) $this->doc .= ''; + $this->doc .= $name; // we get the name already XML encoded + if($url) $this->doc .= ''; + } + } + + /** + * Construct a title and handle images in titles + * + * @author Harry Fuecks + */ + function _getLinkTitle($title, $default, & $isImage, $id=null) { + global $conf; + + $isImage = false; + if ( is_null($title) ) { + if ($conf['useheading'] && $id) { + $heading = p_get_first_heading($id); + if ($heading) { + return $this->_xmlEntities($heading); + } + } + return $this->_xmlEntities($default); + } else if ( is_string($title) ) { + return $this->_xmlEntities($title); + } else if ( is_array($title) ) { + $isImage = true; + return $title; + } + } + + /** + * Creates a linkid from a headline + * + * @param string $title The headline title + * @param boolean $create Create a new unique ID? + * @author Andreas Gohr + */ + function _headerToLink($title,$create=false) { + $title = str_replace(':','',cleanID($title)); + $title = ltrim($title,'0123456789._-'); + if(empty($title)) $title='section'; + + if($create){ + // make sure tiles are unique + $num = ''; + while(in_array($title.$num,$this->headers)){ + ($num) ? $num++ : $num = 1; + } + $title = $title.$num; + $this->headers[] = $title; + } + + return $title; + } + + + function _xmlEntities($value) { + return str_replace( array('&','"',"'",'<','>'), array('&','"',''','<','>'), $value); + } + + function rss ($url,$params){ + global $lang; + global $conf; + + require_once(DOKU_INC.'inc/FeedParser.php'); + $feed = new FeedParser(); + $feed->feed_url($url); + + //disable warning while fetching + if (!defined('DOKU_E_LEVEL')) { $elvl = error_reporting(E_ERROR); } + $rc = $feed->init(); + if (!defined('DOKU_E_LEVEL')) { error_reporting($elvl); } + + //decide on start and end + if($params['reverse']){ + $mod = -1; + $start = $feed->get_item_quantity()-1; + $end = $start - ($params['max']); + $end = ($end < -1) ? -1 : $end; + }else{ + $mod = 1; + $start = 0; + $end = $feed->get_item_quantity(); + $end = ($end > $params['max']) ? $params['max'] : $end;; + } + + $this->listu_open(); + if($rc){ + for ($x = $start; $x != $end; $x += $mod) { + $item = $feed->get_item($x); + $this->listitem_open(0); + $this->listcontent_open(); + $this->externallink($item->get_permalink(), + $item->get_title()); + if($params['author']){ + $author = $item->get_author(0); + if($author){ + $name = $author->get_name(); + if(!$name) $name = $author->get_email(); + if($name) $this->cdata(' '.$lang['by'].' '.$name); + } + } + if($params['date']){ + $this->cdata(' ('.$item->get_date($conf['dformat']).')'); + } + if($params['details']){ + $this->cdata(strip_tags($item->get_description())); + } + $this->listcontent_close(); + $this->listitem_close(); + } + }else{ + $this->listitem_open(0); + $this->listcontent_open(); + $this->emphasis_open(); + $this->cdata($lang['rssfailed']); + $this->emphasis_close(); + $this->externallink($url); + $this->listcontent_close(); + $this->listitem_close(); + } + $this->listu_close(); + } + + + function _odtAddImage($src, $width = NULL, $height = NULL, $align = NULL, $title = NULL, $style = NULL){ + list($ext,$mime) = mimetype($src); + $name = 'Pictures/'.md5($src).'.'.$ext; + if(!$this->manifest[$name]){ + $this->manifest[$name] = $mime; + $this->ZIP->add_File(io_readfile($src,false),$name,0); + } + // make sure width and height is available + // FIXME we don't have the dimension of an external file + // (except it's cached, but this is not the default) there seems + // to be no way to specify "use original image" in ODF - thus + // a hardcoded default size of 200 pixel here + if(!$width || !$height){ + $info = getimagesize($src); + if(!$width){ + $width = $info[0]; + $height = $info[1]; + }else{ + $height = round(($width * $info[1]) / $info[0]); + } + } + + // convert from pixel to centimeters + $width = (($width/96.0)*2.54); + $height = (($height/96.0)*2.54); + // Don't be wider than the page + if ($width >= 17){ // FIXME : this assumes A4 page format with 2cm margins + $width = $width.'cm" style:rel-width="100%'; + $height = $height.'cm" style:rel-height="scale'; + } else { + $width = $width.'cm'; + $height = $height.'cm'; + } + + if($align){ + $anchor = 'paragraph'; + }else{ + $anchor = 'as-char'; + } + + if (!$style or !array_key_exists($style, $this->autostyles)) { + $style = 'media'.$align; + } + + if ($title) { + $this->doc .= ''; + $this->doc .= ''; + $this->doc .= ''; + } + $this->doc .= ''; + $this->doc .= ''; + $this->doc .= ''; + if ($title) { + $this->doc .= $this->_xmlEntities($title).''; + } + } + +} + +//Setup VIM: ex: et ts=4 enc=utf-8 : diff --git a/vendors/dokuwiki/lib/plugins/odt/styles.xml b/vendors/dokuwiki/lib/plugins/odt/styles.xml new file mode 100644 index 000000000..c328464f3 --- /dev/null +++ b/vendors/dokuwiki/lib/plugins/odt/styles.xml @@ -0,0 +1,158 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vendors/dokuwiki/lib/plugins/odt/syntax.php b/vendors/dokuwiki/lib/plugins/odt/syntax.php new file mode 100644 index 000000000..a8d0832d7 --- /dev/null +++ b/vendors/dokuwiki/lib/plugins/odt/syntax.php @@ -0,0 +1,96 @@ + + * @author Aurelien Bompard + */ +// must be run within Dokuwiki +if(!defined('DOKU_INC')) die(); + +if(!defined('DOKU_PLUGIN')) define('DOKU_PLUGIN',DOKU_INC.'lib/plugins/'); +require_once(DOKU_PLUGIN.'syntax.php'); + +class syntax_plugin_odt extends DokuWiki_Syntax_Plugin { + + /** + * return some info + */ + function getInfo(){ + return confToHash(dirname(__FILE__).'/info.txt'); + } + + /** + * What kind of syntax are we? + */ + function getType(){ + return 'substition'; + } + + /** + * What about paragraphs? + */ + function getPType(){ + return 'normal'; + } + + /** + * Where to sort in? + */ + function getSort(){ + return 319; // Before image detection, which uses {{...}} and is 320 + } + + /** + * Connect pattern to lexer + */ + function connectTo($mode) { + $this->Lexer->addSpecialPattern('~~ODT~~',$mode,'plugin_odt'); + $this->Lexer->addSpecialPattern('{{odt>.+?}}',$mode,'plugin_odt'); + } + + /** + * Handle the match + */ + function handle($match, $state, $pos, &$handler){ + // Export button + if ($match == '~~ODT~~') { return array(); } + // Extended info + $match = substr($match,6,-2); //strip markup + $extinfo = explode(':',$match); + $info_type = $extinfo[0]; + if (count($extinfo) < 2) { // no value + $info_value = ''; + } elseif (count($extinfo) == 2) { + $info_value = $extinfo[1]; + } else { // value may contain colons + $info_value = implode(array_slice($extinfo,1), ':'); + } + return array($info_type, $info_value); + } + + /** + * Create output + */ + function render($format, &$renderer, $data) { + global $ID, $REV; + if (!$data) { // Export button + if($format != 'xhtml') return false; + $renderer->doc .= ''; + $renderer->doc .= ''.$this->getLang('view').''; + $renderer->doc .= ''; + return true; + } else { // Extended info + list($info_type, $info_value) = $data; + if ($info_type == "template") { // Template-based export + $renderer->template = $info_value; + p_set_metadata($ID, array("relation"=> array("odt"=>array("template"=>$info_value)))); + } + } + return false; + } + +} + +//Setup VIM: ex: et ts=4 enc=utf-8 : -- cgit v1.2.3