我爱编程

个人博客:PHP+JS(无数据库)

2018-04-09  本文已影响69人  小气的王二狗

之前接触到jekyll静态博客,它用的是ruby编译,可我ruby一点基础也没有,我也不太清楚,他是怎么实现的。请假在家的几天在想,本质上不就是读取md格式的文章,然后 mark.js 转换格式,代码框用 highlight.js 实现高亮 不就好了?

首先花了大概百分之90的时间写了前端页面,并且实现了响应式

页面展示:大家可以直接访问我的博客 Home

下面开始说md转网页的过程:

我这里用的是tp3.2,先来读取md文件获取文章的标题、简介、创建时间:

class IndexController extends Controller {
    private $dir = '_Post/';//文章目录名
    private $title=array();//文章标题
    private $info=array();//文章简介
    //文件创建时间
   //文件最后一次修改时间

    public  function _initialize(){
        header("content-type:text/html;charset=utf-8");
//        获取文件夹中的所有文件名,遍历存入数组
        //打开目录
        $this->dir=iconv("gb2312","utf-8",$this->dir);
        //因为windows默认是gb2312编码,这里改成utf,不改的话读出的文件名就都会变成乱码
        $handler = opendir($this->dir);
        /*其中$filename = readdir($handler)
        每次循环时将读取的文件名赋值给$filename,$filename !== false。
        一定要用!==,因为如果某个文件名如果叫'0′,或某些被系统认为是代表false,用!=就会停止循环
        */
        $i=0;
        while( ($filename = readdir($handler)) !== false )
        {
            //略过linux目录的名字为'.'和‘..'的文件
            if($filename != "." && $filename != "..")
            {

                    //输出文件名
                    $this->info[$i]['title']= substr($filename,'0',strlen($filename)-3);
//                    $this->info[$i]['ctime']=date("Y-m-d H:i:s",filectime($this->dir.$filename));
                    $this->info[$i]['mtime']=date("Y-m-d H:i:s",filemtime($this->dir.$filename));
                    $this->info[$i]['cover']='Public/_Post/'.substr($filename,'0',strlen($filename)-3).'.jpg';

                    $content=file_get_contents($this->dir.$filename);
                    if(preg_match_all('/<简介>([^<]*)<\/简介>/i', $content, $matches)) {
                        $this->info[$i]['intro']=$matches[1][0];
                    }//获取文章简介

                    $i++;//数组索引

            }
        }
        closedir($handler);//关闭资源

    }
    public function index(){
        header("content-type:text/html;charset=utf-8");
//        print_r($this->info);
        $this->assign('info',$this->info);
        $this->display();
    }

}

然后是读出md文件,将格式转化为json格式,传到前台:

public function article(){

            $this->filename=S('title');
            $markdown = file_get_contents($this->dir.$this->filename.'.md');
            $markdown = json_encode($markdown,JSON_UNESCAPED_UNICODE|JSON_PRETTY_PRINT);
           //第二个参数是为了防止中文在转成json格式时变成乱码
            $this->assign("title",$this->filename);
            $this->assign("html",$markdown);
            $this->display();

    }

最后看前台编译:

<script>
    hljs.initHighlightingOnLoad();//代码高亮初始化
    $(document).ready(function(){
        $("#content").html(marked({$html}));//转成的html直接插入到div中
    })
</script>

因为mark.js的作用只不过是把md格式转换为html代码,所以一些样式可以根据自己的喜好来改:
比如md中的引用> 会被解析成 blockquote标签:我这里直接模仿了简书的样式:

 blockquote{
        padding: 20px;
        margin-bottom: 25px;
        background-color: #f7f7f7;
        border-left: 6px solid #b4b4b4;
        word-break: break-word!important;
        word-break: break-all;
        line-height: 30px;
    }
如图:

超链接一样可以自定义,比如我这里:

a{
 text-decoration: none;
 color: #5bc0de;
 }

清除了下划线,更改了颜色



其他的这里就不说了,按个人喜好更改。
现在做的还比较简陋,暂时发布文章只能是,写一个 标题.md 和一个 标题.jpg 文件上传。一个是文章正文,一个是文章封面。如图:



这里我的简介是怎么得到的呢?我这里投机取巧 直接用正则读文章中在<简介>
</简介>标签中的文字为简介

代码:

if(preg_match_all('/<简介>([^<]*)<\/简介>/i', $content, $matches)) {
                        $this->info[$i]['intro']=$matches[1][0];
                    }//获取文章简介

这样,差不多基本的功能都实现了。md排版美滋滋

上一篇下一篇

猜你喜欢

热点阅读