Refactor Code. Everything Works

This commit is contained in:
Gautham Warrier 2014-02-27 23:00:40 +05:30
parent 4bf7c42854
commit df1c92134f
8 changed files with 427 additions and 756 deletions

View File

@ -62,12 +62,10 @@ negligence or otherwise) arising in any way out of the use of this
software, even if advised of the possibility of such damage. software, even if advised of the possibility of such damage.
*/ */
require_once dirname( __FILE__ ) . '/libs/functions.php'; require_once dirname( __FILE__ ) . '/libs/functions.php';
$options = get_options();
$command_line=FALSE; $command_line=FALSE;
if(isset($argv)){ if(isset($argv)){
require_once dirname( __FILE__ ) . '/libs/static.php';
define("CLI",TRUE); define("CLI",TRUE);
echo 'Daux.io documentation generator'."\n"; echo 'Daux.io documentation generator'."\n";
@ -77,87 +75,27 @@ if(isset($argv)){
switch ($argv[1]) { switch ($argv[1]) {
//Generate static web documentation //Generate static web documentation
case 'generate': case 'generate':
clean_copy_assets(dirname(__FILE__).'/static'); generate_static();
echo "Finished\n";
//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";
echo "The documentation is generated in static folder\n"; echo "The documentation is generated in static folder\n";
break; break;
default: default:
echo "\n"; echo "\n";
echo 'Usage:'."\n"; echo 'Usage:'."\n";
echo ' php index.php generate'."\n"; echo ' php index.php generate'."\n";
echo ' php index.php full-doc'."\n"; echo 'Generate static web'."\n";
echo "\n";
echo 'generate. Generate static web'."\n";
echo 'fulldoc. Generate one-file documentation static html'."\n";
echo "\n"; echo "\n";
break; break;
} }
exit(); exit();
} }
require_once(dirname( __FILE__)."/libs/live.php");
$base_path = str_replace("/index.php", "", $_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF']);
define("CLI", FALSE); define("CLI", FALSE);
build_tree();
$url_params = url_params(); $remove = array($base_path . '/');
generate_page($options, $url_params, get_base_url()); 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);

View File

@ -1,54 +1,20 @@
<?php <?php
// Enable for debugging
// ini_set('display_errors', 1);
// error_reporting(E_ALL);
/* require_once(dirname( __FILE__)."/markdown_extended.php");
* WARNING: DO NOT EDIT THIS FILE. $tree = array();
* If you edit this file, you will not be able to update to new versions of $base = dirname(dirname(__FILE__));
* Daux.io without overwritting your changes. Instead use the config.json file $options = get_options();
* in the /docs folder to customize your documentation. $docs_path = $base . '/' . $options['docs_path'];
* $multilanguage = !empty($options['languages']) ? TRUE : FALSE;
* Want to add a new feature? Send me a pull request or open an issue - https://github.com/justinwalsh/daux.io
*
* Learn more about what you can customize here: http://daux.io
*/
require_once dirname( __FILE__) . '/markdown_extended.php'; // Options
// Check for homepage
$homepage = (get_uri(false) === "") ? true : false;
// Stores the base url under which daux is running
global $base_url;
$base_url = '/';
// Set the base url of where the script is located
if (isset($_SERVER['SCRIPT_NAME']))
{
$base_url = substr($_SERVER['SCRIPT_NAME'], 0, strrpos($_SERVER['SCRIPT_NAME'] , '/')); // find the full URL to this application from server root
}
// Hide annoying date() Warnings due to no Timezone being set.
if( ! ini_get('date.timezone') )
{
date_default_timezone_set('GMT');
}
function get_base_url()
{
global $base_url;
return $base_url;
};
// Daux.io Functions
function get_options() { function get_options() {
global $base;
$options = array( $options = array(
'title' => "Documentation", 'title' => "Documentation",
'tagline' => false, 'tagline' => false,
'image' => false, 'image' => false,
'theme' => 'blue', 'theme' => 'red',
'docs_path' => 'docs', 'docs_path' => 'docs',
'date_modified' => true, 'date_modified' => true,
'float' => true, 'float' => true,
@ -66,17 +32,18 @@ function get_options() {
'file_editor' => false, 'file_editor' => false,
'template' => 'default' 'template' => 'default'
); );
// Load User Config // Load User Config
$config_file = './docs/config.json'; $config_file = $base . '/docs/config.json';
if (file_exists($config_file)) { if (file_exists($config_file)) {
$config = json_decode(file_get_contents($config_file), true); $config = json_decode(file_get_contents($config_file), true);
$options = array_merge($options, $config); $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') { if ($options['theme'] !== 'custom') {
// Load Theme $themes = array("blue","navy","green","red");
if (!in_array($options['theme'], array("blue","navy","green","red"))) { if (!in_array($options['theme'], $themes)) {
echo "<strong>Daux.io Config Error:</strong><br>The theme you set is not not a valid option. Please use one of the following options: " . join(array_keys($themes), ', ') . ' or <a href="http://daux.io">learn more</a> about how to customize the colors.'; echo "<strong>Daux.io Config Error:</strong><br>The theme you set is not not a valid option. Please use one of the following options: " . join(array_keys($themes), ', ') . ' or <a href="http://daux.io">learn more</a> about how to customize the colors.';
exit; exit;
} }
@ -86,498 +53,178 @@ function get_options() {
exit; exit;
} }
} }
return $options; return $options;
} }
function homepage_url($tree) { // Build Directory Tree
// Check for homepage function build_tree() {
if (isset($tree['index'])) { global $tree, $options, $docs_path , $multilanguage, $output_language;
return '/'; if (!$multilanguage) $tree = directory_tree($docs_path, $options['ignore']);
} else { else
return docs_url($tree, false); foreach ($options['languages'] as $languageKey => $language) {
$output_language = $languageKey;
$tree[$languageKey] = directory_tree($docs_path . '/' . $languageKey, $options['ignore']);
} }
} }
function docs_url($tree, $branch = false) { // Recursively add files & directories to Tree
// Get next branch function directory_tree($dir, $ignore) {
if (!$branch) { global $base_doc, $multilanguage, $output_language;
$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 '<strong>Daux.io Config Error:</strong><br>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 <a href="http://daux.io">learn more</a> 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'] = "<h3>Oh No. That page doesn't exist</h3>";
}
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 = '<ul class="nav nav-list">';
foreach($tree as $key => $val) {
// Active Tree Node
if (isset($url_params[0]) && $url_params[0] == $val['clean']) {
array_shift($url_params);
// Final Node
if ($url_path == RFC3986UrlEncode($val['url'])) {
$html .= '<li class="active">';
} else {
$html .= '<li class="open">';
}
} else {
$html .= '<li>';
}
if ($val['type'] == 'folder') {
$html .= '<a href="#" class="aj-nav folder">'.$val['name'].'</a>';
$html .= build_nav($val['tree'], $url_params);
} else {
$html .= '<a href="'.$val['url'].((CLI)?'.html':'').'">'.$val['name'].'</a>';
}
$html .= '</li>';
}
$html .= '</ul>';
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(); $tree = array();
$ignore = get_ignored(); $Item = array_diff(scandir($dir), array(".", "..", "index.md"));
$dh = @opendir($path); foreach ($Item as $key => $value) {
$index = 0; if (is_dir($dir . '/' . $value)) {
if (!in_array($value, $ignore['folders']))
// Build array of paths $tree[$value] = directory_tree($dir . '/' . $value, $ignore);
$paths = array(); } else if (!in_array($value, $ignore['files'])) {
while(false !== ($file = readdir($dh))){ if (substr($value, -3) === ".md") {
$paths[$file] = $file; $tree[$value] = $value;
} if ($multilanguage)
$base_doc[$output_language] = isset($base_doc[$output_language]) ? $base_doc[$output_language] : $dir . '/' . $value;
// Close the directory handle else $base_doc = isset($base_doc) ? $base_doc : $dir . '/' . $value;
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; return $tree;
} }
/** // Build Navigation
* Get's the current "pretty" URI from the URL. It will also correct the QUERY_STRING server var and the $_GET array. function get_navigation($url) {
* It supports all forms of mod_rewrite and the following forms of URL: global $tree, $multilanguage, $output_language, $output_path;
* $dir = isset($output_path) ? $output_path : '';
* http://example.com/index.php/foo (returns '/foo') $return = "<ul class=\"nav nav-list\">";
* http://example.com/index.php?/foo (returns '/foo') $return .= $multilanguage ? build_navigation($tree[$output_language], (($dir !== '') ? $dir . '/' : '') . $output_language, $url) : build_navigation($tree, $dir, $url);
* http://example.com/index.php/foo?baz=bar (returns '/foo') $return .= "</ul>";
* http://example.com/index.php?/foo?baz=bar (returns '/foo') return $return;
*
* 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 <http://dhorrigan.com>
* @copyright Dan Horrigan
* @license MIT License <http://www.opensource.org/licenses/mit-license.php>
* @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 function build_navigation($tree, $current_dir, $url) {
// URI is found, and also fixes the QUERY_STRING server var and $_GET array. global $mode, $base_path, $docs_path, $options;
if (strncmp($uri, '?/', 2) === 0) $return = "";
{ if ($mode === 'Static') $t = relative_path($current_dir . "/.", $url) . '/';
$uri = substr($uri, 2); else {
$t = "http://" . $base_path . '/';
if (!$options['clean_urls']) $t .= 'index.php?';
$rel = clean_url($current_dir, 'Live');
$t .= ($rel === '') ? '' : $rel . '/';
} }
$parts = preg_split('#\?#i', $uri, 2); foreach ($tree as $key => $node)
$uri = $parts[0]; if (is_array($node)) {
if (isset($parts[1])) $return .= "<li";
{ if (!(strpos($url, $key) === FALSE)) $return .= " class=\"open\"";
$_SERVER['QUERY_STRING'] = $parts[1]; $return .= ">";
parse_str($_SERVER['QUERY_STRING'], $_GET); $return .= "<a href=\"#\" class=\"aj-nav folder\">";
$return .= clean_url($key, "Title");
$return .= "</a>";
$return .= "<ul class=\"nav nav-list\">";
$dir = ($current_dir === '') ? $key : $current_dir . '/' . $key;
$return .= build_navigation($node, $dir, $url);
$return .= "</ul>";
$return .= "</li>";
} }
else else {
{ $return .= "<li";
$_SERVER['QUERY_STRING'] = ''; if ($url === $current_dir . '/' . $node) $return .= " class=\"active\"";
$_GET = array(); $return .= ">";
$link = $t . clean_url($node, $mode);
$return .= "<a href=\"" . $link . "\">" . clean_url($node, "Title");
$return .= "</a></li>";
} }
$uri = parse_url($uri, PHP_URL_PATH); return $return;
}
else
{
// Couldn't determine the URI, so just return false
return false;
} }
// Do some final cleaning of the URI and return it // Generate Documentation from Markdown file
return ($prefix_slash ? '/' : '').str_replace(array('//', '../'), '/', trim($uri, '/')); function generate_page($file) {
} global $base, $base_doc, $base_path, $docs_path, $options, $mode, $relative_base;
$template = $options['template'];
function handle_editor_post($post, $page) { $filename = substr(strrchr($file, "/"), 1);
if(file_exists($page["path"])) { if ($filename === 'index.md') $homepage = TRUE;
file_put_contents($page["path"], $post["markdown"]); else $homepage = FALSE;
if (!$file) {
$page['path'] = '';
$page['markdown'] = '';
$page['content'] = '';
$page['title'] = 'Oh No';
$page['content'] = "<h3>Oh No. That page doesn't exist</h3>";
$options['file_editor'] = false;
} else { } else {
throw new Exception("File doesn't exist", 1); $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 . '/';
/**
* 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(); ob_start();
include($base . "/template/" . $template . ".tpl");
include('template/'.$options['template'].'.tpl'); $return = ob_get_contents();
if ($return === TRUE)
{
$buffer = ob_get_contents();
@ob_end_clean(); @ob_end_clean();
return $buffer; return $return;
}else{ }
ob_end_flush();
// 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;
} }
} }
function load_tpl_block($file, $options, $base_url){ // Get Path based on Server. For Use in template file.
ob_start(); function get_url($url) {
global $mode, $options, $relative_base;
include('template/'.$file.'.tpl'); $t = clean_url($url, $mode);
$buffer = ob_get_contents(); if ($t === 'index') {
@ob_end_clean(); if ($mode === 'Static') return $relative_base . 'index.html';
return $buffer; else return $relative_base;
}
if ($mode === 'Live' && !$options['clean_urls']) $t = 'index.php?' . $t;
return $t;
} }
function copy_recursive($source, $dest, $ignoreList = array()){ // Relative Path From Path2 to Path1
$src_folder=str_replace(array('.','/'), '', $source); function relative_path($path1, $path2) {
@mkdir($dest.DIRECTORY_SEPARATOR.$src_folder); global $output_path, $docs_path, $base;
foreach ( $remove = array($docs_path . '/');
$iterator = new RecursiveIteratorIterator( if (isset($output_path)) $remove[] = $output_path . '/';
new RecursiveDirectoryIterator($source, RecursiveDirectoryIterator::SKIP_DOTS), $remove[] = $base . '/';
RecursiveIteratorIterator::SELF_FIRST) as $item $path1 = str_replace($remove, "", $path1);
) { $path2 = str_replace($remove, "", $path2);
if ($item->isDir()) { $nesting = substr_count($path2, "/");
@mkdir($dest . DIRECTORY_SEPARATOR . $src_folder . DIRECTORY_SEPARATOR .$iterator->getSubPathName()); if ($nesting == 0) return clean_url($path1);
} else { $return = "";
if (!$ignoreList || !in_array($item, $ignoreList)) @copy($item, $dest . DIRECTORY_SEPARATOR .$src_folder. DIRECTORY_SEPARATOR .$iterator->getSubPathName()); $t = 0;
} while ($t < $nesting) {
$return .= "../";
$t += 1;
} }
$return .= clean_url($path1);
return $return;
} }
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);
}

51
libs/live.php Normal file
View File

@ -0,0 +1,51 @@
<?php
// Generate Page
function generate_live($page) {
global $options, $multilanguage, $output_language, $base, $base_path, $mode;
$mode = 'Live';
if ($multilanguage) {
$b = explode('/', clean_url($page, "Live"));
$output_language = $b[0];
}
return generate_page(clean_url_to_file($page));
}
// Clean Live Url
function clean_live($url) {
return clean_url($url, "Live");
}
// Retrieve File From Clean URL
function clean_url_to_file($url) {
global $tree, $docs_path;
$location = getfile($tree, $url, $docs_path);
return $location;
}
// Get File from $url
function getfile($tree, $url, $current_dir, $flag = FALSE) {
global $docs_path, $base_doc, $options;
$url = clean_url($url, "Live");
if ($url === '' || $url === 'index') {
if (is_file($docs_path . "/index.md")) return $docs_path . "/index.md";
else {
if (empty($options['languages'])) return $base_doc;
else return $base_doc[array_keys($base_doc)[0]];
}
} else {
$url = explode("/", $url);
$file = $docs_path;
foreach ($url as $part) {
$dirs = array_keys($tree);
$key = array_search($part, array_map("clean_live", $dirs));
if ($key === FALSE) {
return FALSE;
}
$file .= '/' . $dirs[$key];
$tree = $tree[$dirs[$key]];
}
return $file;
}
}
?>

90
libs/static.php Normal file
View File

@ -0,0 +1,90 @@
<?php
// Generate Static Documentation
function generate_static() {
global $tree, $base, $docs_path, $output_path, $options, $mode, $multilanguage, $output_language;
$mode = 'Static';
$output_path = $base . '/static';
clean_copy_assets($output_path);
build_tree();
if (!$multilanguage) generate_static_branch($tree, '');
else
foreach ($options['languages'] as $languageKey => $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());
}
}
?>

View File

@ -9,9 +9,9 @@
<meta name="description" content="<?php echo $options['tagline'];?>" /> <meta name="description" content="<?php echo $options['tagline'];?>" />
<meta name="author" content="<?php echo $options['title']; ?>"> <meta name="author" content="<?php echo $options['title']; ?>">
<?php if ($options['colors']) { ?> <?php if ($options['colors']) { ?>
<link rel="icon" href="<?php echo $base_url ?>/img/favicon.png" type="image/x-icon"> <link rel="icon" href="<?php echo $relative_base; ?>img/favicon.png" type="image/x-icon">
<?php } else { ?> <?php } else { ?>
<link rel="icon" href="<?php echo $base_url ?>/img/favicon-<?php echo $options['theme'];?>.png" type="image/x-icon"> <link rel="icon" href="<?php echo $relative_base; ?>img/favicon-<?php echo $options['theme'];?>.png" type="image/x-icon">
<?php } ?> <?php } ?>
<!-- Mobile --> <!-- Mobile -->
<meta name="apple-mobile-web-app-capable" content="yes" /> <meta name="apple-mobile-web-app-capable" content="yes" />
@ -23,22 +23,22 @@
<!-- LESS --> <!-- LESS -->
<?php if ($options['colors']) { ?> <?php if ($options['colors']) { ?>
<style type="text/less"> <style type="text/less">
@import "<?php echo $relative_base; ?>less/import/daux-base.less";
<?php foreach($options['colors'] as $k => $v) { ?> <?php foreach($options['colors'] as $k => $v) { ?>
@<?php echo $k;?>: <?php echo $v;?>; @<?php echo $k;?>: <?php echo $v;?>;
<?php } ?> <?php } ?>
@import "<?php echo $base_url ?>/less/import/daux-base.less";
</style> </style>
<script src="<?php echo $base_url ?>/js/less.min.js"></script> <script src="<?php echo $relative_base; ?>js/less.min.js"></script>
<?php } else { ?> <?php } else { ?>
<link rel="stylesheet" href="<?php echo $base_url ?>/css/daux-<?php echo $options['theme'];?>.min.css"> <link rel="stylesheet" href="<?php echo $relative_base; ?>css/daux-<?php echo $options['theme'];?>.min.css">
<?php } ?> <?php } ?>
</head> </head>
<body> <body>
<?php if ($homepage) { ?> <?php if ($homepage) { ?>
<!-- Hompage --> <!-- Homepage -->
<div class="navbar navbar-fixed-top"> <div class="navbar navbar-fixed-top">
<div class="container"> <div class="container">
<a class="brand navbar-brand pull-left" href="<?php echo $base_url ?><?php echo $homepage_url;?>"><?php echo $options['title']; ?></a> <a class="brand navbar-brand pull-left" href="<?php echo get_url('index'); ?>"><?php echo $options['title']; ?></a>
<p class="navbar-text pull-right"> <p class="navbar-text pull-right">
Generated by <a href="http://daux.io">Daux.io</a> Generated by <a href="http://daux.io">Daux.io</a>
</p> </p>
@ -57,7 +57,7 @@
<div class="row"> <div class="row">
<div class="col-sm-10 col-sm-offset-1"> <div class="col-sm-10 col-sm-offset-1">
<?php if ($options['image']) { ?> <?php if ($options['image']) { ?>
<img class="homepage-image img-responsive" src="<?php echo $base_url ?>/<?php echo $options['image'];?>" alt="<?php echo $options['title'];?>"> <img class="homepage-image img-responsive" src="<?php echo $options['image'];?>" alt="<?php echo $options['title'];?>">
<?php } ?> <?php } ?>
</div> </div>
</div> </div>
@ -75,12 +75,12 @@
<?php } ?> <?php } ?>
<?php if (count($options['languages']) > 0) { ?> <?php if (count($options['languages']) > 0) { ?>
<?php foreach ($options['languages'] as $language_key => $language_name) { ?> <?php foreach ($options['languages'] as $language_key => $language_name) { ?>
<a href="<?php echo $base_url . "/" . $language_key . "/"; ?>" class="btn btn-primary btn-hero"> <a href="<?php echo get_url($base_doc[$language_key]); ?>" class="btn btn-primary btn-hero">
<?php echo $language_name; ?> <?php echo $language_name; ?>
</a> </a>
<?php } ?> <?php } ?>
<?php } else { ?> <?php } else { ?>
<a href="<?php echo $docs_url;?>" class="btn btn-primary btn-hero"> <a href="<?php echo get_url($base_doc);?>" class="btn btn-primary btn-hero">
View Documentation View Documentation
</a> </a>
<?php } ?> <?php } ?>
@ -93,7 +93,7 @@
<div class="container"> <div class="container">
<div class="row"> <div class="row">
<div class="col-sm-10 col-sm-offset-1"> <div class="col-sm-10 col-sm-offset-1">
<?php echo $page['html'];?> <?php echo $page['content'];?>
</div> </div>
</div> </div>
</div> </div>
@ -134,7 +134,7 @@
<div class="container-fluid fluid-height wrapper"> <div class="container-fluid fluid-height wrapper">
<div class="navbar navbar-fixed-top"> <div class="navbar navbar-fixed-top">
<div class="container-fluid"> <div class="container-fluid">
<a class="brand navbar-brand pull-left" href="<?php echo $base_url ?><?php echo $homepage_url;?>"><?php echo $options['title']; ?></a> <a class="brand navbar-brand pull-left" href="<?php echo get_url('index'); ?>"><?php echo $options['title']; ?></a>
<p class="navbar-text pull-right"> <p class="navbar-text pull-right">
Generated by <a href="http://daux.io">Daux.io</a> Generated by <a href="http://daux.io">Daux.io</a>
</p> </p>
@ -153,8 +153,7 @@
</div> </div>
<div id="sub-nav-collapse" class="sub-nav-collapse"> <div id="sub-nav-collapse" class="sub-nav-collapse">
<!-- Navigation --> <!-- Navigation -->
<?php echo build_nav($tree, $url_params); ?> <?php echo get_navigation($file); ?>
<?php if (!empty($options['links']) || !empty($options['twitter'])) { ?> <?php if (!empty($options['links']) || !empty($options['twitter'])) { ?>
<div class="well well-sidebar"> <div class="well well-sidebar">
<!-- Links --> <!-- Links -->
@ -181,7 +180,7 @@
<?php if($options['date_modified'] && isset($page['modified'])) { ?> <?php if($options['date_modified'] && isset($page['modified'])) { ?>
<div class="page-header sub-header clearfix"> <div class="page-header sub-header clearfix">
<h1><?php echo $page['title'];?> <h1><?php echo $page['title'];?>
<?php if($options["file_editor"]) { ?> <?php if ($mode === 'Live' && $options["file_editor"]) { ?>
<a href="javascript:;" id="editThis" class="btn">Edit this page</a> <a href="javascript:;" id="editThis" class="btn">Edit this page</a>
<?php } ?> <?php } ?>
</h1> </h1>
@ -195,14 +194,14 @@
<?php } else { ?> <?php } else { ?>
<div class="page-header"> <div class="page-header">
<h1><?php echo (isset($page['title']))?$page['title']:$options['title'];?></h1> <h1><?php echo (isset($page['title']))?$page['title']:$options['title'];?></h1>
<?php if($options["file_editor"]) { ?> <?php if ($mode === 'Live' && $options["file_editor"]) { ?>
<a href="javascript:;" id="editThis" class="btn">Edit this page</a> <a href="javascript:;" id="editThis" class="btn">Edit this page</a>
<?php } ?> <?php } ?>
</h1> </h1>
</div> </div>
<?php } ?> <?php } ?>
<?php echo $page['html'];?> <?php echo $page['content']; ?>
<?php if($options["file_editor"]) { ?> <?php if ($mode === 'Live' && $options["file_editor"]) { ?>
<div class="editor <?php if(!$options['date_modified']) { ?>paddingTop<?php } ?>"> <div class="editor <?php if(!$options['date_modified']) { ?>paddingTop<?php } ?>">
<h3>You are editing <?php echo $page['path']; ?>&nbsp;<a href="javascript:;" class="closeEditor btn btn-warning">Close</a></h3> <h3>You are editing <?php echo $page['path']; ?>&nbsp;<a href="javascript:;" class="closeEditor btn btn-warning">Close</a></h3>
<div class="navbar navbar-inverse navbar-default navbar-fixed-bottom" role="navigation"> <div class="navbar navbar-inverse navbar-default navbar-fixed-bottom" role="navigation">
@ -251,25 +250,23 @@
<!-- hightlight.js --> <!-- hightlight.js -->
<script src="<?php echo $base_url ?>/js/highlight.min.js"></script> <script src="<?php echo $relative_base; ?>js/highlight.min.js"></script>
<script>hljs.initHighlightingOnLoad();</script> <script>hljs.initHighlightingOnLoad();</script>
<!-- Navigation --> <!-- Navigation -->
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script> <script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
<?php if($options["file_editor"]) { ?>
<!-- Front end file editor -->
<script src="<?php echo $base_url ?>/js/editor.js"></script>
<?php } ?>
<script> <script>
if (typeof jQuery == 'undefined') { if (typeof jQuery == 'undefined')
document.write(unescape("%3Cscript src='<?php echo $base_url ?>/js/jquery-1.11.0.min.js' type='text/javascript'%3E%3C/script%3E")); document.write(unescape("%3Cscript src='<?php echo $relative_base; ?>js/jquery-1.11.0.min.js' type='text/javascript'%3E%3C/script%3E"));
}
</script> </script>
<script src="<?php echo $base_url ?>/js/bootstrap.min.js"></script> <?php if ($mode === 'Live' && $options["file_editor"]) { ?>
<script src="<?php echo $base_url ?>/js/custom.js"></script> <!-- Front end file editor -->
<script src="<?php echo $relative_base; ?>js/editor.js"></script>
<?php } ?>
<script src="<?php echo $relative_base; ?>js/bootstrap.min.js"></script>
<script src="<?php echo $relative_base; ?>js/custom.js"></script>
<!--[if lt IE 9]> <!--[if lt IE 9]>
<script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script> <script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script>
<![endif]--> <![endif]-->
</body> </body>

View File

@ -1,2 +0,0 @@
</body>
</html>

View File

@ -1,45 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<title><?php echo $options['title']; ?></title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="description" content="<?php echo $options['tagline'];?>" />
<meta name="author" content="<?php echo $options['title']; ?>">
<?php if ($options['colors']) { ?>
<link rel="icon" href="<?php echo $base_url ?>/img/favicon.png" type="image/x-icon">
<?php } else { ?>
<link rel="icon" href="<?php echo $base_url ?>/img/favicon-<?php echo $options['theme'];?>.png" type="image/x-icon">
<?php } ?>
<!-- LESS -->
<?php if ($options['colors']) { ?>
<style type="text/less">
<?php foreach($options['colors'] as $k => $v) { ?>
@<?php echo $k;?>: <?php echo $v;?>;
<?php } ?>
@import "<?php echo $base_url ?>/less/import/daux-base.less";
</style>
<script src="<?php echo $base_url ?>/js/less.min.js"></script>
<?php } else { ?>
<link rel="stylesheet" href="<?php echo $base_url ?>/css/daux-<?php echo $options['theme'];?>.min.css">
<?php } ?>
<link rel="stylesheet" href="<?php echo $base_url ?>/css/full-doc.css">
<!-- hightlight.js -->
<script src="<?php echo $base_url ?>/js/highlight.min.js"></script>
<script>hljs.initHighlightingOnLoad();</script>
<!-- Navigation -->
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
<script>
if (typeof jQuery == 'undefined') {
document.write(unescape("%3Cscript src='<?php echo $base_url ?>/js/jquery-1.11.0.min.js' type='text/javascript'%3E%3C/script%3E"));
}
</script>
<script src="<?php echo $base_url ?>/js/bootstrap.min.js"></script>
<script src="<?php echo $base_url ?>/js/custom.js"></script>
<!--[if lt IE 9]>
<script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->
</head>
<body>

View File

@ -1,5 +0,0 @@
<div class="page-header">
<h1><?php echo (isset($page['title']))?$page['title']:$options['title'];?></h1>
</div>
<?php echo $page['html'];?>