*/ /* ----------------------- Set some global variables ----------------------- */ // Global configuration for offline plugin will be stored in this array: $offlineConf = array(); // The following variable is used to determine whether the script is run in the // dry run mode or not. // Because it is needed in 'init_log_file()' it is set here and not in the // function 'set_my_global_variables()': $offlineConf['offlineMode'] = strtolower(htmlentities(strip_tags(stripslashes($_REQUEST['offlineMode'])))); $offlineConf['pathDelimiterStr'] = strstr(PHP_OS, 'WIN') ? "\\" : "/"; /* ----------------------------- Include files ----------------------------- */ require_once('inc/log.inc.php'); // Get DokuWiki configuration: // Note: Original DokuWiki defines paths with a trailing slash: if (!defined('DOKU_INC')) define('DOKU_INC', dirname(__FILE__) . $offlineConf['pathDelimiterStr'] . '..' . $offlineConf['pathDelimiterStr'] . '..' . $offlineConf['pathDelimiterStr'] . '..' . $offlineConf['pathDelimiterStr']); require_once(DOKU_INC.'inc/init.php'); // Get offline plugin configuration: require_once('conf/default.php'); /* -------------------- Main program starts below here -------------------- */ echo '
';
// Initialize log file:
init_log_file();
// Store required information in global array '$offlineConf':
set_my_global_variables();
// Recursively delete old temporary directory in which remains of a previous
// offline version might still be stored:
delete_old_tmp_session_directory($offlineConf['absolutePathToTmpSessionDirStr']);
// Create temporary directory in which the offline version will be stored
create_directory($offlineConf['absolutePathToTmpSessionDirStr'], 0777);
// Copy or download css files:
process_css_files();
// Copy media files:
process_media_files();
// Process directory in which pages are stored:
process_wiki_pages();
// Build indices for easier navigation and write them to file:
process_indices();
// Building an archiv, e.g. a zip-file:
create_archive();
// Delete temporary directory in which the offline version was stored:
// (In case the archiver was not called with the option 'move files' the
// remaining files should be deleted to leave the temporary directory clean.)
delete_old_tmp_session_directory($offlineConf['absolutePathToTmpSessionDirStr']);
log_msg(__LINE__, date('Y-m-d') . ' Offline version created');
echo '';
die;
/* ----------------- Function definitions start below here ----------------- */
/**
* Initialize the log file.
*
* Global variables for logging are being set.
* An existing log file will be deleted.
*
*/
function init_log_file() {
global $offlineConf;
// Settings for logging:
$offlineConf['logWriteToFile'] = true;
$offlineConf['logPrintToScreen'] = true;
$offlineConf['logDirectory'] = dirname(__FILE__);
$offlineConf['logDefaultFileName'] = 'offline.log';
// Delete old log file
delete_file($offlineConf['logDirectory'] . '/' . $offlineConf['logDefaultFileName'], false);
log_msg(__LINE__, date('Y-m-d') . ' Creating offline version');
}
/**
* Read user defined settings.
* If there aren't any user defined settings, the default settings will be
* used instead.
* Values will be returned in the global hash $offlineConf.
*
*
* Example:
* 1) The user defined setting "wgetPathToBinary' can be accessed like this:
* $conf['plugin']['offline']['wgetPathToBinary']
*
* 2) The default setting for wgetPathToBinary'is derived from the file
* "default.php"
* and is stored in
* $conf['wgetPathToBinary']
*
*/
function set_my_global_variables() {
global $conf;// Variables from DokuWiki
global $offlineConf;// Variables for offline plugin
// Merge default values for offline plugin with user defined settings:
$optionsArr = array('template', 'dokuwikiProtocol', 'dokuwikiHost', 'dokuwikiRelativePath', 'wgetPathToBinary', 'wgetHttpUser', 'wgetHttpPasswd', 'archiverPathToBinary', 'archiverOptions', 'insertLinkBackToHome', 'writeLogFile');
foreach($optionsArr as $optionStr) {
log_msg(__LINE__, $optionStr . '=' . $conf['plugin']['offline'][$optionStr] . ' (Default: ' . $conf[$optionStr] . ')');
isset($conf['plugin']['offline'][$optionStr]) ? $offlineConf[$optionStr] = $conf['plugin']['offline'][$optionStr] : $offlineConf[$optionStr] = $conf[$optionStr];
log_msg(__LINE__, $optionStr . ' = ' . $offlineConf[$optionStr]);
}
$offlineConf['absolutePathToDokuwikiDirStr'] = dirname(__FILE__) . $offlineConf['pathDelimiterStr'] . '..' . $offlineConf['pathDelimiterStr'] . '..' . $offlineConf['pathDelimiterStr'] . '..';
$offlineConf['absolutePathToOfflinePluginDirStr'] = dirname(__FILE__);
$offlineConf['absolutePathToDataDirStr'] = $offlineConf['absolutePathToDokuwikiDirStr'] . $offlineConf['pathDelimiterStr'] . 'data';
$offlineConf['absolutePathToMediaDirStr'] = $offlineConf['absolutePathToDokuwikiDirStr'] . $offlineConf['pathDelimiterStr'] . 'data' . $offlineConf['pathDelimiterStr'] . 'media';
$offlineConf['absolutePathToPagesDirStr'] = $offlineConf['absolutePathToDokuwikiDirStr'] . $offlineConf['pathDelimiterStr'] . 'data' . $offlineConf['pathDelimiterStr'] . 'pages';
$offlineConf['absolutePathToTmpDirStr'] = $offlineConf['absolutePathToDokuwikiDirStr'] . $offlineConf['pathDelimiterStr'] . 'data' . $offlineConf['pathDelimiterStr'] . 'tmp';
// $offlineConf['absolutePathToTmpSessionDirStr'] = $offlineConf['absolutePathToDokuwikiDirStr'] . '/data/tmp' . '/offline' . date('Y-m-d_His');
$offlineConf['absolutePathToTmpSessionDirStr'] = $offlineConf['absolutePathToDokuwikiDirStr'] . $offlineConf['pathDelimiterStr'] . 'data' . $offlineConf['pathDelimiterStr'] . 'tmp' . $offlineConf['pathDelimiterStr'] . 'offline';
$offlineConf['pageExtensionStr'] = 'txt';
// $offlineConf['dokuwikiBaseUrlStr'] = 'http://localhost/dokuwiki';
if ($offlineConf['dokuwikiRelativePath'] != '') {
$offlineConf['dokuwikiBaseUrlStr'] = $offlineConf['dokuwikiProtocol'] . '://' . $offlineConf['dokuwikiHost'] . '/' . $offlineConf['dokuwikiRelativePath'];
} else {
$offlineConf['dokuwikiBaseUrlStr'] = $offlineConf['dokuwikiProtocol'] . '://' . $offlineConf['dokuwikiHost'];
}
$offlineConf['dokuwikiShowPageUrlStr'] = $offlineConf['dokuwikiBaseUrlStr'] . '/doku.php?id=';
$offlineConf['dokuwikiExportCommandSuffixStr'] = '&do=export_offline';
$offlineConf['wgetCommandStr'] = assemble_wget_command();
$offlineConf['pageDirectoriesArr'] = array();
$offlineConf['wgetCommandsArr'] = array();
$offlineConf['mediaDirectoriesArr'] = array();
$offlineConf['mediaFilesSourceAndTargetArr'] = array();
// List all parameters and there values for debbuging:
foreach ($offlineConf as $key => $value) {
$parametersStr .= '-- ' . $key . ' = ' . $value . "\n";
}
log_msg(__LINE__, $parametersStr);
}
/**
* Processes the directory in which pages are stored.
*
* First, the page directory tree is traversed and all files and subdirectories
* are stored in the global array $offlineConf['pageDirectoriesArr'].
* In the second step this array is walked through and the according directory
* structure is created in the temporary pages directory.
* (Subdirectories are created by DokuWiki if wiki pages are arranged in name
* spaces.)
* Finally, each wiki page is downloaded and saved in the temp directory.
*
*/
function process_wiki_pages() {
global $offlineConf;
log_msg(__LINE__, 'Processing wiki pages ...');
retrieve_page_tree($offlineConf['absolutePathToPagesDirStr']);
log_msg(__LINE__, join("\n", $offlineConf['wgetCommandsArr']));
foreach ($offlineConf['pageDirectoriesArr'] as $currentDirStr => $count) {
create_directory($offlineConf['absolutePathToTmpSessionDirStr'] . $offlineConf['pathDelimiterStr'] . $currentDirStr, 0777);
}
foreach ($offlineConf['wgetCommandsArr'] as $currentWgetCommandStr) {
log_msg(__LINE__, $currentWgetCommandStr);
if ($offlineConf['offlineMode'] != 'dryrun') system($currentWgetCommandStr);
}
unset($offlineConf['wgetCommandsArr']);
}
/**
* Expects an absolute path to start from and traverses the whole directory.
* All subdirectories and files are returned in a nested array.
*
* Credits:
* This routine is based on the function 'retrieveTree' which is explained in
* the article 'Recursion In PHP: Tapping Unharnessed Power' by Robert Peake
* published on November 18, 2004, on the website
* http://devzone.zend.com/node/view/id/1235. Discovered: 12/20/2008.
* Thank you, Robert!
*
*/
function retrieve_page_tree($pathStr) {
global $offlineConf;
if ($dir = @opendir($pathStr)) {
while (($element = readdir($dir)) !== false) {
if (is_dir($pathStr . $offlineConf['pathDelimiterStr'] . $element) && $element != "." && $element != "..") {
$array[$element] = retrieve_page_tree($pathStr . $offlineConf['pathDelimiterStr'] . $element);
} elseif ($element!= "." && $element!= ".." && (ereg('\.txt$', $element))) {
$array[] = $pathStr . $offlineConf['pathDelimiterStr'] . $element;
$tmpDokuwikiUrlStr = '"' . $offlineConf['dokuwikiShowPageUrlStr'] . convert_absolute_file_system_path_to_relative_dokuwiki_path($pathStr . $offlineConf['pathDelimiterStr'] . $element) . $offlineConf['dokuwikiExportCommandSuffixStr'] . '"';
$tmpRelativeFilenameWithPathStr = str_replace($offlineConf['absolutePathToDataDirStr'] . $offlineConf['pathDelimiterStr'], '', $pathStr) . $offlineConf['pathDelimiterStr'] . str_replace('.txt', '.html', $element);
$tmpOutputFilenameWithPathStr = '"' . $offlineConf['absolutePathToTmpSessionDirStr'] . $offlineConf['pathDelimiterStr'] . $tmpRelativeFilenameWithPathStr . '"';
$offlineConf['wgetCommandsArr'][] = $offlineConf['wgetCommandStr'] . ' ' . $tmpDokuwikiUrlStr . ' -O ' . $tmpOutputFilenameWithPathStr;
$offlineConf['pageDirectoriesArr'][str_replace($offlineConf['absolutePathToDataDirStr'] . $offlineConf['pathDelimiterStr'], '', $pathStr)]++;
$offlineConf['indexHierarchicalArr'][] = $tmpRelativeFilenameWithPathStr;
$offlineConf['indexAlphabeticalArr'][$element] = $tmpRelativeFilenameWithPathStr;
}
}
closedir($dir);
}
return (isset($array) ? $array : false);
}
/**
* Converts an absolute path from the file system into a relative dokuwiki
* path.
*
* 1) Remove prefix for absolute path, e.g.:
* '/data/htdocs/dokuwiki/data/pages/admin/start.txt'
* -->
* 'admin/start.txt'
* 2) Remove file extension:
* 'admin/start.txt'
* -->
* 'admin/start'
* 3) Convert delimiter string to colon:
* 'admin/start'
* -->
* 'admin:start'
*
*/
function convert_absolute_file_system_path_to_relative_dokuwiki_path($elementStr) {
global $offlineConf;
$elementStr = str_replace($offlineConf['absolutePathToPagesDirStr'] . $offlineConf['pathDelimiterStr'], '', $elementStr);
$elementStr = ereg_replace('^(.*)\.' . $offlineConf['pageExtensionStr'] . '$', '\\1', $elementStr);
$elementStr = str_replace($offlineConf['pathDelimiterStr'], ':', $elementStr);
return $elementStr;
}
/**
* Assembles the wget command, which will be used to download the wiki pages.
*
*/
function assemble_wget_command() {
global $offlineConf;
// Verify existence of wget binary file:
check_existence($offlineConf['wgetPathToBinary'], 'file');
if (($offlineConf['wgetHttpUser'] != '') || ($offlineConf['wgetHttpPasswd'] != '')) {
$commandStr = ' --http-user="' . $offlineConf['wgetHttpUser'] . '" --http-passwd="' . $offlineConf['wgetHttpPasswd'] . '"';
}
$commandStr = escapeshellcmd($offlineConf['wgetPathToBinary'] . ' --proxy=off ' . $commandStr);
return $commandStr;
}
/**
* Copies or downloads the cascading style sheet files which a are needed to
* display the wiki pages properly.
*
*/
function process_css_files() {
global $offlineConf;
log_msg(__LINE__, 'Processing css files ...');
if ($offlineConf['template'] == 'default') {
// Use DokuWiki's current default template:
download_css_files($offlineConf['absolutePathToTmpSessionDirStr'], $offlineConf['wgetCommandStr']);
} else {
// Use one of the templates provided with this plugin:
copy_css_files($offlineConf['absolutePathToTmpSessionDirStr'], $offlineConf['template']);
}
}
/**
* Download necessary css files.
*
*/
function download_css_files($absolutePathToTmpDirStr, $wgetCommandStr) {
global $offlineConf;
log_msg(__LINE__, 'Downloading css files ...');
create_directory($absolutePathToTmpDirStr . $offlineConf['pathDelimiterStr'] . 'css', 0777);
$cssFilesArr = array();
$cssFilesArr['all'] = '/lib/exe/css.php?s=all&t=default';
$cssFilesArr['screen'] = '/lib/exe/css.php?t=default';
$cssFilesArr['print'] = '/lib/exe/css.php?s=print&t=default';
foreach ($cssFilesArr as $currentTypeStr => $currentCssSubPathStr) {
$currentWgetCommandStr = $offlineConf['wgetCommandStr'] . ' "' . $offlineConf['dokuwikiBaseUrlStr'] . $currentCssSubPathStr . '" -O "' . $absolutePathToTmpDirStr . $offlineConf['pathDelimiterStr'] . 'css' . $offlineConf['pathDelimiterStr'] . $currentTypeStr . '.css" ' . "\n";
log_msg(__LINE__, $currentWgetCommandStr);
if ($offlineConf['offlineMode'] != 'dryrun') system($currentWgetCommandStr);
}
}
/**
* Copying necessary css files.
*
*/
function copy_css_files($absolutePathToTmpDirStr, $cssTemplateStr = 'default') {
global $offlineConf;
log_msg(__LINE__, 'Copying css files ...');
create_directory($absolutePathToTmpDirStr . $offlineConf['pathDelimiterStr'] . 'css', 0777);
foreach (array('all.css', 'print.css', 'screen.css') as $currentCssFileStr) {
$tmpSourceFilenameWithPathStr = $offlineConf['absolutePathToOfflinePluginDirStr'] . $offlineConf['pathDelimiterStr'] . 'ui' . $offlineConf['pathDelimiterStr'] . $cssTemplateStr . $offlineConf['pathDelimiterStr'] . $currentCssFileStr;
$tmpTargetFilenameWithPathStr = $absolutePathToTmpDirStr . $offlineConf['pathDelimiterStr'] . 'css' . $offlineConf['pathDelimiterStr'] . $currentCssFileStr;
log_msg(__LINE__, 'copying "' . $tmpSourceFilenameWithPathStr . '" to "' . $tmpTargetFilenameWithPathStr . '"');
copy_file($tmpSourceFilenameWithPathStr, $tmpTargetFilenameWithPathStr);
}
}
/**
* Creates a directory in the file system.
*
* The directory is created only if it does not exist already.
* If the directory cannot be created, the program will be aborted.
*
* Subdirectories will be created when necessary.
*
*/
function create_directory($dirStr, $mode = 0777) {
global $offlineConf;
$msgStr = 'Creating directory "' . $dirStr . '" ... ' . "\n";
log_msg(__LINE__, $msgStr);
if (!is_dir($dirStr)) {
if (strstr(PHP_OS, 'WIN')) {
// Windows file system:
$singleDirectoriesArr = explode($offlineConf['pathDelimiterStr'] , $dirStr);
array_shift($singleDirectoriesArr);// Throw away drive letter from array
$currentDirStr = substr($dirStr, 0, 1) . ':';// Drive letter
} else {
// Unix like file system:
$dirStr = ereg_replace('^\/', '', $dirStr);
$singleDirectoriesArr = explode($offlineConf['pathDelimiterStr'] , $dirStr);
$currentDirStr = '';
}
for ($d = 0; $d < sizeof($singleDirectoriesArr); $d++) {
$currentDirStr .= $offlineConf['pathDelimiterStr'] . $singleDirectoriesArr[$d];
if (!is_dir($currentDirStr)) {
$msgStr = ' Creating directory "' . $currentDirStr . '" ... ' . "\n";
if ($offlineConf['offlineMode'] != 'dryrun') {
if (mkdir($currentDirStr, $mode)) {
$msgStr .= 'ok.';
log_msg(__LINE__, compact('msgStr'));
} else {
$msgStr .= 'ERROR: Could not create directory!' . "\n";
$msgStr .= 'Program aborted.' . "\n\n";
log_msg(__LINE__, compact('msgStr'));
die;
}
}
}
}
} else {
$msgStr .= ' already exists.';
log_msg(__LINE__, $msgStr);
}
}
/**
* Copies a file.
*
*/
function copy_file($sourceFilenameWithPathStr, $targetFilenameWithPathStr) {
global $offlineConf;
log_msg(__LINE__, 'Copying files ...' . "\n" . ' Source: ' . $sourceFilenameWithPathStr . "\n" . ' Target: ' . $targetFilenameWithPathStr);
if ($offlineConf['offlineMode'] != 'dryrun') {
check_existence($sourceFilenameWithPathStr, 'file');
check_existence(dirname($targetFilenameWithPathStr), 'directory');
if (!copy($sourceFilenameWithPathStr, $targetFilenameWithPathStr)) {
log_msg(__LINE__, 'ERROR: Could not copy!');
}
}
}
/**
* Delete a file from the file system.
*
*/
function delete_file($filenameWithPathStr, $log = true) {
global $offlineConf;
if ($log) log_msg(__LINE__, 'Deleting "' . $filenameWithPathStr . '" ...');
if (file_exists($filenameWithPathStr)) {
if ($offlineConf['offlineMode'] != 'dryrun') {
if (!unlink($filenameWithPathStr)) {
log_msg(__LINE__, 'Could not delete "' . $filenameWithPathStr . '".');
}
}
}
}
/**
* Removes a directory from the file system.
*
*/
function remove_directory($pathStr, $log = true) {
global $offlineConf;
if ($log) log_msg(__LINE__, 'Removing directory "' . $pathStr . '" ...');
if (is_dir($pathStr)) {
if ($offlineConf['offlineMode'] != 'dryrun') {
if (!rmdir($pathStr)) {
log_msg(__LINE__, 'Could not remove "' . $pathStr . '".');
}
}
}
}
/**
* Checks, whether a file or a directory in the file system exists or not.
* If the file/directory exists, the program simply continues.
* If there is no such file/directory, an error message will be written to the
* log file (only if logging is enabled, i.e. 'writeLogFile' is set to 1).
*
*/
function check_existence($locationStr, $typeStr) {
log_msg(__LINE__, 'Checking whether ' . $typeStr . ' "' . $locationStr . '" exists ...');
if ($typeStr == 'file') {
if (file_exists($locationStr)) {
log_msg(__LINE__, 'ok');
} else {
$msgStr .= 'ERROR: No such file.' . "\n";
$msgStr .= 'Program aborted.' . "\n\n";
log_msg(__LINE__, compact('msgStr'));
die;
}
} else if ($typeStr == 'directory') {
if (is_dir($locationStr)) {
log_msg(__LINE__, 'ok');
} else {
$msgStr .= 'ERROR: No such directory.' . "\n";
$msgStr .= 'Program aborted.' . "\n\n";
log_msg(__LINE__, compact('msgStr'));
die;
}
}
}
/**
* Expects an absolute path to start from and traverses the whole directory.
* All subdirectories and files are returned in a nested array.
*
* Credits:
* This routine is based on the function 'retrieveTree' which is explained in
* the article 'Recursion In PHP: Tapping Unharnessed Power' by Robert Peake
* published on November 18, 2004, on the website
* http://devzone.zend.com/node/view/id/1235. Discovered: 12/20/2008.
* Thank you, Robert!
*
*/
function delete_tmp_session_tree($pathStr) {
global $offlineConf;
log_msg(__LINE__, 'Deleting old temporary session dir ...');
if ($dir = @opendir($pathStr)) {
while (($element = readdir($dir)) !== false) {
if (is_dir($pathStr . $offlineConf['pathDelimiterStr'] . $element) && $element != "." && $element != "..") {
$offlineConf['directoriesToDeleteArr'][] = $pathStr . $offlineConf['pathDelimiterStr'] . $element;
$array[$element] = delete_tmp_session_tree($pathStr . $offlineConf['pathDelimiterStr'] . $element);
remove_directory($pathStr . $offlineConf['pathDelimiterStr'] . $element);
$countDirectoriesDeleted++;
} elseif (($element != ".") && ($element != "..")) {
delete_file($pathStr . $offlineConf['pathDelimiterStr'] . $element);
$array[] = $pathStr . $offlineConf['pathDelimiterStr'] . $element;
$countFilesDeleted++;
}
}
closedir($dir);
} else {
log_msg(__LINE__, 'Nothing to do.');
}
return (isset($array) ? $array : false);
}
function delete_old_tmp_session_directory($absolutePathToTmpSessionDirStr) {
global $offlineConf;
if (is_dir($absolutePathToTmpSessionDirStr)) {
delete_tmp_session_tree($absolutePathToTmpSessionDirStr);
} else {
// There is no temporary session directory left from a previous run
// of the offline plugin:
return;
}
}
/**
* Writes a string to a file specified by its absolute path in the file system
* and its name and extension.
*
* An existing file will be overwritten!
*
*/
function write_file($filenameWithPathStr, $fileContentsStr) {
global $offlineConf;
log_msg(__LINE__, 'Writing file "' . $filenameWithPathStr . '" ...');
if (isset($fileContentsStr) && $fileContentsStr != '') {
if ($offlineConf['offlineMode'] != 'dryrun') {
$filehandle = fopen($filenameWithPathStr, 'w') or log_msg('File could not be opened for writing.');
fwrite($filehandle, $fileContentsStr);
fclose($filehandle) or die('File could not be closed');
}
} else {
log_msg(__LINE__, 'There is nothing to write to nowhere.');
}
}
/**
* Creates an archive of the offline browseable pages in the temporary
* directory.
*
*/
function create_archive() {
global $offlineConf;
log_msg(__LINE__, 'Creating archive ...');
if (($offlineConf['archiverPathToBinary'] != '') && ($offlineConf['archiverOptions'] != '')) {
log_msg(__LINE__, 'Changing working directory to "' . $offlineConf['absolutePathToTmpDirStr'] . '"');
if (!chdir($offlineConf['absolutePathToTmpDirStr'])) {
log_msg(__LINE__, 'Could not change directory to "' . $offlineConf['absolutePathToTmpDirStr'] . '".');
}
$commandStr = escapeshellcmd($offlineConf['archiverPathToBinary'] . ' ' . $offlineConf['archiverOptions']);
$commandStr .= ' "' . dirname(__FILE__) . $offlineConf['pathDelimiterStr'] . 'offline.zip" "offline" >> ';
$commandStr .= $offlineConf['logDirectory'] . $offlineConf['pathDelimiterStr'] . $offlineConf['logDefaultFileName'] . ' 2>&1';
log_msg(__LINE__, $commandStr);
if ($offlineConf['offlineMode'] != 'dryrun') system($commandStr);
}
}
/**
* Processes the directory in which pages are stored.
*
* First, the page directory tree is traversed and all files and subdirectories
* are stored in the global array $offlineConf['pageDirectoriesArr'].
* In the second step this array is walked through and the according directory
* structure is created in the temporary pages directory.
* (Subdirectories are created by DokuWiki if wiki pages are arranged in name
* spaces.)
* Finally, each wiki page is downloaded and saved in the temp directory.
*
*/
function process_media_files() {
global $offlineConf;
log_msg(__LINE__, 'Processing media files ...');
retrieve_media_tree($offlineConf['absolutePathToMediaDirStr']);
log_msg(__LINE__, '--' . join("\n--", array_keys($offlineConf['mediaDirectoriesArr'])));
foreach ($offlineConf['mediaDirectoriesArr'] as $currentDirStr => $count) {
create_directory($offlineConf['absolutePathToTmpSessionDirStr'] . $offlineConf['pathDelimiterStr'] . $currentDirStr, 0777);
}
$currentSourceAndTargetArr = array();
foreach ($offlineConf['mediaFilesSourceAndTargetArr'] as $currentSourceAndTargetArr) {
if ($offlineConf['offlineMode'] != 'dryrun') copy_file($currentSourceAndTargetArr[0], $currentSourceAndTargetArr[1]);
}
unset($offlineConf['mediaFilesSourceAndTargetArr']);
}
/**
* Expects an absolute path to start from and traverses the whole directory.
* All subdirectories and files are returned in a nested array.
*
* Credits:
* This routine is based on the function 'retrieveTree' which is explained in
* the article 'Recursion In PHP: Tapping Unharnessed Power' by Robert Peake
* published on November 18, 2004, on the website
* http://devzone.zend.com/node/view/id/1235. Discovered: 12/20/2008.
* Thank you, Robert!
*
*/
function retrieve_media_tree($pathStr) {
global $offlineConf;
if ($dir = @opendir($pathStr)) {
while (($element = readdir($dir)) !== false) {
if (is_dir($pathStr . $offlineConf['pathDelimiterStr'] . $element) && $element != "." && $element != "..") {
$array[$element] = retrieve_media_tree($pathStr . $offlineConf['pathDelimiterStr'] . $element);
} elseif (($element != ".") && ($element != "..")) {
$array[] = $pathStr . $offlineConf['pathDelimiterStr'] . $element;
$currentMediaSubDirStr = str_replace($offlineConf['absolutePathToDataDirStr'] . $offlineConf['pathDelimiterStr'], '', $pathStr);
$tmpSourceFilenameWithPathStr = $pathStr . $offlineConf['pathDelimiterStr'] . $element;
$tmpTargetFilenameWithPathStr = $offlineConf['absolutePathToTmpSessionDirStr'] . $offlineConf['pathDelimiterStr'] . $currentMediaSubDirStr . $offlineConf['pathDelimiterStr'] . $element;
$offlineConf['mediaFilesSourceAndTargetArr'][] = array($tmpSourceFilenameWithPathStr, $tmpTargetFilenameWithPathStr);
$offlineConf['mediaDirectoriesArr'][$currentMediaSubDirStr]++;
}
}
closedir($dir);
}
return (isset($array) ? $array : false);
}
/**
* Returns the head of a standard DokuWiki offline HTML page.
*
*/
function assemble_html_head($relativePathStr) {
$headStr = '
' . $navigationBarStr . '
'; $linkToMainIndexStr = ''; unset($offlineConf['indexAlphabeticalArr']); return $htmlHeadStr . '