| * | Hannes Magnusson | * +----------------------------------------------------------------------+ * * $Id$ */ /** * This script is based off the original build.chms.bat * in the root of doc-base * * This script does not work with Git, meaning enabling PHD_BETA * will fetch the old version from SVN (March, Anno 2012) */ /** * Configuration */ include_once __DIR__ .'/build-chms-config.php'; /** * The languages to build are retrieved from github. */ if (file_exists(__DIR__ . '\\languages.inc')) { unlink(__DIR__ . '\\languages.inc'); } execute_task('Get list of online languages', PATH_WGET, '--debug --verbose --no-check-certificate "https://raw.githubusercontent.com/php/web-php/master/include/languages.inc" --output-document=' . __DIR__ . '\\languages.inc', 'wget_langs'); if (file_exists(__DIR__ . '\\languages.inc')) { include_once __DIR__ . '\\languages.inc'; } /** * Always build English first. */ unset($ACTIVE_ONLINE_LANGUAGES['en']); ksort($ACTIVE_ONLINE_LANGUAGES); $ACTIVE_ONLINE_LANGUAGES = array('en' => 'English') + $ACTIVE_ONLINE_LANGUAGES; /** * Get the current working directory */ $cwd = getcwd(); /** * Upgrade PhD, if any updates are available */ if(PHD_BETA) { chdir(dirname(PATH_PHD)); execute_task('Updating PhD from svn', PATH_GIT, 'pull', 'phd_git'); chdir($cwd); } else { execute_task('Updating PhD', PATH_PEAR, 'upgrade --alldeps doc.php.net/phd', 'pear'); } /** * Update doc-base, to prevent build errors with * entities */ chdir(PATH_DOC . '\\doc-base\\'); execute_task('Updating doc-base', PATH_GIT, 'pull', 'doc_base'); chdir($cwd); /** * We may want to try build a single language */ if($argc >= 2 && in_array($argv[1], array_keys($ACTIVE_ONLINE_LANGUAGES))) { $ACTIVE_ONLINE_LANGUAGES = Array($argv[1] => $ACTIVE_ONLINE_LANGUAGES[$argv[1]]); } /** * Hold the results of this build */ $build_history = array(); /** * Start iterating over each translation */ foreach($ACTIVE_ONLINE_LANGUAGES as $lang_code => $language) { echo(date('r') . ' Processing language ' . $language . ' \'' . $lang_code . '\':' . PHP_EOL); /** * Update that specific language folder in SVN */ chdir(PATH_DOC . '\\' . $lang_code . '\\'); execute_task('- GIT', PATH_GIT, 'pull', 'git_' . $lang_code); chdir($cwd); /** * Generate .manual-lang.xml */ execute_task('- Configure', PATH_PHP, PATH_DOC . '\doc-base\configure.php --disable-libxml-check --disable-segfault-speed --with-php="' . PATH_PHP . '" --with-lang=' . $lang_code . ' --enable-chm --output=' . PATH_DOC . '\\doc-base\\.manual-' . $lang_code . '.xml', 'configure_' . $lang_code); if(!is_file(PATH_DOC . '\\doc-base\\.manual-' . $lang_code . '.xml')) { echo(date('r') . ' - Build error: configure failed' . PHP_EOL); continue; } /** * Run .manual.xml thru PhD, including the enhanced build if required */ $enhanced = (EXTENDED) ? '-f enhancedchm' : ''; execute_task('- PhD', PATH_PHD, '-d "' . PATH_DOC . '\\doc-base\\.manual-' . $lang_code . '.xml' . '" -P PHP -f chm ' . $enhanced . ' -o "' . PATH_DOC . '\\tmp\\' . $lang_code . '" -L ' . $lang_code, 'phd_' . $lang_code); if(!is_file(PATH_DOC . '\\tmp\\' . $lang_code . '\\php-chm\\php_manual_' . $lang_code . '.hhp')) { echo(date('r') . ' - Build error: PhD failed' . PHP_EOL); continue; } /** * Run DBCSFix.exe to convert Unicode to ASCII. */ $lcid = NULL; $multibyte_search_enabled = (MULTIBYTE_SEARCH && array_key_exists($lang_code, $CHM_FULLTEXT_SEARCH_LCID)); if ($multibyte_search_enabled) { $lcid = $CHM_FULLTEXT_SEARCH_LCID[$lang_code]; $dbcsfix_log = 'dbcsfix_' . $lang_code; execute_task( '- Convert to ASCII for Fulltext Search...', PATH_DBCSFIX, '/d:' . PATH_DOC . '\\tmp\\' . $lang_code . ' ' . '/l:' . $lcid, $dbcsfix_log); } /** * Run the HTML Help Compiler to generate the actual CHM file */ if ($multibyte_search_enabled) { execute_task('- HHC (with Fulltext Search)', PATH_APPLOCALE, $lcid . ' "' . PATH_HHC . '" "' . PATH_DOC . '\\tmp\\' . $lang_code . '\\php-chm\\php_manual_' . $lang_code . '.hhp"', 'hhc_' . $lang_code); } else { execute_task('- HHC', PATH_HHC, '"' . PATH_DOC . '\\tmp\\' . $lang_code . '\\php-chm\\php_manual_' . $lang_code . '.hhp"', 'hhc_' . $lang_code); } if(!is_file(PATH_DOC . '\\tmp\\' . $lang_code . '\\php-chm\\php_manual_' . $lang_code . '.chm')) { echo(date('r') . ' - Build error: HHC failed' . PHP_EOL); continue; } /** * Anything smaller than ~5MB is broken. Common broken sizes are 2MB and 15K. Common good size are 10-12MB. */ if(filesize(PATH_DOC . '\\tmp\\' . $lang_code . '\\php-chm\\php_manual_' . $lang_code . '.chm') < 5000000) { echo(date('r') . ' - Build error: CHM file too small, something went wrong' . PHP_EOL); continue; } /** * Copy the CHM file into the archive */ if(!copy(PATH_DOC . '\\tmp\\' . $lang_code . '\\php-chm\\php_manual_' . $lang_code . '.chm', $chm_filename = PATH_CHM . '\\' . 'php_manual_' . $lang_code . '.chm')) { echo(date('r') . ' - Build error: Unable to copy CHM file into archive folder'); continue; } else { /** * Add to history */ $build_history[] = array('php_manual_' . $lang_code . '.chm', md5_file($chm_filename), filemtime($chm_filename)); } /** * Check if we are supposed to build the enhanced version */ if(EXTENDED) { /** * Run the HTML Help Compiler to generate the actual CHM file */ if ($multibyte_search_enabled) { execute_task('- [Enhanced] HHC (with Fulltext Search)', PATH_APPLOCALE, $lcid . ' "' . PATH_HHC . '" "' . PATH_DOC . '\\tmp\\' . $lang_code . '\\php-enhancedchm\\php_manual_' . $lang_code . '.hhp"', 'hhc_enhanced_' . $lang_code); } else { execute_task('- [Enhanced] HHC', PATH_HHC, '"' . PATH_DOC . '\\tmp\\' . $lang_code . '\\php-enhancedchm\\php_manual_' . $lang_code . '.hhp"', 'hhc_enhanced_' . $lang_code); } if(!is_file(PATH_DOC . '\\tmp\\' . $lang_code . '\\php-enhancedchm\\php_manual_' . $lang_code . '.chm')) { echo(date('r') . ' - Build error: Enhanced: HHC failed' . PHP_EOL); goto cleanup; } /** * Anything smaller than ~5MB is broken. Common broken sizes are 2MB and 15K. Common good size are 10-12MB. */ if(filesize(PATH_DOC . '\\tmp\\' . $lang_code . '\\php-enhancedchm\\php_manual_' . $lang_code . '.chm') < 5000000) { echo(date('r') . ' - Build error: Enhanced: CHM file too small, something went wrong' . PHP_EOL); goto cleanup; } /** * Copy the CHM file into the archive */ if(!copy(PATH_DOC . '\\tmp\\' . $lang_code . '\\php-enhancedchm\\php_manual_' . $lang_code . '.chm', $e_chm_filename = PATH_CHM . '\\' . 'php_enhanced_' . $lang_code . '.chm')) { echo(date('r') . ' - Build error: Enhanced: Unable to copy CHM file into archive folder'); goto cleanup; } else { /** * Add to history */ $build_history[] = array('php_enhanced_' . $lang_code . '.chm', md5_file($e_chm_filename), filemtime($e_chm_filename)); } } /** * Cleanup */ cleanup: { echo(date('r') . ' - Clean up' . PHP_EOL); unlink(PATH_DOC . '\\doc-base\\.manual-' . $lang_code . '.xml'); if(!DEBUG) { glob_recursive_apply('fsdelete', PATH_DOC . '\\tmp\\' . $lang_code . '\\php-chm\\'); if(!EXTENDED) { glob_recursive_apply('fsdelete', PATH_DOC . '\\tmp\\' . $lang_code . '\\php-enhancedchm\\'); } } } } /** * Save build history */ file_put_contents(PATH_CHM . '\\build.log', implode(PHP_EOL, array_map(function($single_build) { return implode("\t", $single_build); }, $build_history))); echo(date('r') . ' Done!'); /** * Removes all files within a directory and then * deletes the directory * * @param callable Callback to the apply function * @param string Glob directory to begin * @param string (optional) The glob pattern to match on * @return void No value is returned */ function glob_recursive_apply($callback, $glob_dir, $pattern = '*') { if(!is_dir($dir)) { return; } $glob = glob($glob_dir . $pattern); if(sizeof($glob)) { foreach($glob as $obj) { call_user_func($callback, $obj, $pattern); } } call_user_func($callback, $obj, $pattern); } /** * Deletes a directory or file * * @param string Directory or filename to delete * @param string The glob pattern to match on * @return void No value is returned */ function fsdelete($obj, $pattern = '*') { if(is_dir($obj)) { glob_recursive_apply('fsdelete', $obj . '\\', $pattern); } else { unlink($obj); } } /** * Gets the contents of a specific log * * @param string Name of the log (usually "program_lang") * @return string Contents of the log */ function log_get_contents($logname) { return(@file_get_contents(PATH_LOG . '\\' . $log . '.log')); } ?>