<?php

/**
 *      [Discuz!] (C)2001-2099 Comsenz Inc.
 *      This is NOT a freeware, use is subject to license terms
 *
 *      $Id: forum.php 33828 2013-08-20 02:29:32Z nemohou $
 */


define('APPTYPEID', 2);
define('CURSCRIPT', 'forum');

if (isset($_POST['message']) && $_REQUEST['mod'] == 'post' && $_REQUEST['action'] == 'newthread') {
    function htmlToBbcode($html) {
        // 预处理：确保HTML有根节点
        $html = mb_convert_encoding($html, 'HTML-ENTITIES', 'UTF-8');
        $dom = new DOMDocument();
        @$dom->loadHTML('<div>'.$html.'</div>', LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
        
        $tagMap = [
            'strong' => ['open' => '[b]', 'close' => '[/b]'],
            'b'      => ['open' => '[b]', 'close' => '[/b]'],
            'em'     => ['open' => '[i]', 'close' => '[/i]'],
            'i'      => ['open' => '[i]', 'close' => '[/i]'],
            'u'      => ['open' => '[u]', 'close' => '[/u]'],
            'a'      => ['open' => '[url=%s]', 'close' => '[/url]', 'attr' => 'href'],
            'img'    => ['open' => '[img]%s[/img]', 'content' => 'src'],
            'br'     => ['open' => "\n", 'close' => ''],
            'p'      => ['open' => '', 'close' => "\n\n"],
            'div'    => ['open' => '', 'close' => "\n"],
            'ul'     => ['open' => "[list]\n", 'close' => "[/list]\n"],
            'ol'     => ['open' => "[list=1]\n", 'close' => "[/list]\n"],
            'li'     => ['open' => "[*]", 'close' => "\n"],
            'blockquote' => ['open' => "[quote]", 'close' => "[/quote]\n"],
            'code'   => ['open' => "[code]", 'close' => "[/code]"],
        ];
        
        $convertNode = function($node) use (&$convertNode, $tagMap) {
            if (!$node->hasChildNodes()) {
                return $node->nodeValue ?? '';
            }
            
            $bbcode = '';
            foreach ($node->childNodes as $child) {
                if ($child->nodeType === XML_TEXT_NODE) {
                    $bbcode .= $child->nodeValue;
                    continue;
                }
                
                $tagName = strtolower($child->nodeName);
                if (!isset($tagMap[$tagName])) {
                    $bbcode .= $convertNode($child);
                    continue;
                }
                
                $rule = $tagMap[$tagName];
                $content = $convertNode($child);
                
                if (isset($rule['content'])) {
                    $attrValue = $child->hasAttribute($rule['content']) 
                        ? $child->getAttribute($rule['content']) 
                        : '';
                    $bbcode .= sprintf($rule['open'], $attrValue);
                } elseif (isset($rule['attr'])) {
                    $attrValue = $child->hasAttribute($rule['attr']) 
                        ? $child->getAttribute($rule['attr']) 
                        : '';
                    $bbcode .= sprintf($rule['open'], $attrValue) . $content . $rule['close'];
                } else {
                    $bbcode .= $rule['open'] . $content . $rule['close'];
                }
            }
            return $bbcode;
        };
        
        // 获取根div（修复可能不存在的节点）
        $rootDiv = $dom->getElementsByTagName('div')->item(0);
        if (!$rootDiv) {
            return '';
        }
        
        $bbcode = '';
        foreach ($rootDiv->childNodes as $node) {
            $bbcode .= $convertNode($node);
        }
        
        // 清理多余空白
        $bbcode = preg_replace("/\n{3,}/", "\n\n", $bbcode);
        return trim($bbcode);
    }

    // 转义帖子内容中的特殊字符
    $_POST['message'] = htmlToBbcode($_POST['message']);
}

spl_autoload_register(function ($class) {
    $class = str_replace('\\', '/', $class);
    $path = false;
    $path = DISCUZ_ROOT . '/source/class/' . $class . '.php';
    if ($path && file_exists($path)) {
        require_once $path;
    }
});

require './source/class/class_core.php';
require './source/class/think/config.php';


require './source/function/function_forum.php';
require 'vendor/autoload.php';

$origin = isset($_SERVER['HTTP_ORIGIN']) ? $_SERVER['HTTP_ORIGIN'] : '*';
header('Content-Type: text/html;charset=utf-8');
header('Access-Control-Allow-Origin:'.$origin);
header('Access-Control-Allow-Methods: POST, GET, OPTIONS, DELETE, HEAD, PUT');
header('Access-Control-Allow-Headers: access-control-allow-origin, authority, content-type, version-info, X-Requested-With, withCredentials, Cookies, token, http_token');
header('Access-Control-Allow-Credentials: true');

if (strtoupper($_SERVER['REQUEST_METHOD']) == 'OPTIONS') {
    exit;
}


$modarray = array('ajax','announcement','attachment',
	'group','image','index','misc','modcp','post','redirect',
	'rss','topicadmin','trade','viewthread','tag','collection','guide'
);

$modcachelist = array(
	'index'		=> array('announcements', 'onlinelist', 'forumlinks',
			'heats', 'historyposts', 'onlinerecord', 'userstats', 'diytemplatenameforum'),
	'forumdisplay'	=> array('smilies', 'announcements_forum', 'globalstick', 'forums',
			'onlinelist', 'forumstick', 'threadtable_info', 'threadtableids', 'stamps', 'diytemplatenameforum'),
	'viewthread'	=> array('smilies', 'smileytypes', 'forums', 'usergroups',
			'stamps', 'bbcodes', 'smilies',	'custominfo', 'groupicon', 'stamps',
			'threadtableids', 'threadtable_info', 'posttable_info', 'diytemplatenameforum'),
	'redirect'	=> array('threadtableids', 'threadtable_info', 'posttable_info'),
	'post'		=> array('bbcodes_display', 'bbcodes', 'smileycodes', 'smilies', 'smileytypes',
			'domainwhitelist', 'albumcategory'),
	'space'		=> array('fields_required', 'fields_optional', 'custominfo'),
	'group'		=> array('grouptype', 'diytemplatenamegroup'),
	'topicadmin'	=> array('usergroups'),
);

$mod = !in_array(C::app()->var['mod'], $modarray) ? 'index' : C::app()->var['mod'];

define('CURMODULE', $mod);
$cachelist = array();
if(isset($modcachelist[CURMODULE])) {
	$cachelist = $modcachelist[CURMODULE];

	$cachelist[] = 'plugin';
	$cachelist[] = 'pluginlanguage_system';
}
if(C::app()->var['mod'] == 'group') {
	$_G['basescript'] = 'group';
}

$_G['isInside'] = false;

C::app()->cachelist = $cachelist;
C::app()->init();

loadforum();

set_rssauth();

runhooks();

if(!$_G['setting']['forumstatus'] && !in_array($mod, array('ajax', 'misc', 'modcp'))) {
	showmessage('forum_status_off');
}

$navtitle = str_replace('{bbname}', $_G['setting']['bbname'], $_G['setting']['seotitle']['forum']);
$_G['setting']['threadhidethreshold'] = 1;
require DISCUZ_ROOT.'./source/module/forum/forum_'.$mod.'.php';


function getCover($sourceFile){
    if (strpos(strtoupper(PHP_OS), 'WIN') === 0) {
        return;
    } 
    
    $ffmpeg = FFMpeg\FFMpeg::create([
        'ffmpeg.binaries' => DISCUZ_ROOT . '/ffmpeg/ffmpeg',
        'ffprobe.binaries' => DISCUZ_ROOT . '/ffmpeg/ffprobe',
    ]);
    $video = $ffmpeg->open($sourceFile);
    
    $frameNumber = 3;  // 要提取的帧数
    $frame = $video->frame(FFMpeg\Coordinate\TimeCode::fromSeconds($frameNumber));
    $tempImagePath = tempnam(sys_get_temp_dir(), 'tempimage') . '.png'; $frame->save($tempImagePath); // 输出图片流 
    $baseurl = base64_encode(file_get_contents($tempImagePath));
    unlink($tempImagePath);
    return  $baseurl;
}
?>