From: Reini U. <ru...@us...> - 2007-09-15 12:32:48
|
Update of /cvsroot/phpwiki/phpwiki/lib In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv32162 Modified Files: loadsave.php Log Message: Improve multi-page format handling: abstract _DumpHtmlToDir. get rid of non-external pdf, non-global VALID_LINKS Index: loadsave.php =================================================================== RCS file: /cvsroot/phpwiki/phpwiki/lib/loadsave.php,v retrieving revision 1.155 retrieving revision 1.156 diff -u -2 -b -p -d -r1.155 -r1.156 --- loadsave.php 12 Sep 2007 19:40:41 -0000 1.155 +++ loadsave.php 15 Sep 2007 12:32:50 -0000 1.156 @@ -407,4 +407,5 @@ function mkdir_p($pathname, $permission function DumpHtmlToDir (&$request) { + global $WikiTheme; $directory = $request->getArg('directory'); if (empty($directory)) @@ -423,5 +424,4 @@ function DumpHtmlToDir (&$request) $html = HTML::p(fmt("Using directory '%s'", $directory)); } - $request->_TemplatesProcessed = array(); StartLoadDump($request, _("Dumping Pages"), $html); $thispage = $request->getArg('pagename'); // for "Return to ..." @@ -436,21 +436,101 @@ function DumpHtmlToDir (&$request) if ($pages == '[]') // current page $pages = $thispage; - $page_iter = new WikiDB_Array_PageIterator(explodePageList($pages)); + $page_iter = new WikiDB_Array_generic_iter(explodePageList($pages)); // not at admin page: dump only the current page } elseif ($thispage != _("PhpWikiAdministration")) { - $page_iter = new WikiDB_Array_PageIterator(array($thispage)); + $page_iter = new WikiDB_Array_generic_iter(array($thispage)); } else { $page_iter = $dbi->getAllPages(false,false,false,$excludeList); } + $WikiTheme->DUMP_MODE = 'HTML'; + _DumpHtmlToDir($directory, $page_iter, $request->getArg('exclude')); + $WikiTheme->DUMP_MODE = false; + + $request->setArg('pagename',$thispage); // Template::_basepage fix + EndLoadDump($request); +} + +/* Known problem: any plugins or other code which echo()s text will + * lead to a corrupted html zip file which may produce the following + * errors upon unzipping: + * + * warning [wikihtml.zip]: 2401 extra bytes at beginning or within zipfile + * file #58: bad zipfile offset (local header sig): 177561 + * (attempting to re-compensate) + * + * However, the actual wiki page data should be unaffected. + */ +function MakeWikiZipHtml (&$request) +{ global $WikiTheme; + if ($request->getArg('zipname')) { + $zipname = basename($request->getArg('zipname')); + if (!preg_match("/\.zip$/i", $zipname)) + $zipname .= ".zip"; + $request->setArg('zipname', false); + } else { + $zipname = "wikihtml.zip"; + } + $zip = new ZipWriter("Created by PhpWiki " . PHPWIKI_VERSION, $zipname); + $dbi =& $request->_dbi; + $thispage = $request->getArg('pagename'); // for "Return to ..." + if ($pages = $request->getArg('pages')) { // which pagenames + if ($pages == '[]') // current page + $pages = $thispage; + $page_iter = new WikiDB_Array_generic_iter(explodePageList($pages)); + } else { + $page_iter = $dbi->getAllPages(false,false,false,$request->getArg('exclude')); + } + + $WikiTheme->DUMP_MODE = 'ZIPHTML'; + _DumpHtmlToDir($zip, $page_iter, $request->getArg('exclude')); + $WikiTheme->DUMP_MODE = false; +} + +/* + * Internal html dumper. Used for dumphtml, ziphtml and pdf + */ +function _DumpHtmlToDir ($target, $page_iter, $exclude = false) +{ + global $WikiTheme, $request; + $silent = true; $zip = false; $directory = false; + if ($WikiTheme->DUMP_MODE == 'HTML') { + $directory = $target; + $silent = false; + } elseif ($WikiTheme->DUMP_MODE == 'PDFHTML') { + $directory = $target; + } elseif (is_object($target)) { // $WikiTheme->DUMP_MODE == 'ZIPHTML' + $zip = $target; + } + + $request->_TemplatesProcessed = array(); + if ($exclude) { // exclude which pagenames + $excludeList = explodePageList($exclude); + } else { + $excludeList = array('DebugAuthInfo', 'DebugGroupInfo', 'AuthInfo'); + } + if ($request->getArg('pages') or isa($page_iter, "WikiDB_Array_generic_iter")) { // pagelist + $WikiTheme->VALID_LINKS = array(); + $page_iter_sav = $page_iter; + foreach ($page_iter_sav->asArray() as $handle) { + $WikiTheme->VALID_LINKS[] = is_string($handle) ? $handle : $handle->getName(); + } + $page_iter_sav->reset(); + } + if (defined('HTML_DUMP_SUFFIX')) $WikiTheme->HTML_DUMP_SUFFIX = HTML_DUMP_SUFFIX; - $WikiTheme->DUMP_MODE = 'HTML'; $_bodyAttr = @$WikiTheme->_MoreAttr['body']; unset($WikiTheme->_MoreAttr['body']); + if (check_php_version(4,1)) { + global $ErrorManager; + $ErrorManager->pushErrorHandler(new WikiFunctionCb('_dump_error_handler')); + } + // check if the dumped file will be accessible from outside $doc_root = $request->get("DOCUMENT_ROOT"); + if ($WikiTheme->DUMP_MODE == 'HTML') { $ldir = NormalizeLocalFileName($directory); $wikiroot = NormalizeLocalFileName(''); @@ -466,22 +546,51 @@ function DumpHtmlToDir (&$request) $link_prefix = "file://".$prefix.$directory."/"; } + } else { + $link_prefix = ""; + } $request_args = $request->args; $timeout = (! $request->getArg('start_debug')) ? 20 : 240; $SAVE_RCS_IDS = $GLOBALS['RCS_IDS']; + if ($directory) { + if (isWindows()) + $directory = str_replace("\\", "/", $directory); // no Win95 support. @mkdir("$directory/images"); - $doc_root = $request->get("DOCUMENT_ROOT"); + } + $already = array(); + $outfiles = array(); + $already_images = array(); while ($page = $page_iter->next()) { + if (is_string($page)) { + $pagename = $page; + $page = $request->_dbi->getPage($pagename); + } else { + $pagename = $page->getName(); + } + if (!$firstpage) $firstpage = $pagename; + if (array_key_exists($pagename, $already)) + continue; + $already[$pagename] = 1; + $current = $page->getCurrentRevision(); + //if ($current->getVersion() == 0) + // continue; + $request->args = $request_args; // some plugins might change them (esp. on POST) longer_timeout($timeout); // Reset watchdog - $pagename = $page->getName(); + if ($zip) { + $attrib = array('mtime' => $current->get('mtime'), + 'is_ascii' => 1); + if ($page->get('locked')) + $attrib['write_protected'] = 1; + } elseif (!$silent) { if (!isa($request,'MockRequest')) { PrintXML(HTML::br(), $pagename, ' ... '); flush(); } + } if (in_array($pagename, $excludeList)) { - if (!isa($request,'MockRequest')) { + if (!$silent and !isa($request,'MockRequest')) { PrintXML(_("Skipped.")); flush(); @@ -490,9 +599,10 @@ function DumpHtmlToDir (&$request) } $relative_base = ''; + if ($WikiTheme->DUMP_MODE == 'PDFHTML') + $request->setArg('action', 'pdf'); // to omit cache headers $request->setArg('pagename', $pagename); // Template::_basepage fix $filename = FilenameForPage($pagename) . $WikiTheme->HTML_DUMP_SUFFIX; - $revision = $page->getCurrentRevision(); - $args = array('revision' => $revision, - 'CONTENT' => $revision->getTransformedContent(), + $args = array('revision' => $current, + 'CONTENT' => $current->getTransformedContent(), 'relative_base' => $relative_base); // For every %2F will need to mkdir -p dirname($pagename) @@ -502,4 +612,5 @@ function DumpHtmlToDir (&$request) $count = substr_count($filename, "/"); $dirname = dirname($filename); + if ($directory) mkdir_p($directory."/".$dirname); // Fails with "XX / YY", "XX" is created, "XX / YY" cannot be written @@ -514,9 +625,10 @@ function DumpHtmlToDir (&$request) } $msg = HTML(); - $template = new Template('browse', $request, $args); - $data = GeneratePageasXML($template, $pagename, $revision, $args); + $DUMP_MODE = $WikiTheme->DUMP_MODE; + $data = GeneratePageasXML(new Template('browse', $request, $args), + $pagename, $current, $args); + $WikiTheme->DUMP_MODE = $DUMP_MODE; - $WikiTheme->other_images = array(); if (preg_match_all("/<img .*?src=\"(\/.+?)\"/", $data, $m)) { // fix to local relative path for uploaded images, so that pdf will work @@ -528,25 +640,40 @@ function DumpHtmlToDir (&$request) if (file_exists($src) and $base) { $target = "$directory/images/$base"; + if ($directory) { if (copy($src, $target)) { + if (!$silent) _copyMsg($img_file, fmt("... copied to %s", $target)); } else { + if (!$silent) _copyMsg($img_file, fmt("... not copied to %s", $target)); } + } else { + if (!array_key_exists($img_file, $already_images)) { + $already_images[$img_file] = 1; + if (check_php_version(4,3)) + $zip->addRegularFile($target, file_get_contents($src), $attrib); + else + $zip->addRegularFile($target, join('', file($src)), $attrib); + } + } } } } - if ( !($fd = fopen($directory."/".$filename, "wb")) ) { + if ($directory) { + $outfile = $directory."/".$filename; + if ( !($fd = fopen($outfile, "wb")) ) { $msg->pushContent(HTML::strong(fmt("couldn't open file '%s' for writing", - "$directory/$filename"))); + $outfile))); $request->finish($msg); } $len = strlen($data); $num = fwrite($fd, $data, $len); - if ($page->getName() != $filename) { + if ($pagename != $filename) { $link = LinkURL($link_prefix.$filename, $filename); $msg->pushContent(HTML::small(_("saved as "), $link, " ... ")); } $msg->pushContent(HTML::small(fmt("%s bytes written", $num), "\n")); + if (!$silent) { if (!isa($request, 'MockRequest')) { PrintXML($msg); @@ -554,7 +681,11 @@ function DumpHtmlToDir (&$request) flush(); $request->chunkOutput(); - + } assert($num == $len); fclose($fd); + $outfiles[] = $outfile; + } else { + $zip->addRegularFile($filename, $data, $attrib); + } if (USECACHE) { @@ -567,6 +698,6 @@ function DumpHtmlToDir (&$request) unset($msg); - unset($revision->_transformedContent); - unset($revision); + unset($current->_transformedContent); + unset($current); unset($template->_request); unset($template); @@ -580,9 +711,16 @@ function DumpHtmlToDir (&$request) // @mkdir("$directory/images"); foreach ($WikiTheme->dumped_images as $img_file) { + if (array_key_exists($img_file, $already_images)) + continue; + $already_images[$img_file] = 1; if ($img_file and ($from = $WikiTheme->_findFile($img_file, true)) and basename($from)) { - $target = "$directory/images/".basename($img_file); + if ($directory) { + $target = "$directory/images/".basename($from); + if ($silent) + copy($WikiTheme->_path . $from, $target); + else { if (copy($WikiTheme->_path . $from, $target)) { _copyMsg($from, fmt("... copied to %s", $target)); @@ -590,5 +728,13 @@ function DumpHtmlToDir (&$request) _copyMsg($from, fmt("... not copied to %s", $target)); } + } } else { + $target = "images/".basename($from); + if (check_php_version(4,3)) + $zip->addRegularFile($target, file_get_contents($WikiTheme->_path . $from), $attrib); + else + $zip->addRegularFile($target, join('', file($WikiTheme->_path . $from)), $attrib); + } + } elseif (!$silent) { _copyMsg($from, _("... not found")); } @@ -596,13 +742,23 @@ function DumpHtmlToDir (&$request) } - if (!empty($WikiTheme->dumped_buttons) and is_array($WikiTheme->dumped_buttons)) { + if (!empty($WikiTheme->dumped_buttons) + and is_array($WikiTheme->dumped_buttons)) + { // Buttons also + if ($directory) @mkdir("$directory/images/buttons"); foreach ($WikiTheme->dumped_buttons as $text => $img_file) { + if (array_key_exists($img_file, $already_images)) + continue; + $already_images[$img_file] = 1; if ($img_file and ($from = $WikiTheme->_findFile($img_file, true)) and basename($from)) { - $target = "$directory/images/buttons/".basename($img_file); + if ($directory) { + $target = "$directory/images/buttons/".basename($from); + if ($silent) + copy($WikiTheme->_path . $from, $target); + else { if (copy($WikiTheme->_path . $from, $target)) { _copyMsg($from, fmt("... copied to %s", $target)); @@ -610,5 +766,13 @@ function DumpHtmlToDir (&$request) _copyMsg($from, fmt("... not copied to %s", $target)); } + } } else { + $target = "images/buttons/".basename($from); + if (check_php_version(4,3)) + $zip->addRegularFile($target, file_get_contents($WikiTheme->_path . $from), $attrib); + else + $zip->addRegularFile($target, join('', file($WikiTheme->_path . $from)), $attrib); + } + } elseif (!$silent) { _copyMsg($from, _("... not found")); } @@ -617,9 +781,17 @@ function DumpHtmlToDir (&$request) if (!empty($WikiTheme->dumped_css) and is_array($WikiTheme->dumped_css)) { foreach ($WikiTheme->dumped_css as $css_file) { + if (array_key_exists($css_file, $already_images)) + continue; + $already_images[$css_file] = 1; if ($css_file and ($from = $WikiTheme->_findFile(basename($css_file), true)) and basename($from)) { + // TODO: fix @import url(main.css); + if ($directory) { $target = "$directory/" . basename($css_file); + if ($silent) + copy($WikiTheme->_path . $from, $target); + else { if (copy($WikiTheme->_path . $from, $target)) { _copyMsg($from, fmt("... copied to %s", $target)); @@ -627,137 +799,7 @@ function DumpHtmlToDir (&$request) _copyMsg($from, fmt("... not copied to %s", $target)); } - // TODO: fix @import url(main.css); - } else { - _copyMsg($from, _("... not found")); - } - } - } - $WikiTheme->HTML_DUMP_SUFFIX = ''; - $WikiTheme->DUMP_MODE = false; - $WikiTheme->_MoreAttr['body'] = $_bodyAttr; - - $request->setArg('pagename',$thispage); // Template::_basepage fix - EndLoadDump($request); -} - -/* Known problem: any plugins or other code which echo()s text will - * lead to a corrupted html zip file which may produce the following - * errors upon unzipping: - * - * warning [wikihtml.zip]: 2401 extra bytes at beginning or within zipfile - * file #58: bad zipfile offset (local header sig): 177561 - * (attempting to re-compensate) - * - * However, the actual wiki page data should be unaffected. - */ -function MakeWikiZipHtml (&$request) -{ - $request->_TemplatesProcessed = array(); - if ($request->getArg('zipname')) { - $zipname = basename($request->getArg('zipname')); - if (!preg_match("/\.zip$/i", $zipname)) - $zipname .= ".zip"; - $request->setArg('zipname', false); - } else { - $zipname = "wikihtml.zip"; } - $zip = new ZipWriter("Created by PhpWiki " . PHPWIKI_VERSION, $zipname); - $dbi =& $request->_dbi; - $thispage = $request->getArg('pagename'); // for "Return to ..." - if ($exclude = $request->getArg('exclude')) { // exclude which pagenames - $excludeList = explodePageList($exclude); } else { - $excludeList = array(); - } - if ($pages = $request->getArg('pages')) { // which pagenames - if ($pages == '[]') // current page - $pages = $thispage; - $page_iter = new WikiDB_Array_PageIterator(explodePageList($pages)); - } else { - $page_iter = $dbi->getAllPages(false,false,false,$excludeList); - } - - global $WikiTheme; - if (defined('HTML_DUMP_SUFFIX')) - $WikiTheme->HTML_DUMP_SUFFIX = HTML_DUMP_SUFFIX; - $WikiTheme->DUMP_MODE = 'ZIPHTML'; - $WikiTheme->other_images = array(); - $_bodyAttr = @$WikiTheme->_MoreAttr['body']; - unset($WikiTheme->_MoreAttr['body']); - - /* ignore fatals in plugins */ - if (check_php_version(4,1)) { - global $ErrorManager; - $ErrorManager->pushErrorHandler(new WikiFunctionCb('_dump_error_handler')); - } - - $request_args = $request->args; - $timeout = (! $request->getArg('start_debug')) ? 20 : 240; - - while ($page = $page_iter->next()) { - $request->args = $request_args; // some plugins might change them (esp. on POST) - longer_timeout($timeout); // Reset watchdog - - $current = $page->getCurrentRevision(); - if ($current->getVersion() == 0) - continue; - $pagename = $page->getName(); - if (in_array($pagename, $excludeList)) { - continue; - } - - $attrib = array('mtime' => $current->get('mtime'), - 'is_ascii' => 1); - if ($page->get('locked')) - $attrib['write_protected'] = 1; - - $request->setArg('pagename', $pagename); // Template::_basepage fix - $filename = FilenameForPage($pagename) . $WikiTheme->HTML_DUMP_SUFFIX; - $revision = $page->getCurrentRevision(); - - $transformedContent = $revision->getTransformedContent(); - - $template = new Template('browse', $request, - array('revision' => $revision, - 'CONTENT' => $transformedContent)); - - $data = GeneratePageAsXML($template, $pagename); - - // Detect local images. LinkImage et al... - // TODO: defer via Cached_InlinedImage - if (preg_match_all("/<img .*?src=\"(\/.+?)\"/", $data, $m)) { - foreach ($m[1] as $match) { - $WikiTheme->other_images[] = $match; //copy to images. no collisions yet. - $base = basename($match); - $data = str_replace('src="'.$match.'"','src="images/'.$base.'"', $data); - } - } - - $zip->addRegularFile( $filename, $data, $attrib ); - - if (USECACHE) { - $request->_dbi->_cache->invalidate_cache($pagename); - unset ($request->_dbi->_cache->_pagedata_cache); - unset ($request->_dbi->_cache->_versiondata_cache); - unset ($request->_dbi->_cache->_glv_cache); - } - unset ($request->_dbi->_cache->_backend->_page_data); - - unset($revision->_transformedContent); - unset($revision); - unset($template->_request); - unset($template); - unset($data); - } - $page_iter->free(); - - $attrib = false; - // Deal with theme css and theme images here. - if (!empty($WikiTheme->dumped_images) and is_array($WikiTheme->dumped_images)) { - // dirs are created automatically - //if ($WikiTheme->dumped_images) $zip->addRegularFile("images", "", $attrib); - foreach ($WikiTheme->dumped_images as $img_file) { - if (($from = $WikiTheme->_findFile($img_file, true)) and basename($from)) { - $target = "images/".basename($img_file); + $target = basename($css_file); if (check_php_version(4,3)) $zip->addRegularFile($target, file_get_contents($WikiTheme->_path . $from), $attrib); @@ -765,49 +807,49 @@ function MakeWikiZipHtml (&$request) $zip->addRegularFile($target, join('', file($WikiTheme->_path . $from)), $attrib); } + } elseif (!$silent) { + _copyMsg($from, _("... not found")); } } - if (!empty($WikiTheme->other_images) and is_array($WikiTheme->other_images)) { - $doc_root = $request->get("DOCUMENT_ROOT"); - foreach ($WikiTheme->other_images as $img_file) { - // resolve src from webdata to file - $src = $doc_root . $img_file; - if (file_exists($src) and basename($src)) { - $target = "images/".basename($src); - if (check_php_version(4,3)) - $zip->addRegularFile($target, file_get_contents($src), $attrib); - else - $zip->addRegularFile($target, join('', file($src)), $attrib); - } } + + if ($zip) + $zip->finish(); + + if ($WikiTheme->DUMP_MODE == 'PDFHTML') { + if (USE_EXTERNAL_HTML2PDF and $outfiles) { + $cmd = EXTERNAL_HTML2PDF_PAGELIST.' "'.join('" "', $outfiles).'"'; + $filename = FilenameForPage($firstpage); + if (DEBUG) { + $tmpfile = $directory . "/createpdf.bat"; + $fp = fopen($tmpfile, "wb"); + fwrite($fp, $cmd . " > $filename.pdf"); + fclose($fp); } - if (!empty($WikiTheme->dumped_buttons) and is_array($WikiTheme->dumped_buttons)) { - //if ($WikiTheme->dumped_buttons) $zip->addRegularFile("images/buttons", "", $attrib); - foreach ($WikiTheme->dumped_buttons as $text => $img_file) { - if (($from = $WikiTheme->_findFile($img_file, true)) and basename($from)) { - $target = "images/buttons/".basename($img_file); - if (check_php_version(4,3)) - $zip->addRegularFile($target, file_get_contents($WikiTheme->_path . $from), $attrib); - else - $zip->addRegularFile($target, join('', file($WikiTheme->_path . $from)), $attrib); + if (!headers_sent()) { + Header('Content-Type: application/pdf'); + passthru($cmd); } + else { + $tmpdir = getUploadFilePath(); + $s = passthru($cmd . " > $tmpdir/$filename.pdf"); + $errormsg = "<br />\nGenerated <a href=\"".getUploadDataPath()."$filename.pdf\">Upload:$filename.pdf</a>\n"; + $errormsg .= $s; + echo $errormsg; } + if (!DEBUG) { + foreach($outfiles as $f) unlink($f); } - if (!empty($WikiTheme->dumped_css) and is_array($WikiTheme->dumped_css)) { - foreach ($WikiTheme->dumped_css as $css_file) { - if (($from = $WikiTheme->_findFile(basename($css_file), true)) and basename($from)) { - $target = basename($css_file); - if (check_php_version(4,3)) - $zip->addRegularFile($target, file_get_contents($WikiTheme->_path . $from), $attrib); - else - $zip->addRegularFile($target, join('', file($WikiTheme->_path . $from)), $attrib); } + if (!empty($errormsg)) { + $request->discardOutput(); + $GLOBALS['ErrorManager']->_postponed_errors = array(); } } - $zip->finish(); if (check_php_version(4,1)) { global $ErrorManager; $ErrorManager->popErrorHandler(); } + $WikiTheme->HTML_DUMP_SUFFIX = ''; $WikiTheme->DUMP_MODE = false; @@ -1524,4 +1566,7 @@ function LoadPostFile (&$request) /** $Log$ + Revision 1.156 2007/09/15 12:32:50 rurban + Improve multi-page format handling: abstract _DumpHtmlToDir. get rid of non-external pdf, non-global VALID_LINKS + Revision 1.155 2007/09/12 19:40:41 rurban Copy locally uploaded images also |