Sistema de documentación y gestión de páginas Web para un entorno o proyecto Web.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
WMarkDown/PHP/WMarkDown.Modules.php

137 lines
5.6 KiB

<?php
namespace WMarkDown;
class Modules{
private $wmarkdown;
private $modules = [];
private $excludes = [];
public $menu_level = 0;
public $html_data = [];
private $documentation_root_length = 0;
public function add($modules, $overwrite = null){
if(!$modules)
return;
if(!is_bool($overwrite))
$overwrite = $this->wmarkdown->settings(["modules_overwrite", "module_overwrite", "overwrite"]);
foreach(is_string($modules) || (is_array($modules) && !isset($modules[0])) ? [$modules] : $modules as $items){
if(!$items)
continue;
if(is_string($items)){
$json = null;
try{
$json = @json_decode($items, true);
}catch(\Exception $exception){};
if(!$json && !($json = @json_decode(file_get_contents($this->wmarkdown->get_root() . $items))))
continue;
$items = $json;
};
if(is_array($items)){
if(isset($items[0]))
$this->add($items);
else
foreach($items as $name => $module)
if(!in_array($name, $this->excludes) && class_exists($module) && ($overwrite || !$this->modules[$name]))
$this->modules[$name] = new $module($this->wmarkdown);
};
};
}
private function __construct($wmarkdown, $excludes){
$this->wmarkdown = $wmarkdown;
$this->excludes = is_array($excludes) ? $excludes : [];
foreach(["default_modules", "modules"] as $modules)
$this->add($this->wmarkdown->settings($modules), true);
}
public function create_menu_item($level, $id, $content){
return ('
<li data-level="' . $level . '" data-deployed="false" data-levels="0" data-parent-deployed="' . ($level == 1 ? "true" : "false") . '" data-id="' . $this->wmarkdown->get_hash() . '">
<span data-icon="deploy" onclick="wmarkdown.deploy(this, event);"></span>
<a href="#' . $id . '" title="' . ($content = preg_replace('/\\\\(.)/', "$1", $content)) . '" target="_self" onclick="wmarkdown.deploy(this, event, true);">' . $content . '</a>
</li>
');
}
private static function create_file_item($url, $title, $file){
return ('
<li>
<a href="' . $url . '" data-icon="link"></a>
<a href="#' . preg_replace('/[^a-z\d]+/', "-", strtolower(substr($file, 1))) . '" title="' . $title . '" target="_self">' . $title . '</a>
</li>
');
}
private function prepare($string, $master, $level){
$results = '';
$menu = '';
$files = '';
$title = $this->wmarkdown->settings("default_title");
$title_root = $this->wmarkdown->settings("title");
if($master === null)
$master = $this;
if(preg_match('/^#+ ?([^\r\n]+)/m', $string, $matches))
$title = $matches[1];
if($title_root)
$title = $title_root . " - " . $title;
while(true && $string){
$first = null;
foreach($this->modules as $name => $module)
if(($position = $module->get_position($string)) !== null && $position >= 0 && ($first === null || $first["position"] > $position))
$first = [
"position" => $position,
"module" => $name
];
if(!$first)
break;
$module = $this->modules[$first["module"]];
$module->process($string, $master, $level);
if($first["module"] == "headers")
$menu .= $this->create_menu_item($this->menu_level = $module->get_level(), $module->get_id(), $module->get_content());
elseif($first["module"] == "includes"){
$menu .= $module->get_menu();
if(!$this->documentation_root_length)
$this->documentation_root_length = strlen($this->wmarkdown->get_documentation_path());
$files .= self::create_file_item(preg_replace('/(\.w)?\.md/', ".html", substr($module->get_content(), $this->documentation_root_length)), trim(preg_replace('/^([^\-]+\-)?(.+)$/', "$2", $module->get_title())), $module->get_content());
};
$results .= substr($string, 0, $module->get_from()) . $module->get_html();
$string = substr($string, $to = $module->get_to());
foreach($this->modules as $name => $block)
if($block->has_more())
$block->set_position($to);
};
$results .= $string;
return array_merge([
"menu" => $menu,
"content" => $results,
"files" => $files,
"title" => $title
], is_array($this->html_data) ? $this->html_data : []);
}
public static function format($wmarkdown, $string, $excludes = [], $master = null, $level = 0){
return (new \WMarkDown\Modules($wmarkdown, $excludes))->prepare($string, $master, $level);
}
};