1) { $path = ''; for($x = 1; $x < argc(); $x ++) { if(strlen($path)) $path .= '/'; $path .= argv($x); } } if($path) { $title = basename($path); if(! $tocpath) \App::$page['title'] = t('Help:') . ' ' . ucwords(str_replace('-',' ',notags($title))); // Check that there is a "toc" or "sitetoc" located at the specified path. // If there is not, then there was not a translation of the table of contents // available and so default back to the English TOC at /doc/toc.{html,bb,md} // TODO: This is incompatible with the hierarchical TOC construction // defined in /Zotlabs/Widget/Helpindex.php. if($tocpath !== false && load_doc_file('doc/' . $path . '.md') === '' && load_doc_file('doc/' . $path . '.bb') === '' && load_doc_file('doc/' . $path . '.html') === '' ) { $path = $title; } $text = load_doc_file('doc/' . $path . '.md'); if(! $text) { $text = load_doc_file('doc/' . $path . '.bb'); if($text) $doctype = 'bbcode'; } if(! $text) { $text = load_doc_file('doc/' . $path . '.html'); if($text) $doctype = 'html'; } } if(($tocpath) && (! $text)) return ''; if($tocpath === false) { if(! $text) { $text = load_doc_file('doc/Site.md'); \App::$page['title'] = t('Help'); } if(! $text) { $doctype = 'bbcode'; $text = load_doc_file('doc/main.bb'); goaway('/help/about/about'); \App::$page['title'] = t('Help'); } if(! $text) { header($_SERVER["SERVER_PROTOCOL"] . ' 404 ' . t('Not Found')); $tpl = get_markup_template("404.tpl"); return replace_macros($tpl, array( '$message' => t('Page not found.') )); } } if($doctype === 'html') $content = parseIdentityAwareHTML($text); if($doctype === 'markdown') { # escape #include tags $text = preg_replace('/#include/ism', '%%include', $text); $content = MarkdownExtra::defaultTransform($text); $content = preg_replace('/%%include/ism', '#include', $content); } if($doctype === 'bbcode') { require_once('include/bbcode.php'); $content = zidify_links(bbcode($text)); // bbcode retargets external content to new windows. This content is internal. $content = str_replace(' target="_blank"', '', $content); } $content = preg_replace_callback("/#include (.*?)\;/ism", 'preg_callback_help_include', $content); return translate_projectname($content); } function preg_callback_help_include($matches) { if($matches[1]) { $include = str_replace($matches[0],load_doc_file($matches[1]),$matches[0]); if(preg_match('/\.bb$/', $matches[1]) || preg_match('/\.txt$/', $matches[1])) { require_once('include/bbcode.php'); $include = zidify_links(bbcode($include)); $include = str_replace(' target="_blank"','',$include); } elseif(preg_match('/\.md$/', $matches[1])) { $include = MarkdownExtra::defaultTransform($include); } return $include; } } /** * @brief * * @return boolean|array */ function determine_help_language() { $lang_detect = new Text_LanguageDetect(); // Set this mode to recognize language by the short code like "en", "ru", etc. $lang_detect->setNameMode(2); // If the language was specified in the URL, override the language preference // of the browser. Default to English if both of these are absent. if($lang_detect->languageExists(argv(1))) { $lang = argv(1); $from_url = true; } else { $lang = \App::$language; if(! isset($lang)) $lang = 'en'; $from_url = false; } return array('language' => $lang, 'from_url' => $from_url); } function load_doc_file($s) { $path = 'doc'; // Determine the language and modify the path accordingly $x = determine_help_language(); $lang = $x['language']; $url_idx = ($x['from_url'] ? 1 : 0); // The English translation is at the root of /doc/. Other languages are in // subfolders named by the language code such as "de", "es", etc. if($lang !== 'en') { $path .= '/' . $lang; } $b = basename($s); for($i=1+$url_idx; $i