Merge pull request #129 from Gautham/Dev

Refactor Code.
This commit is contained in:
Denis Kisselev 2014-03-01 21:32:42 -08:00
commit 78638f34d1
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
function get_options() {
// Check for homepage global $base;
$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() {
$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) {
// 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') { // Build Directory Tree
return $branch['url']; function build_tree() {
} else if (!empty($branch['tree'])) { global $tree, $options, $docs_path , $multilanguage, $output_language;
return docs_url($branch['tree']); if (!$multilanguage) $tree = directory_tree($docs_path, $options['ignore']);
} else { else
// Try next folder... foreach ($options['languages'] as $languageKey => $language) {
$branch = next($tree); $output_language = $languageKey;
if ($branch) { $tree[$languageKey] = directory_tree($docs_path . '/' . $languageKey, $options['ignore']);
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; // Recursively add files & directories to Tree
} function directory_tree($dir, $ignore) {
global $base_doc, $multilanguage, $output_language;
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;
}
/**
* 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 <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 // Build Navigation
// URI is found, and also fixes the QUERY_STRING server var and $_GET array. function get_navigation($url) {
if (strncmp($uri, '?/', 2) === 0) global $tree, $multilanguage, $output_language, $output_path;
{ $dir = isset($output_path) ? $output_path : '';
$uri = substr($uri, 2); $return = "<ul class=\"nav nav-list\">";
} $return .= $multilanguage ? build_navigation($tree[$output_language], (($dir !== '') ? $dir . '/' : '') . $output_language, $url) : build_navigation($tree, $dir, $url);
$parts = preg_split('#\?#i', $uri, 2); $return .= "</ul>";
$uri = $parts[0]; return $return;
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 function build_navigation($tree, $current_dir, $url) {
return ($prefix_slash ? '/' : '').str_replace(array('//', '../'), '/', trim($uri, '/')); 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 .= "<li";
if (!(strpos($url, $key) === FALSE)) $return .= " class=\"open\"";
$return .= ">";
$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 {
$return .= "<li";
if ($url === $current_dir . '/' . $node) $return .= " class=\"active\"";
$return .= ">";
$link = $t . clean_url($node, $mode);
$return .= "<a href=\"" . $link . "\">" . clean_url($node, "Title");
$return .= "</a></li>";
}
return $return;
}
function handle_editor_post($post, $page) { // Generate Documentation from Markdown file
if(file_exists($page["path"])) { function generate_page($file) {
file_put_contents($page["path"], $post["markdown"]); 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'] = "<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();
} }
}
function load_tpl_block($file, $options, $base_url){ // File to URL
ob_start(); 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;
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){ // Get Path based on Server. For Use in template file.
foreach ( function get_url($url) {
$iterator = new RecursiveIteratorIterator( global $mode, $options, $relative_base;
new RecursiveDirectoryIterator($directory, RecursiveDirectoryIterator::SKIP_DOTS), $t = clean_url($url, $mode);
RecursiveIteratorIterator::SELF_FIRST) as $item if ($t === 'index') {
) { if ($mode === 'Static') return $relative_base . 'index.html';
@unlink($directory.DIRECTORY_SEPARATOR.$iterator->getSubPathName()); else return $relative_base;
}
if ($mode === 'Live' && !$options['clean_urls']) $t = 'index.php?' . $t;
return $t;
} }
}
function relative_base($count){ // Relative Path From Path2 to Path1
$relative = ''; function relative_path($path1, $path2) {
for ($i=0; ($i < $count); $i++ ){ global $output_path, $docs_path, $base;
if (! ($i == 0)) $remove = array($docs_path . '/');
$relative .= '/'; if (isset($output_path)) $remove[] = $output_path . '/';
$relative .= '..'; $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;
} }
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'];?>