diff --git a/index.php b/index.php index 088d648..cf5833e 100644 --- a/index.php +++ b/index.php @@ -62,102 +62,40 @@ negligence or otherwise) arising in any way out of the use of this software, even if advised of the possibility of such damage. */ - require_once dirname( __FILE__ ) . '/libs/functions.php'; -$options = get_options(); - $command_line=FALSE; if(isset($argv)){ + require_once dirname( __FILE__ ) . '/libs/static.php'; define("CLI",TRUE); echo 'Daux.io documentation generator'."\n"; - + if(!isset($argv[1])) $argv[1]= 'help'; switch ($argv[1]) { //Generate static web documentation case 'generate': - clean_copy_assets(dirname(__FILE__).'/static'); - - //Generate index.html - $markdown_structure = array(); - $base_url = '.'; - $index = generate_page($options, array(''), $base_url, TRUE, $markdown_structure); - file_put_contents('./static/index.html', $index); - echo '.'; - - foreach ($markdown_structure as $element) { - echo '.'; - $flat_tree_tmp = array(); - if( preg_match('/\.\/(.*)\/(.*)$/', $element['url'], $final_folder) ){ - @mkdir('./static/'.$final_folder[1]); - - $url_params = preg_split('/\//',$final_folder[1] ); - $folder_count = count($url_params); - array_push( $url_params , $final_folder[2] ); - - $base_url = relative_base($folder_count); - $file = generate_page($options, $url_params, $base_url, TRUE, $flat_tree_tmp); - file_put_contents('./static/'.$final_folder[1].'/'.$final_folder[2].'.html', $file); - }else{ - $strFile = str_replace('./', '', $element['url']); - $base_url = '.'; - $file = generate_page($options, array($strFile), $base_url, TRUE, $flat_tree_tmp); - file_put_contents('./static/'.$strFile.'.html', $file); - } - } - echo "finished\n"; - echo "The documentation is generated in static folder\n"; - break; - //Generate one-page documentation - case 'full-doc': - clean_copy_assets(dirname(__FILE__).'/static'); - - $options['template'] ='full-doc'; - $markdown_structure = array(); - //Generate index.html - $markdown_structure = array(); - $base_url = '.'; - $index = generate_page($options, array(''), $base_url, TRUE, $markdown_structure); - file_put_contents('./static/full-doc.html', load_tpl_block('full-doc-blocks/head', $options, $base_url).$index); - echo '.'; - array_pop($markdown_structure); - - foreach ($markdown_structure as $element) { - echo '.'; - $flat_tree_tmp = array(); - if( preg_match('/\.\/(.*)\/(.*)$/', $element['url'], $final_folder) ){ - $url_params = preg_split('/\//',$final_folder[1] ); - $folder_count = count($url_params); - array_push( $url_params , $final_folder[2] ); - - $file = generate_page($options, $url_params, $base_url, TRUE, $flat_tree_tmp); - file_put_contents('./static/full-doc.html', $file, FILE_APPEND); - }else{ - $strFile = str_replace('./', '', $element['url']); - $file = generate_page($options, array($strFile), $base_url, TRUE, $flat_tree_tmp); - file_put_contents('./static/full-doc.html', $file, FILE_APPEND); - } - } - file_put_contents('./static/full-doc.html', file_get_contents('template/full-doc-blocks/foot.tpl'), FILE_APPEND); - echo "finished\n"; + generate_static(); + echo "Finished\n"; echo "The documentation is generated in static folder\n"; break; default: - echo "\n"; + echo "\n"; echo 'Usage:'."\n"; echo ' php index.php generate'."\n"; - echo ' php index.php full-doc'."\n"; - echo "\n"; - echo 'generate. Generate static web'."\n"; - echo 'fulldoc. Generate one-file documentation static html'."\n"; + echo 'Generate static web'."\n"; echo "\n"; break; - } + } exit(); } +require_once(dirname( __FILE__)."/libs/live.php"); +$base_path = str_replace("/index.php", "", $_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF']); define("CLI", FALSE); - -$url_params = url_params(); -generate_page($options, $url_params, get_base_url()); - +build_tree(); +$remove = array($base_path . '/'); +if (!$options['clean_urls']) $remove[] = 'index.php?'; +$request = str_replace($remove, "", $_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']); +if (isset($_POST['markdown']) && $options['file_editor']) + file_put_contents(clean_url_to_file($request), $_POST['markdown']); +echo generate_live($request); diff --git a/libs/functions.php b/libs/functions.php index 0c64245..b47cdd1 100644 --- a/libs/functions.php +++ b/libs/functions.php @@ -1,583 +1,230 @@ "Documentation", - 'tagline' => false, - 'image' => false, - 'theme' => 'blue', - 'docs_path' => 'docs', - 'date_modified' => true, - 'float' => true, - 'repo' => false, - 'toggle_code' => false, - 'twitter' => array(), - 'links' => array(), - 'colors' => false, - 'clean_urls' => true, - 'google_analytics' => false, - 'piwik_analytics' => false, - 'piwik_analytics_id' => 1, - 'ignore' => array(), - 'languages' => array(), - 'file_editor' => false, - 'template' => 'default' - ); - - // Load User Config - $config_file = './docs/config.json'; - if (file_exists($config_file)) { - $config = json_decode(file_get_contents($config_file), true); - $options = array_merge($options, $config); - } - - if ($options['theme'] !== 'custom') { - // Load Theme - if (!in_array($options['theme'], array("blue","navy","green","red"))) { - echo "Daux.io Config Error:
The theme you set is not not a valid option. Please use one of the following options: " . join(array_keys($themes), ', ') . ' or learn more about how to customize the colors.'; - exit; - } - } else { - if (empty($options['colors'])) { - echo 'Daux.io Config Error:
You are trying to use a custom theme, but did not setup your color options in the config. Learn more about how to customize the colors.'; - exit; - } - } - - return $options; -} - -function homepage_url($tree) { - // Check for homepage - if (isset($tree['index'])) { - return '/'; - } else { - return docs_url($tree, false); - } -} - -function docs_url($tree, $branch = false) { - // Get next branch - if (!$branch) { - $branch = current($tree); - } - - if ($branch['type'] === 'file') { - return $branch['url']; - } else if (!empty($branch['tree'])) { - return docs_url($branch['tree']); - } else { - // Try next folder... - $branch = next($tree); - if ($branch) { - return docs_url($tree, $branch); - } else { - echo 'Daux.io Config Error:
Unable to find the first page in the /docs folder. Double check you have at least one file in the root of of the /docs folder. Also make sure you do not have any empty folders. Visit the docs to learn more about how the default routing works.'; - exit; - } - } -} - -function load_page($tree, $url_params) { - if (count($url_params) > 0) { - $branch = find_branch($tree, $url_params); - } else { - $branch = current($tree); - } - - $page = array(); - - if (isset($branch['type']) && $branch['type'] == 'file') { - $html = ''; - if ($branch['name'] !== 'index') { - - $page['title'] = $branch['title']; - $page['modified'] = filemtime($branch['path']); - - } - $html .= MarkdownExtended(file_get_contents($branch['path'])); - - // Markdown editor related - $page['markdown'] = file_get_contents($branch['path']); - $page['path'] = $branch['path']; - - $page['html'] = $html; - - } else { - - $page['title'] = "Oh no"; - $page['html'] = "

Oh No. That page doesn't exist

"; - - } - - - return $page; -} - - -function find_branch($tree, $url_params) { - foreach($url_params as $peice) { - - // Support for cyrillic URLs - $peice = urldecode($peice); - - // Check for homepage - if (empty($peice)) { - $peice = 'index'; - } - - if (isset($tree[$peice])) { - if ($tree[$peice]['type'] == 'folder') { - $tree = $tree[$peice]['tree']; - } else { - $tree = $tree[$peice]; - } - } else { - return false; - } - } - - return $tree; -} - -function url_path() { - $url = parse_url((isset($_SERVER['REQUEST_URI']))?$_SERVER['REQUEST_URI']:''); - $url = $url['path']; - return $url; -} - -function url_params() { - $url = rawurldecode(get_uri()); - $params = explode('/', trim($url, '/')); - return $params; -} - -function clean_sort($text) { - // Remove .md file extension - $text = str_replace('.md', '', $text); - - // Remove sort placeholder - $parts = explode('_', $text); - if (isset($parts[0]) && is_numeric($parts[0])) { - unset($parts[0]); - } - $text = implode('_', $parts); - - return $text; -} - -function clean_name($text) { - $text = str_replace('_', ' ', $text); - return $text; -} - -function RFC3986UrlEncode($string) { - $entities = array('%21', '%2A', '%27', '%28', '%29', '%3B', '%3A', '%40', '%26', '%3D', '%2B', '%24', '%2C', '%2F', '%3F', '%25', '%23', '%5B', '%5D'); - $replacements = array('!', '*', "'", "(", ")", ";", ":", "@", "&", "=", "+", "$", ",", "/", "?", "%", "#", "[", "]"); - return str_replace($entities, $replacements, urlencode($string)); -} - -function build_nav($tree, $url_params) { - // Remove Index - unset($tree['index']); - - $url_path = url_path(); - $html = ''; - return $html; -} - -function get_ignored() { - // TODO: Add support for wildcards - // TODO: Add support for specific paths, i.e. /Publish/Somefile.md vs. /Don't_Publish/Somefile.md - $options = get_options(); - $default_ignored_files = array('config.json', 'cgi-bin', 'Thumbs.db'); - $default_ignored_folders = array(); // To allow for easy addition of default folders if found necessary in the future - $user_ignored_files = array(); - $user_ignored_folders = array(); - // Check if ignore settings exist - if(array_key_exists('ignore', $options)) { - if(array_key_exists('files', $options['ignore'])) { - $user_ignored_files = $options['ignore']['files']; - } - if(array_key_exists('folders', $options['ignore'])) { - $user_ignored_folders = $options['ignore']['folders']; - } - } - - // Merge all ignore arrays together - $all_ignored = array_merge($default_ignored_files, $default_ignored_folders, $user_ignored_files, $user_ignored_folders); - - // Return array of all ignored files and folders - return $all_ignored; -} - -function get_tree($path = '.', $clean_path = '', $title = '', $first = true, $language = null, &$flat_tree = null){ - $options = get_options(); - $tree = array(); - $ignore = get_ignored(); - $dh = @opendir($path); - $index = 0; - - // Build array of paths - $paths = array(); - while(false !== ($file = readdir($dh))){ - $paths[$file] = $file; - } - - // Close the directory handle - closedir($dh); - - // Sort paths - sort($paths); - - if ($first && $language !== null) { - $language_path = $language . "/"; - } else { - $language_path = ""; - } - - // Loop through the paths - // while(false !== ($file = readdir($dh))){ - foreach($paths as $file) { - - // Check that this file or folder is not to be ignored - if(!in_array($file, $ignore) && $file[0] !== '.') { - $full_path = "$path/$file"; - $clean_sort = clean_sort($file); - - // If clean_urls is set to false and this is the first branch of the tree, append index.php to the clean_path. - if($options['clean_urls'] == false) - { - if($first) - { - $url = $clean_path . '/' . $language_path . 'index.php/' . $clean_sort; - } - else - { - $url = $clean_path . '/' . $language_path . $clean_sort; - } - } - else - { - $url = $clean_path . '/' . $language_path . $clean_sort; - } - - $clean_name = clean_name($clean_sort); - - // Title - if (empty($title)) { - $full_title = $clean_name; - } else { - $full_title = $title . ': ' . $clean_name; - } - - if(is_dir("$path/$file")) { - // Directory - $tree[$clean_sort] = array( - 'type' => 'folder', - 'name' => $clean_name, - 'title' => $full_title, - 'path' => $full_path, - 'clean' => $clean_sort, - 'url' => $url, - 'tree'=> (isset($flat_tree) && $flat_tree!==NULL)? - get_tree($full_path, $url, $full_title, false, $language, $flat_tree): - get_tree($full_path, $url, $full_title, false, $language) - ); - } else { - // File - $tree[$clean_sort] = array( - 'type' => 'file', - 'name' => $clean_name, - 'title' => $full_title, - 'path' => $full_path, - 'clean' => $clean_sort, - 'url' => $url, - ); - - if(isset($flat_tree) && $flat_tree!==NULL) - array_push($flat_tree, $tree[$clean_sort]); - } - } - $index++; - } - - return $tree; -} - -/** - * Get's the current "pretty" URI from the URL. It will also correct the QUERY_STRING server var and the $_GET array. - * It supports all forms of mod_rewrite and the following forms of URL: - * - * http://example.com/index.php/foo (returns '/foo') - * http://example.com/index.php?/foo (returns '/foo') - * http://example.com/index.php/foo?baz=bar (returns '/foo') - * http://example.com/index.php?/foo?baz=bar (returns '/foo') - * - * Similarly using mod_rewrite to remove index.php: - * http://example.com/foo (returns '/foo') - * http://example.com/foo?baz=bar (returns '/foo') - * - * @author Dan Horrigan - * @copyright Dan Horrigan - * @license MIT License - * @param bool $prefix_slash whether to return the uri with a '/' in front - * @return string the uri - */ -function get_uri($prefix_slash = true) -{ - if (isset($_SERVER['PATH_INFO'])) - { - $uri = $_SERVER['PATH_INFO']; - } - elseif (isset($_SERVER['REQUEST_URI'])) - { - $uri = $_SERVER['REQUEST_URI']; - if (strpos($uri, $_SERVER['SCRIPT_NAME']) === 0) - { - $uri = substr($uri, strlen($_SERVER['SCRIPT_NAME'])); - } - elseif (strpos($uri, dirname($_SERVER['SCRIPT_NAME'])) === 0) - { - $uri = substr($uri, strlen(dirname($_SERVER['SCRIPT_NAME']))); - } - - // This section ensures that even on servers that require the URI to be in the query string (Nginx) a correct - // URI is found, and also fixes the QUERY_STRING server var and $_GET array. - if (strncmp($uri, '?/', 2) === 0) - { - $uri = substr($uri, 2); - } - $parts = preg_split('#\?#i', $uri, 2); - $uri = $parts[0]; - if (isset($parts[1])) - { - $_SERVER['QUERY_STRING'] = $parts[1]; - parse_str($_SERVER['QUERY_STRING'], $_GET); - } - else - { - $_SERVER['QUERY_STRING'] = ''; - $_GET = array(); - } - $uri = parse_url($uri, PHP_URL_PATH); - } - else - { - // Couldn't determine the URI, so just return false - return false; - } - - // Do some final cleaning of the URI and return it - return ($prefix_slash ? '/' : '').str_replace(array('//', '../'), '/', trim($uri, '/')); -} - -function handle_editor_post($post, $page) { - if(file_exists($page["path"])) { - file_put_contents($page["path"], $post["markdown"]); - } else { - throw new Exception("File doesn't exist", 1); - } -} - -/** - * Generate the page using the correct $url_params - */ - -function generate_page($options, $url_params, $base_url, $return=FALSE, &$flat_tree=NULL){ - //documentation folder defined in various folder languages - if (count($options['languages']) > 0 && count($url_params) > 0 && strlen($url_params[0]) > 0) { - $language = array_shift($url_params); - $base_path = $options['docs_path']. DIRECTORY_SEPARATOR . $language; - } else { - $language = null; - $base_path = $options['docs_path']; - } - - // If a timezone has been set in the config file, override the default PHP timezone for this application. - if(isset($options['timezone'])) - { - date_default_timezone_set($options['timezone']); - } - - $tree = (isset($flat_tree))? - get_tree($base_path, $base_url, '', true, $language,$flat_tree): - get_tree($base_path, $base_url, '', true, $language); - - // If a language is set in the config, rewrite urls based on the language - if (! isset($language) || $language === null) { - $homepage_url = homepage_url($tree); - } else { - $homepage_url = "/"; - } - - if($url_params[0]=='') - $homepage = TRUE; - else - $homepage = FALSE; - - // Redirect to docs, if there is no homepage - if ($homepage && $homepage_url !== '/') { - header('Location: '.docs_url($tree)); - } - - $docs_url = docs_url($tree); - $page = load_page($tree, $url_params); - - - // Handle AJAX requests for file editing - if(isset($_POST["markdown"]) && $options["file_editor"] === true) { - handle_editor_post($_POST, $page); - die; - } - - - - ob_start(); - - include('template/'.$options['template'].'.tpl'); - if ($return === TRUE) - { - $buffer = ob_get_contents(); - @ob_end_clean(); - return $buffer; - }else{ - ob_end_flush(); - } -} - -function load_tpl_block($file, $options, $base_url){ - ob_start(); - - include('template/'.$file.'.tpl'); - $buffer = ob_get_contents(); - @ob_end_clean(); - return $buffer; -} - -function copy_recursive($source, $dest, $ignoreList = array()){ - $src_folder=str_replace(array('.','/'), '', $source); - @mkdir($dest.DIRECTORY_SEPARATOR.$src_folder); - foreach ( - $iterator = new RecursiveIteratorIterator( - new RecursiveDirectoryIterator($source, RecursiveDirectoryIterator::SKIP_DOTS), - RecursiveIteratorIterator::SELF_FIRST) as $item - ) { - if ($item->isDir()) { - @mkdir($dest . DIRECTORY_SEPARATOR . $src_folder . DIRECTORY_SEPARATOR .$iterator->getSubPathName()); - } else { - if (!$ignoreList || !in_array($item, $ignoreList)) @copy($item, $dest . DIRECTORY_SEPARATOR .$src_folder. DIRECTORY_SEPARATOR .$iterator->getSubPathName()); - } - } -} - -function clean_directory($directory){ - foreach ( - $iterator = new RecursiveIteratorIterator( - new RecursiveDirectoryIterator($directory, RecursiveDirectoryIterator::SKIP_DOTS), - RecursiveIteratorIterator::SELF_FIRST) as $item - ) { - @unlink($directory.DIRECTORY_SEPARATOR.$iterator->getSubPathName()); - } -} - -function relative_base($count){ - $relative = ''; - for ($i=0; ($i < $count); $i++ ){ - if (! ($i == 0)) - $relative .= '/'; - $relative .= '..'; - } - return $relative; -} - -function clean_copy_assets($path){ - @mkdir($path); - $options = $GLOBALS["options"]; - //Clean - clean_directory($path); - //Copy assets - $unnecessaryImgs = array('./img/favicon.png', './img/favicon-blue.png', './img/favicon-green.png', './img/favicon-navy.png', './img/favicon-red.png'); - $unnecessaryJs = array(); - if ($options['colors']) { - @mkdir($path.'/less'); - @mkdir($path.'/less/import'); - @copy('./less/import/daux-base.less', $path.'/less/import/daux-base.less'); - $unnecessaryImgs = array_diff($unnecessaryImgs, array('./img/favicon.png')); - } else { - $unnecessaryJs = array('./js/less.min.js'); - @mkdir($path.'/css'); - @copy('./css/daux-'.$options['theme'].'.min.css', $path.'/css/daux-'.$options['theme'].'.min.css'); - $unnecessaryImgs = array_diff($unnecessaryImgs, array('./img/favicon-'.$options['theme'].'.png')); - } - copy_recursive('./img', $path.'/', $unnecessaryImgs); - copy_recursive('./js', $path.'/', $unnecessaryJs); -} + require_once(dirname( __FILE__)."/markdown_extended.php"); + $tree = array(); + $base = dirname(dirname(__FILE__)); + $options = get_options(); + $docs_path = $base . '/' . $options['docs_path']; + $multilanguage = !empty($options['languages']) ? TRUE : FALSE; + + // Options + function get_options() { + global $base; + $options = array( + 'title' => "Documentation", + 'tagline' => false, + 'image' => false, + 'theme' => 'red', + 'docs_path' => 'docs', + 'date_modified' => true, + 'float' => true, + 'repo' => false, + 'toggle_code' => false, + 'twitter' => array(), + 'links' => array(), + 'colors' => false, + 'clean_urls' => true, + 'google_analytics' => false, + 'piwik_analytics' => false, + 'piwik_analytics_id' => 1, + 'ignore' => array(), + 'languages' => array(), + 'file_editor' => false, + 'template' => 'default' + ); + // Load User Config + $config_file = $base . '/docs/config.json'; + if (file_exists($config_file)) { + $config = json_decode(file_get_contents($config_file), true); + $options = array_merge($options, $config); + } + if (!isset($options['ignore']['files'])) $options['ignore']['files'] = array(); + if (!isset($options['ignore']['folders'])) $options['ignore']['folders'] = array(); + + if ($options['theme'] !== 'custom') { + $themes = array("blue","navy","green","red"); + if (!in_array($options['theme'], $themes)) { + echo "Daux.io Config Error:
The theme you set is not not a valid option. Please use one of the following options: " . join(array_keys($themes), ', ') . ' or learn more about how to customize the colors.'; + exit; + } + } else { + if (empty($options['colors'])) { + echo 'Daux.io Config Error:
You are trying to use a custom theme, but did not setup your color options in the config. Learn more about how to customize the colors.'; + exit; + } + } + return $options; + } + + // Build Directory Tree + function build_tree() { + global $tree, $options, $docs_path , $multilanguage, $output_language; + if (!$multilanguage) $tree = directory_tree($docs_path, $options['ignore']); + else + foreach ($options['languages'] as $languageKey => $language) { + $output_language = $languageKey; + $tree[$languageKey] = directory_tree($docs_path . '/' . $languageKey, $options['ignore']); + } + } + + // Recursively add files & directories to Tree + function directory_tree($dir, $ignore) { + global $base_doc, $multilanguage, $output_language; + $tree = array(); + $Item = array_diff(scandir($dir), array(".", "..", "index.md")); + foreach ($Item as $key => $value) { + if (is_dir($dir . '/' . $value)) { + if (!in_array($value, $ignore['folders'])) + $tree[$value] = directory_tree($dir . '/' . $value, $ignore); + } else if (!in_array($value, $ignore['files'])) { + if (substr($value, -3) === ".md") { + $tree[$value] = $value; + if ($multilanguage) + $base_doc[$output_language] = isset($base_doc[$output_language]) ? $base_doc[$output_language] : $dir . '/' . $value; + else $base_doc = isset($base_doc) ? $base_doc : $dir . '/' . $value; + } + } + } + return $tree; + } + + // Build Navigation + function get_navigation($url) { + global $tree, $multilanguage, $output_language, $output_path; + $dir = isset($output_path) ? $output_path : ''; + $return = ""; + return $return; + } + + function build_navigation($tree, $current_dir, $url) { + global $mode, $base_path, $docs_path, $options; + $return = ""; + if ($mode === 'Static') $t = relative_path($current_dir . "/.", $url) . '/'; + else { + $t = "http://" . $base_path . '/'; + if (!$options['clean_urls']) $t .= 'index.php?'; + $rel = clean_url($current_dir, 'Live'); + $t .= ($rel === '') ? '' : $rel . '/'; + } + foreach ($tree as $key => $node) + if (is_array($node)) { + $return .= ""; + $return .= clean_url($key, "Title"); + $return .= ""; + $return .= "
    "; + $dir = ($current_dir === '') ? $key : $current_dir . '/' . $key; + $return .= build_navigation($node, $dir, $url); + $return .= "
"; + $return .= ""; + } + else { + $return .= "" . clean_url($node, "Title"); + $return .= ""; + } + return $return; + } + + // Generate Documentation from Markdown file + function generate_page($file) { + global $base, $base_doc, $base_path, $docs_path, $options, $mode, $relative_base; + $template = $options['template']; + $filename = substr(strrchr($file, "/"), 1); + if ($filename === 'index.md') $homepage = TRUE; + else $homepage = FALSE; + if (!$file) { + $page['path'] = ''; + $page['markdown'] = ''; + $page['content'] = ''; + $page['title'] = 'Oh No'; + $page['content'] = "

Oh No. That page doesn't exist

"; + $options['file_editor'] = false; + } else { + $page['path'] = str_replace($docs_path . '/', "", $file); + $page['markdown'] = file_get_contents($file); + $page['content'] = MarkDownExtended($page['markdown']); + $page['title'] = clean_url($file, 'Title'); + } + $relative_base = ($mode === 'Static') ? relative_path("", $file) : "http://" . $base_path . '/'; + ob_start(); + include($base . "/template/" . $template . ".tpl"); + $return = ob_get_contents(); + @ob_end_clean(); + return $return; + } + + // File to URL + function clean_url($url, $mode = 'Static') { + global $docs_path, $output_path, $options; + switch ($mode) { + case 'Live': + $url = str_replace(array(".md", ".html", ".php"), "", $url); + case 'Static': + $url = str_replace(".md", ".html", $url); + $remove = array($docs_path . '/'); + if (isset($output_path)) $remove[] = $output_path . '/'; + $url = str_replace($remove, "", $url); + $url = explode('/', $url); + foreach ($url as &$a) { + $a = explode('_', $a); + if (isset($a[0]) && is_numeric($a[0])) unset($a[0]); + $a = implode('_', $a); + } + $url = implode('/', $url); + return $url; + case 'Title': + case 'Filename': + $t = substr_count($url, '/'); + if ($t > 0) $url = substr(strrchr($url, "/"), 1); + $url = explode('_', $url); + if (isset($url[0]) && is_numeric($url[0])) unset($url[0]); + if ($mode === 'Filename') $url = implode('_', $url); + else $url = implode(' ', $url); + $url = str_replace(array(".md", ".html"), "", $url); + return $url; + + } + } + + // Get Path based on Server. For Use in template file. + function get_url($url) { + global $mode, $options, $relative_base; + $t = clean_url($url, $mode); + if ($t === 'index') { + if ($mode === 'Static') return $relative_base . 'index.html'; + else return $relative_base; + } + if ($mode === 'Live' && !$options['clean_urls']) $t = 'index.php?' . $t; + return $t; + } + + // Relative Path From Path2 to Path1 + function relative_path($path1, $path2) { + global $output_path, $docs_path, $base; + $remove = array($docs_path . '/'); + if (isset($output_path)) $remove[] = $output_path . '/'; + $remove[] = $base . '/'; + $path1 = str_replace($remove, "", $path1); + $path2 = str_replace($remove, "", $path2); + $nesting = substr_count($path2, "/"); + if ($nesting == 0) return clean_url($path1); + $return = ""; + $t = 0; + while ($t < $nesting) { + $return .= "../"; + $t += 1; + } + $return .= clean_url($path1); + return $return; + } + + +?> diff --git a/libs/live.php b/libs/live.php new file mode 100644 index 0000000..e5d71d5 --- /dev/null +++ b/libs/live.php @@ -0,0 +1,51 @@ + \ No newline at end of file diff --git a/libs/static.php b/libs/static.php new file mode 100644 index 0000000..7edf2c6 --- /dev/null +++ b/libs/static.php @@ -0,0 +1,90 @@ + $language) { + $output_language = $languageKey; + generate_static_branch($tree[$languageKey], $languageKey); + } + $index = $docs_path . '/index.md'; + if (is_file($index)) { + $index = generate_page($index); + file_put_contents($output_path . '/index.html', $index); + } + } + + // Generate Static Content For Given Directory + function generate_static_branch($tree, $current_dir) { + global $docs_path, $output_path; + $p = $output_path; + if ($current_dir !== '') { + $p .= '/' . clean_url($current_dir); + $current_dir .= '/'; + } + if (!is_dir($p)) @mkdir($p); + foreach ($tree as $key => $node) + if (is_array($node)) generate_static_branch($node, $current_dir . $key); + else { + $html = generate_page($docs_path . '/' . $current_dir . $node); + file_put_contents($p . "/" . clean_url($node), $html); + } + } + + // Rmdir + function clean_directory($dir) { + $it = new RecursiveDirectoryIterator($dir); + $files = new RecursiveIteratorIterator($it, + RecursiveIteratorIterator::CHILD_FIRST); + foreach($files as $file) { + if ($file->getFilename() === '.' || $file->getFilename() === '..') continue; + if ($file->isDir()) rmdir($file->getRealPath()); + else unlink($file->getRealPath()); + } + } + + // Copy Local Assets + function clean_copy_assets($path){ + @mkdir($path); + $options = $GLOBALS["options"]; + //Clean + clean_directory($path); + //Copy assets + $unnecessaryImgs = array('./img/favicon.png', './img/favicon-blue.png', './img/favicon-green.png', './img/favicon-navy.png', './img/favicon-red.png'); + $unnecessaryJs = array(); + if ($options['colors']) { + $unnecessaryLess = array('./less/daux-blue.less', './less/daux-green.less', './less/daux-navy.less', './less/daux-red.less'); + copy_recursive('./less', $path.'/', $unnecessaryLess); + $unnecessaryImgs = array_diff($unnecessaryImgs, array('./img/favicon.png')); + } else { + $unnecessaryJs = array('./js/less.min.js'); + @mkdir($path.'/css'); + @copy('./css/daux-'.$options['theme'].'.min.css', $path.'/css/daux-'.$options['theme'].'.min.css'); + $unnecessaryImgs = array_diff($unnecessaryImgs, array('./img/favicon-'.$options['theme'].'.png')); + } + copy_recursive('./img', $path.'/', $unnecessaryImgs); + copy_recursive('./js', $path.'/', $unnecessaryJs); + } + + + // Copy Recursive + function copy_recursive($source, $dest, $ignoreList = array()) { + $src_folder=str_replace(array('.','/'), '', $source); + @mkdir($dest . '/' . $src_folder); + foreach ( + $iterator = new RecursiveIteratorIterator( + new RecursiveDirectoryIterator($source, RecursiveDirectoryIterator::SKIP_DOTS), + RecursiveIteratorIterator::SELF_FIRST) as $item + ) { + if ($item->isDir()) @mkdir($dest . '/' . $src_folder . '/' .$iterator->getSubPathName()); + else if (!$ignoreList || !in_array($item, $ignoreList)) @copy($item, $dest . '/' .$src_folder. '/' .$iterator->getSubPathName()); + } + } + +?> \ No newline at end of file diff --git a/template/default.tpl b/template/default.tpl index 2745f09..6a4dfbf 100644 --- a/template/default.tpl +++ b/template/default.tpl @@ -1,17 +1,17 @@ - - - - + + + + <?php echo $options['title']; ?> - + - + @@ -23,22 +23,22 @@ - + - + - +