<?php

//加载第三方用于解析html的类
require '/lib/simple_html_dom.php';

if (!defined('BASEPATH')) exit('No direct script access allowed');

class MY_Output extends CI_Output
{
    // --------------------------------------------------------------------

    /**
     * Write a Cache File
     *
     * @access    public
     * @param    string
     * @return    void
     */
    function _write_cache($output)
    {
        $cache_path = 'd:/Dropbox/wwwcache/asiahighlights.com';
        $optimize_js_path = 'd:/Dropbox/wwwcache/asiahighlights.com/js';

        if (!is_dir($cache_path) OR !is_really_writable($cache_path)) {
            log_message('error', "Unable to write cache file: " . $cache_path);
            return;
        }

        ///////改成按照URL保存缓存
        //优先使用提交过来的static_html_url做文件名，这是主动生成静态文件用的参数
        if (empty($_GET['static_html_url'])) {
            return FALSE;
        }
        $cache_path = $cache_path . $_GET['static_html_url'];
        if (mb_substr($cache_path, -1, 1) == '/') {
            $cache_path .= 'index.htm';
        }

        $this->create_folder_by_path(dirname($cache_path));

        //如果文件存在，先判断是否为缓存文件，防止覆盖原始程序文件
        if (@file_exists($cache_path) && filesize($cache_path) > 0) {
            if (!$fp_read = @fopen($cache_path, FOPEN_READ)) {
                return FALSE;
            }

            flock($fp_read, LOCK_SH);

            $cache = fread($fp_read, filesize($cache_path));

            flock($fp_read, LOCK_UN);
            fclose($fp_read);
            if (strpos($cache, '<!-- Generated by ') === false) {
                log_message('error', "is not cache file." . $cache_path);
                return FALSE;
            }
        }

        ///////

        if (!$fp = @fopen($cache_path, FOPEN_WRITE_CREATE_DESTRUCTIVE)) {
            log_message('error', "Unable to write cache file: " . $cache_path);
            return;
        }

        //精简html和css代码
        if (!empty($_GET['static_html_optimize'])) {//设置优化开关，暂时手动优化
            $optimize_html = $_GET['static_html_optimize'];
            if ($optimize_html === 'comeon') {
                $clean_html = GET_HTTP('https://cht.mycht.cn/info.php/apps/htmlcompressor/index/optimize', 'websitehost=' . urlencode('https://data.asiahighlights.com') . '&htmlsource=' . urlencode($output), 'POST');
                //$clean_html = GET_HTTP('http://202.103.68.110:8001/info.php/apps/htmlcompressor/index/optimize', 'websitehost=' . urlencode('https://data.asiahighlights.com') . '&htmlsource=' . urlencode($output), 'POST');
                if (!empty($clean_html)) {
                    $clean_html_object = json_decode($clean_html);
                    if (!empty($clean_html_object) && $clean_html_object->result == 'ok') {
                        $output = $clean_html_object->data->html_object;
                        $output_js = $clean_html_object->data->js_content;
                        $output_js_name = '/' . md5($cache_path) . '.js';
                        file_put_contents($optimize_js_path . $output_js_name, $output_js);
                        $time_mark = time();//添加时间戳，用来更新CDN
                        $output = str_replace('##DEFERSCRIPTDEFER##', 'https://data.asiahighlights.com/optimizejs' . $output_js_name . '?' . $time_mark, $output);
                    }
                }
            }
        }
        //解析html，生成不同版本的静态文件

        $html_object = str_get_html($output);
        if (!empty($html_object)) {

            //替换图片地址，用CDN分发
            foreach ($html_object->find('img') as $image) {
                if (strpos($image->src, 'https://data.asiahighlights.com/') === false) {//当查找的字符串在开始位置则返回0，所以一定要写===false
                    if (strpos($image->src, '/pic/') !== false || strpos($image->src, '/image/') !== false) {
                        $image->src = 'https://data.asiahighlights.com' . $image->src;
                    }
                }
                if (empty($image->loader) || $image->loader !== "nolazy") {//如果没有禁止懒加载的标识符，则给图片添加懒加载。一般首页logo和banner图片不需要懒加载
                    $image->originalsrc = $image->src;
                    $image->loader = "lazy";
                    $image->src = "https://data.asiahighlights.com/image/grey.gif";
                }
            }
            //保存PC端代码
            $output = $html_object->save();

            //生成移动版本
            foreach ($html_object->find('.hidden-xs') as $hidden_item) {
                $hidden_item->outertext = '';
            }

            //生成移动端用小图
            foreach ($html_object->find('img') as $image) {
                if (substr($image->originalsrc, -4) == '.jpg') {//只有jpg可以处理
                    if (strpos($image->originalsrc, 'https://data.asiahighlights.com/') !== false) {//当查找的字符串在开始位置则返回0，所以一定要写===false
                        $source_image = str_replace('https://data.asiahighlights.com', '', $image->originalsrc); //原始图片URL
                        $image->originalsrc = 'https://data.asiahighlights.com/mobile' . $source_image;
                    }
                }
            }
            $html_object->save($cache_path . '.mobile.htm');
        }

        ////// 


        if (flock($fp, LOCK_EX)) {
            fwrite($fp, $output . '<!-- Generated by ' . $_SERVER['HTTP_HOST'] . ' (' . date('c') . ') -->');
            flock($fp, LOCK_UN);
        } else {
            log_message('error', "Unable to secure a file lock for file at: " . $cache_path);
            return;
        }
        fclose($fp);
        @chmod($cache_path, FILE_WRITE_MODE);

        log_message('debug', "Cache file written: " . $cache_path);
    }

    // --------------------------------------------------------------------

    /*
     * 递归创建文件夹
     */
    function create_folder_by_path($dir, $mode = 0777)
    {
        if (!is_dir($dir)) {
            return @mkdir($dir, $mode, true);
        }
        return;
    }



}
