<?php
namespace eapie\source\request\administrator;
use eapie\main;
use eapie\error;
class markdown extends \eapie\source\request\administrator {
private function _path($book_name = ''){
if( $book_name == ''){
return ROOT_PATH.DIRECTORY_SEPARATOR.'eapie'.DIRECTORY_SEPARATOR.'source'.DIRECTORY_SEPARATOR.'markdown';
}else{
return ROOT_PATH.DIRECTORY_SEPARATOR.'eapie'.DIRECTORY_SEPARATOR.'source'.DIRECTORY_SEPARATOR.'markdown'.DIRECTORY_SEPARATOR.$book_name;
}
}
private function _catalog(&$bound, $book_name, $path, $blacklist = array()){
$catalog = array();
$files = cmd(array($path), 'disk file_path');
asort($files);
if( !empty($files) ){
foreach($files as $file_path => $file_name){
if( !preg_match('/(.*)\.md$/i', $file_name) ){
continue }
if( !empty($blacklist) && in_array($file_name, $blacklist) ){
continue }
$catalog_path = str_replace($this->_path($book_name), '', $file_path);
$bound[$catalog_path] = array(
'title' => $file_name,
'name' => preg_replace('/\.md$/iu', '', $file_name),
'path' => $catalog_path,
'book' => $book_name,
'id' => cmd(array(22), 'random autoincrement'),
);
$catalog[] = $bound[$catalog_path];
}
}
$dirs = cmd(array($path), 'disk dir_path');
asort($dirs);
if( !empty($dirs) ){
foreach($dirs as $dir_path => $dir_name){
if( !empty($blacklist) && in_array($dir_name, $blacklist) ){
continue }
$catalog[] = array(
'title' => $dir_name,
'book' => $book_name,
'id' => cmd(array(22), 'random autoincrement'),
'children' => $this->_catalog($bound, $book_name, $dir_path) );
}
}
return $catalog;
}
public function api_book(){
object(parent::REQUEST_ADMIN)->check(parent::AUTHORITY_MARKDOWN_READ);
$path_list = cmd(array($this->_path()), 'disk dir_path');
if( empty($path_list) ){
return null;
}
$books = array();
foreach($path_list as $book_dir => $book_name){
$books[$book_name] = array(
'title' => $book_name,
'keywords' => '',
'description' => ''
);
$book_json = $book_dir.'/book.json';
if( is_file($book_json) ){
$book_json = cmd(array(file_get_contents($book_json)), 'json decode');
if( is_array($book_json) ){
$books[$book_name] = array_merge($books[$book_name], $book_json);
}
}
$blacklist = !empty($books[$book_name]['blacklist']) && is_array($books[$book_name]['blacklist'])?
$books[$book_name]['blacklist'] : array();
$books[$book_name]['bound'] = array();
$books[$book_name]['catalog'] = $this->_catalog($books[$book_name]['bound'], $book_name, $book_dir, $blacklist);
}
return $books;
}
public function api_content($data = array()){
object(parent::REQUEST_ADMIN)->check(parent::AUTHORITY_MARKDOWN_READ);
if( empty($data['book']) || !is_string($data['book']) || empty($data['path']) || !is_string($data['path']) ){
throw new error("书籍名称或地址不合法");
}
$file_path = $this->_path($data['book']).$data['path'];
if( !is_file($file_path) ){
throw new error("该书籍页面不存在");
}
$application = object(parent::MAIN)->api_application();
$url = http(function($http) use ($application){
return $http['protocol'].'://'.$http['host'].'/index.php/temp/application/'.$application["application_id"];
});
$file_contents = file_get_contents($file_path);
$book_name = $data['book'];
$file_contents = preg_replace_callback('/\!\[([^\[\]]+)?\]\(([^\(\)]+)\)/iu', function($matches) use ($url, $book_name) {
$file_url = trim($matches[2]);
if( stripos($file_url, 'http') === 0 ){
$url = $file_url;
}else{
$title = '';
preg_match('/^([^\"]+)\"([^\"]+)?\"$|^([^\']+)\'([^\']+)?\'$/iu', $file_url, $url_matches);
if( !empty($url_matches[1]) ){
$arguments = array(
'book' => $book_name,
'path' => $url_matches[1]
);
if( isset($url_matches[2]) ){
$title = ' "'.$url_matches[2].'" ';
}
}else{
$arguments = array(
'book' => $book_name,
'path' => $file_url
);
}
$url .= '/data/ADMINISTRATORMARKDOWNIMAGE/'.cmd(array('['.cmd(array($arguments), 'json encode').']'), 'url encode').$title;
}
return '!['.$matches[1].']('.$url.')';
}, $file_contents);
return $file_contents;
}
public function api_image($data = array()){
if( empty($data['book']) || !is_string($data['book']) || empty($data['path']) || !is_string($data['path']) ){
throw new error("书籍名称或地址不合法");
}
$file_path = $this->_path($data['book']).trim(trim($data['path']),'.');
$file_path = realpath($file_path);
if( empty($file_path) ){
throw new error("该书籍的图片不存在");
}
if( !is_file($file_path) ){
throw new error("该书籍的图片不是一个文件");
}
$getimagesize = getimagesize($file_path);
if( empty($getimagesize['mime']) ){
throw new error("该书籍的图片不合法,无法获取 Content-type");
}
header( "Content-type: ".$getimagesize['mime']);
echo file_get_contents($file_path);exit;
}
}
?>