Home php教程 php手册 自己练手写的模板引擎

自己练手写的模板引擎

Jun 06, 2016 pm 07:39 PM
engine template Own

自己练手写的模板引擎 使用方法: include(SITE_PATH./b/GyT.php); $t=new GyT(); $t-setGyiCharset(utf-8); $t-setFrontSeparator({@#); $t-setBackSeparator(#@}); //设置显示的文件名 $t-setInVtrParameter(a1, guoyong我是1); $t-setInVtrParameter(a2, g

自己练手写的模板引擎
使用方法:
include(SITE_PATH."/b/GyT.php");
$t=new GyT();
$t->setGyiCharset("utf-8");
$t->setFrontSeparator("{@#");
$t->setBackSeparator("#@}");
//设置显示的文件名
$t->setInVtrParameter("a1", "guoyong我是1");
$t->setInVtrParameter("a2", "guoyong我是2");
$t->setInVtrParameter("a3", "guoyong我是3");
$t->setInVtrParameter("a4", "guoyong我是4");
$t->setInVtrParameter("a5", "guoyong我是5");

$t->setInIfParameter("guoyong", 1);
$a=array(
array("Id"=>"1","Title"=>"测试一下1"),
array("Id"=>"2","Title"=>"测试一下2"),
array("Id"=>"3","Title"=>"测试一下3"),
array("Id"=>"4","Title"=>"测试一下4"),
array("Id"=>"5","Title"=>"测试一下5")
);

$b=array(
array("Id"=>"1","Title"=>"测试一下1"),
array("Id"=>"2","Title"=>"测试一下2"),
array("Id"=>"3","Title"=>"测试一下3"),
array("Id"=>"4","Title"=>"测试一下4"),
array("Id"=>"5","Title"=>"测试一下5")
);
$t->setInForParameter("netlist", $a);
$t->setInForParameter("netlist1", $b);
$FileName=SITE_PATH."/s/t/default/index1.html";
$t->setFile($FileName);
$t->parse();
echo $t->Out();

<?php
include(SYSTEM_PATH.'/b/GyIf.php');
include(SYSTEM_PATH.'/b/GyFor.php');

class GyT {
	private $_gyFile = "";
	private $_gyFrontSeparator = "{";
	private $_gyBackSeparator = "}";
	private $_gyiCharset;
	private $_gyInVar=array();
	private $_gyInFor=array();
	private $_gyInIf=array();
	private $_gyContent = "";
	private $_gyParameterArray;
		
	private function getContent()
	{
		if(isset($this->_gyContent))
		{
			return($this->_gyContent);
		}else
		{
			return(NULL);
		}
	}
	
	private function setContent($content)
	{
		$this->_gyContent = $content;
	}
	
	private function getGyiCharset()
	{
		if(isset($this->_gyiCharset))
		{
			return($this->_gyiCharset);
		}
		else
		{
			return(NULL);
		}
	}
	public function setGyiCharset($gyiCharset)
	{
		$this->_gyiCharset = $gyiCharset;
	}
	
	public function setFrontSeparator($gytemp) {
		$this->_gyFrontSeparator = $gytemp;
	}
	
	private function getFrontSeparator() {
		return $this->_gyFrontSeparator;
	}

	public function setBackSeparator($gytemp) {
		$this->_gyBackSeparator = $gytemp;
	}
	
	private function getBackSeparator() {
		return $this->_gyBackSeparator;
	}

	public function setFile($gyfile) {
		$this->_gyFile = $gyfile;
	}

	private function getFile() {
		return $this->_gyFile;
	}
	
	public function setInVtrParameter($ParameterName, $ParameterVale) {
		//判断键是否存在
		if (array_key_exists($ParameterName,$this->_gyInVar))
		{
			//已经存在
			$this->_gyInVar[$ParameterName]=$ParameterVale;
		}
		else
		{
			//不存在
			$tempA=array($ParameterName=>$ParameterVale);
			$tempB=$this->_gyInVar;
			$this->_gyInVar=array_merge($tempA,$tempB);
		}
	}
	
	public function setInIfParameter($ParameterName, $ParameterVale) {
		//判断键是否存在
		if (array_key_exists($ParameterName,$this->_gyInIf))
		{
			//已经存在
			$this->_gyInIf[$ParameterName]=$ParameterVale;
		}
		else
		{
			//不存在
			$tempA=array($ParameterName=>$ParameterVale);
			$tempB=$this->_gyInIf;
			$this->_gyInIf=array_merge($tempA,$tempB);
		}
	}
	
	public function setInForParameter($ParameterName, $ParameterVale) {
		if (array_key_exists($ParameterName,$this->_gyInFor))
		{
			//已经存在
			$this->_gyInFor[$ParameterName]=$ParameterVale;
		}
		else
		{
			//不存在
			$tempA=array($ParameterName=>$ParameterVale);
			$tempB=$this->_gyInFor;
			$this->_gyInFor=array_merge($tempA,$tempB);
		}
	}
	
	public function GyT() {
		
	}
	
	private function GYReadFile($filename)
	{
		$content=file_get_contents($filename);
		
		if(is_null($this->getGyiCharset())==TRUE)
		{
			$content = iconv($this->getGyiCharset(),"UTF-8//IGNORE",$content); 
		}
		return $content;
	}
	
	public function parse() {
		try {
			$this->setContent($this->GYReadFile($this->_gyFile));
			//处理标签
			$GySplitA=explode($this->_gyFrontSeparator, $this->_gyContent);
			
			if(count($GySplitA)<=1)
			{
				//没有需要处理的变量
			}
			else
			{
				
				for($i=1,$temp_count=count($GySplitA); $i<$temp_count; $i++) {
					$GySplitB=explode($this->_gyBackSeparator, $GySplitA[$i]);
					$this->_gyParameterArray[($i-1)]=$GySplitB[0];
				}
				$this->RepInclude();
				
				// 处理判断
				$this->RepIf();
				
				// 处理循环
				$this->RepFor();
				
				// 处理插件
				//$this->RepPlus();
				
				// 处理替换的标签
				$this->RepString();
			}
		} catch (Exception $e) {
			print $e->getMessage();
			exit;
		}
	}
	
	private function RepInclude(){
		$tempS=$this->_gyContent;
		$tempCountA=count($this->_gyParameterArray);
		$deletekey=array();
		for($i=0;$i<=$tempCountA;$i++)
		{
			if(substr_count($this->_gyParameterArray[$i],"include:")>0)
			{
				//获取包含的文件内容
				$tempPath=str_replace("include:","",$this->_gyParameterArray[$i]);
				$tempContent=$this->GYReadFile(SYSTEM_PATH.$tempPath);
				$tempS=str_replace($this->_gyFrontSeparator.$this->_gyParameterArray[$i].$this->_gyBackSeparator,$tempContent,$tempS);
				$deletekey[]=$this->_gyParameterArray[$i];
			}
		}
		$this->setContent($tempS);
	}
	
	private function RepString() {
		$tempS=$this->_gyContent;
		$tempParameterArray=$this->_gyInVar;
		$tempCountA=count($this->_gyParameterArray);
		$deletekey=array();
		for($i=0;$i<=$tempCountA;$i++)
		{
			//对变量循环,看看有没有符合的变量,符合的进行替换
			if(substr_count($this->_gyParameterArray[$i],":")==0)
			{
				foreach ($tempParameterArray as $key => $value) {
					if($key==$this->_gyParameterArray[$i])
					{
						$tempS=str_replace($this->_gyFrontSeparator.$key.$this->_gyBackSeparator,$value,$tempS);
						$deletekey[]=$key;
						$tempParameterArray=$this->gydeletearraykey($tempParameterArray,$key);		
					}
				}
			}
			
		}
		$this->setContent($tempS);
	}
	
	private function RepIf(){
		$tempS=$this->_gyContent;
		$GySplitA=explode($this->_gyFrontSeparator."endif:", $tempS);
		if(count($GySplitA)<=1)
		{
				//没有需要处理的变量
		}
		else
		{
			for($i=1,$temp_count=count($GySplitA); $i<$temp_count; $i++) {
				$GySplitF=explode($this->_gyFrontSeparator."endif:", $tempS);
				$mainkey="";
				$GySplitB=explode($this->_gyBackSeparator, $GySplitF[1]);
				$mainkey=$GySplitB[0];
				$tempGySplit=$GySplitF[0];
				$GySplitD=explode($this->_gyFrontSeparator."if:", $GySplitF[0]);
				$GySplitE=explode($this->_gyBackSeparator,$GySplitD[(count($GySplitD)-1)]);
				$key=$GySplitE[0];
				$tempSpStart="";
				$tempSpEnd="";
				$tempSpIf="";
				$tempMain_2=explode($this->_gyFrontSeparator."endif:".$mainkey.$this->_gyBackSeparator, $tempS);
							
				for($k=1;$k<count($tempMain_2);$k++)
				{
					$tempSpEnd=$tempSpEnd.$tempMain_2[$k].$this->_gyFrontSeparator."endif:".$mainkey.$this->_gyBackSeparator;
				}
				$tempSpEnd=substr($tempSpEnd,0,strlen($tempSpEnd)-strlen($this->_gyFrontSeparator."endif:".$mainkey.$this->_gyBackSeparator));
							
				//获取第一个
				$tempMain_3=explode($this->_gyFrontSeparator."if:".$key.$this->_gyBackSeparator, $tempMain_2[0]);
				$tempSpIf=$tempMain_3[(count($tempMain_3)-1)];
				for($k=0;$k<(count($tempMain_3)-1);$k++)
				{
					$tempSpStart=$tempSpStart.$tempMain_3[$k].$this->_gyFrontSeparator."if:".$key.$this->_gyBackSeparator;
				}
				$tempSpStart=substr($tempSpStart,0,strlen($tempSpStart)-strlen($this->_gyFrontSeparator."if:".$key.$this->_gyBackSeparator));
				foreach ($this->_gyInIf as $ifkey => $ifvalue) {
					if($mainkey==$ifkey)
					{
						//调用if类进行处理
						$igyif=new GyIf();
						$igyif->setTempValue($ifvalue);
						$igyif->setgyParameter($key);
						$igyif->settempSpStart($tempSpStart);
						$igyif->settempSpEnd($tempSpEnd);
						$igyif->settempSpIf($tempSpIf);
						$igyif->setgyFrontSeparator($this->_gyFrontSeparator);
						$igyif->setgyBackSeparator($this->_gyBackSeparator);
						$igyif->Parse();
						$tempS=$igyif->getContent();
					}
				}
			}
		}

		$this->setContent($tempS);
	}

	private function RepFor(){
		
		$tempS=$this->_gyContent;
		
		$GySplitA=explode($this->_gyFrontSeparator."endfor:", $tempS);
		if(count($GySplitA)<=1)
		{
				//没有需要处理的变量
		}
		else
		{
			for($i=1,$temp_count=count($GySplitA); $i<$temp_count; $i++) {
				$GySplitF=explode($this->_gyFrontSeparator."endfor:", $tempS);
				$mainkey="";
				$GySplitB=explode($this->_gyBackSeparator, $GySplitF[1]);
				$mainkey=$GySplitB[0];
				$tempGySplit=$GySplitF[0];
				$GySplitD=explode($this->_gyFrontSeparator."for:", $GySplitF[0]);
				$GySplitE=explode($this->_gyBackSeparator,$GySplitD[(count($GySplitD)-1)]);
				$key=$GySplitE[0];
				$tempSpStart="";
				$tempSpEnd="";
				$tempSpFor="";
				
				$tempMain_2=explode($this->_gyFrontSeparator."endfor:".$mainkey.$this->_gyBackSeparator, $tempS);	
				for($k=1;$k<count($tempMain_2);$k++)
				{
					$tempSpEnd=$tempSpEnd.$tempMain_2[$k].$this->_gyFrontSeparator."endfor:".$mainkey.$this->_gyBackSeparator;
				}
				$tempSpEnd=substr($tempSpEnd,0,strlen($tempSpEnd)-strlen($this->_gyFrontSeparator."endfor:".$mainkey.$this->_gyBackSeparator));
							
				//获取第一个
				$tempMain_3=explode($this->_gyFrontSeparator."for:".$key.$this->_gyBackSeparator, $tempMain_2[0]);
				$tempSpFor=$tempMain_3[(count($tempMain_3)-1)];
				for($k=0;$k<(count($tempMain_3)-1);$k++)
				{
					$tempSpStart=$tempSpStart.$tempMain_3[$k].$this->_gyFrontSeparator."for:".$key.$this->_gyBackSeparator;
				}
				$tempSpStart=substr($tempSpStart,0,strlen($tempSpStart)-strlen($this->_gyFrontSeparator."for:".$key.$this->_gyBackSeparator));
				foreach ($this->_gyInFor as $forkey => $forvalue) {
					if($mainkey==$forkey)
					{
						$igyfor=new GyFor();
						$igyfor->setTempValue($forvalue);
						$igyfor->setgyParameter($key);
						$igyfor->settempSpStart($tempSpStart);
						$igyfor->settempSpEnd($tempSpEnd);
						$igyfor->settempSpFor($tempSpFor);
						$igyfor->setgyFrontSeparator($this->_gyFrontSeparator);
						$igyfor->setgyBackSeparator($this->_gyBackSeparator);
						$igyfor->Parse();
						$tempS=$igyfor->getContent();
					}
				}
			}
		}
		$this->setContent($tempS);
	}
	
	private function gydeletearraykey($sArray,$key){
		$tempA=$sArray;
		if (array_key_exists($key,$tempA))
		{
			unset($tempA[$key]); 
		}
		return $tempA;
	}
	
	private function gydeletearrayvalue($sArray,$value){
		$tempA=$sArray;
		unset($tempA[array_search($value,$tempA)]);
		return $tempA;
	}
	
	private function gyshuffle($sArray)
	{
		$tempA=$sArray;
		$tempB=array();
		$i=0;
		foreach ($tempA as $key => $value) 
		{
			$tempB[$i]=$value;
			$i++;
		}
		return $tempB;
	}
	
	public function Out(){
		return $this->_gyContent;
	}
}
?>
Copy after login

<?php
class GyFor
{
	private $_content="";//返回值
	private $_gyFrontSeparator = "{";
	private $_gyBackSeparator = "}";
	//private $_gyParameter=array();//主体数组结构由6个变量组成,1主内容。2维度。3start主体。4end主体。5mainkey。6key
	private $_gyParameter="";//表达式
	// 循环前的字符串
	private $_tempSpStart="";
	// 循环后的字符串
	private $_tempSpEnd="";
	// 循环的字符串
	private $_tempSpFor="";
	
	private $_tempValue="";
	
	public function GyFor()
	{
		$this->_content="";
	}
	
	public function setgyFrontSeparator($gyFrontSeparator)
	{
		$this->_gyFrontSeparator=$gyFrontSeparator;
	}
	public function setgyBackSeparator($gyBackSeparator)
	{
		$this->_gyBackSeparator=$gyBackSeparator;
	}
	public function setTempValue($tempValue)
	{
		$this->_tempValue=$tempValue;
	}
	public function setgyParameter($gyParameter)
	{
		$this->_gyParameter=$gyParameter;
	}
	public function settempSpStart($tempSpStart)
	{
		$this->_tempSpStart=$tempSpStart;
	}
	public function settempSpEnd($tempSpEnd)
	{
		$this->_tempSpEnd=$tempSpEnd;
	}
	public function settempSpFor($tempSpFor)
	{
		$this->_tempSpFor=$tempSpFor;
	}
	
	public function Parse()
	{
		if(is_array($this->_tempValue)==true)
		{
			//判断数组维数
			$weidu=$this->arrayLevel($this->_tempValue);
			
			if($weidu==1)
			{
				//如果是1维数组,则直接替换就ok
				foreach ($this->_tempValue as $forkey => $forvalue) {
					$tkey=$this->_gyFrontSeparator.$this->_gyParameter.".".$forkey.$this->_gyBackSeparator;
					$this->_tempSpFor=str_replace($tkey, $forvalue, $this->_tempSpFor);
				}
				$this->_content=$this->_tempSpStart.$this->_tempSpFor.$this->_tempSpEnd;
			}
			elseif($weidu==2)
			{
				
				$tempS="";
				$tempT="";
				//如果是2维数组,则循环替换
				for($i=0,$tc=count($this->_tempValue,0);$i<$tc;$i++)
				{
					$tempT=$this->_tempSpFor;
					foreach ($this->_tempValue[$i] as $forkey => $forvalue) {
						$tkey=$this->_gyFrontSeparator.$this->_gyParameter.".".$forkey.$this->_gyBackSeparator;
						$tempT=str_replace($tkey, $forvalue, $tempT);
					}
					$tempS=$tempS.$tempT;
				}
				$this->_content=$this->_tempSpStart.$tempS.$this->_tempSpEnd;
			}
			else
			{
				$this->_content=$this->_tempSpStart.$this->_tempSpEnd;
			}
		}
		else
		{
			$this->_content=$this->_tempSpStart.$this->_tempSpEnd;
		}
	}
	
	/**
    * 返回数组的维度
    * @param [type] $arr [description]
    * @return [type]     [description]
    */
    function arrayLevel($arr)
    {
	    $al = array(0);
	    
	    $this->aL($arr,$al);
	    return max($al);
    }
	
	function aL($arr,&$al,$level=0)
	    {
		    if(is_array($arr)){
			    $level++;
			    $al[] = $level;
			    foreach($arr as $v)
			    {
			    	$this->aL($v,$al,$level);
			    }
		    }
	    }
	
	public function getContent()
	{
		return $this->_content;
	}
	
}
Copy after login

<?php
class GyIf
{
	private $_content="";//返回值
	private $_gyParameter="";//表达式
	// 循环前的字符串
	private $_tempSpStart="";
	// 循环后的字符串
	private $_tempSpEnd="";
	// 循环的字符串
	private $_tempSpIf="";
	private $_tempValue="";
	
	private $_gyFrontSeparator = "{";
	
	private $_gyBackSeparator = "}";
	
	public function GyIf()
	{
		$this->_content="";
	}
	public function setgyFrontSeparator($gyFrontSeparator)
	{
		$this->_gyFrontSeparator=$gyFrontSeparator;
	}
	public function setgyBackSeparator($gyBackSeparator)
	{
		$this->_gyBackSeparator=$gyBackSeparator;
	}
	public function setTempValue($tempValue)
	{
		$this->_tempValue=$tempValue;
	}
	public function setgyParameter($gyParameter)
	{
		$this->_gyParameter=$gyParameter;
	}
	public function settempSpStart($tempSpStart)
	{
		$this->_tempSpStart=$tempSpStart;
	}
	public function settempSpEnd($tempSpEnd)
	{
		$this->_tempSpEnd=$tempSpEnd;
	}
	public function settempSpIf($tempSpIf)
	{
		$this->_tempSpIf=$tempSpIf;
	}
	
	public function Parse()
	{
		$c_a=$this->_tempSpStart.$this->_tempSpIf.$this->_tempSpEnd;
		$c_b=$this->_tempSpStart.$this->_tempSpEnd;
		
		//对表达式进行分析 判断是否含有空格
		if(substr_count($this->_gyParameter," ")==0)
		{
			//如果不含有表达式,判断当前值的真假
			if(isset($this->_tempValue))
			{
				if($this->_tempValue==true)
				{
					$this->_content=$c_a;
				}
				else
				{
					$this->_content=$c_b;
				}
			}
			else
			{
				$this->_content=$c_b;
			}
		}
		else
		{
			$mainkey=explode(" ", $this->_gyParameter);
	
			if(count($mainkey)==2)
			{
				if($this->_tempValue==$mainkey[1])
				{
					$this->_content=$c_a;
				}
				else
				{
					$this->_content=$c_b;
				}
			}
			else
			{
				$key1=$this->_tempValue;
				$key2=$mainkey[1];//表达式
				$key3=$mainkey[2];
				//echo "<br>------------------<br>";
				//print_r($key2);
				//echo "<br>------------------<br>";
				switch ($key2) 
				{
					case "eq":
						if($key1==$key3)
						{
							$this->_content=$c_a;
						}
						else
						{
							$this->_content=$c_b;
						}
						break;
					case "=":
						if($key1==$key3)
						{
							//echo "<br>--------true----------<br>";
							$this->_content=$c_a;
						}
						else
						{
							//echo "<br>--------false----------<br>";
							$this->_content=$c_b;
						}
						break;
					case ">":
						if($key1 > $key3)
						{
							$this->_content=$c_a;
						}
						else
						{
							$this->_content=$c_b;
						}
						break;
					case ">=":
						if($key1 >= $key3)
						{
							$this->_content=$c_a;
						}
						else
						{
							$this->_content=$c_b;
						}
						break;
					case "<":
						if($key1 < $key3)
						{
							$this->_content=$c_a;
						}
						else
						{
							$this->_content=$c_b;
						}
						break;
					case "<=":
						if($key1 <= $key3)
						{
							$this->_content=$c_a;
						}
						else
						{
							$this->_content=$c_b;
						}
						break;
					default:
						
				}
			}
		}
	}
	
	public function getContent()
	{
		return $this->_content;
	}
}
Copy after login

<!DOCTYPE html>
<html>

	<head>
		<meta charset="utf-8" />
		<title>{@#a5#@}</title>
	</head>

	<body>
		{@#include:/s/t/default/head.html#@}
		<br /> 测试变量1 {@#a1#@}
		<br /> {@#include:/s/t/default/head.html#@}
		<br /> {@#a2#@}
		<br /> {@#a3#@}
		<br /> {@#a4#@}
		<br />
		<br /> {@#if:guoyong > 1#@}
		<br />1: {@#a4#@} {@#if:guoyong = 1#@}
		<br />1: {@#a4#@}
		<br /> {@#endif:guoyong#@}
		<br /> {@#endif:guoyong#@}
		<br /> {@#a4#@}
		<br /> {@#if:guoyong 1#@}
		<br />2: {@#a4#@}
		<br /> {@#endif:guoyong#@}
		<br />
		<br /> {@#if:guoyong 1#@}
		<br />3: {@#a4#@}
		<br /> {@#endif:guoyong#@}
		<br /> {@#include:/s/t/default/foot.html#@} {@#for:netlist#@} =====================
		<br>
		<a href="/article.jsp?articleid={@#netlist.Id#@}" title="{@#netlist.Title#@}">{@#netlist.Title#@}</a>
		<br> =============================
		<br> {@#for:netlist1#@}
		<br>
		<a href="/article.jsp?articleid={@#netlist1.Id#@}" title="{@#netlist1.Title#@}">{@#netlist1.Title#@}</a>
		<br> {@#endfor:netlist1#@} {@#endfor:netlist#@}

		<br /> **************************

		<br />
		<br />
		<br />
		<br /> {@#plus:test=fdsafdsafsdafsadfdsfdsafdas#@}
		<br />
		<br />
		<br />
		<br />
		<br />
	</body>

</html>
Copy after login

Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

AI Hentai Generator

AI Hentai Generator

Generate AI Hentai for free.

Hot Article

R.E.P.O. Energy Crystals Explained and What They Do (Yellow Crystal)
3 weeks ago By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Best Graphic Settings
3 weeks ago By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. How to Fix Audio if You Can't Hear Anyone
3 weeks ago By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: How To Unlock Everything In MyRise
3 weeks ago By 尊渡假赌尊渡假赌尊渡假赌

Hot Tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

PHP email templates: customize and personalize your email content. PHP email templates: customize and personalize your email content. Sep 19, 2023 pm 01:21 PM

PHP email templates: Customize and personalize your email content With the popularity and widespread use of email, traditional email templates can no longer meet people's needs for personalized and customized email content. Now we can create customized and personalized email templates by using PHP programming language. This article will show you how to use PHP to achieve this goal, and provide some specific code examples. 1. Create an email template First, we need to create a basic email template. This template can be an HTM

How to add PPT mask How to add PPT mask Mar 20, 2024 pm 12:28 PM

Regarding PPT masking, many people must be unfamiliar with it. Most people do not understand it thoroughly when making PPT, but just make it up to make what they like. Therefore, many people do not know what PPT masking means, nor do they understand it. I know what this mask does, and I don’t even know that it can make the picture less monotonous. Friends who want to learn, come and learn, and add some PPT masks to your PPT pictures. Make it less monotonous. So, how to add a PPT mask? Please read below. 1. First we open PPT, select a blank picture, then right-click [Set Background Format] and select a solid color. 2. Click [Insert], word art, enter the word 3. Click [Insert], click [Shape]

Effects of C++ template specialization on function overloading and overriding Effects of C++ template specialization on function overloading and overriding Apr 20, 2024 am 09:09 AM

C++ template specializations affect function overloading and rewriting: Function overloading: Specialized versions can provide different implementations of a specific type, thus affecting the functions the compiler chooses to call. Function overriding: The specialized version in the derived class will override the template function in the base class, affecting the behavior of the derived class object when calling the function.

Engine landscape changes: Three-cylinder engines challenge the dominance of six-cylinders and eight-cylinders Engine landscape changes: Three-cylinder engines challenge the dominance of six-cylinders and eight-cylinders Oct 08, 2023 pm 10:57 PM

According to news on October 8, the U.S. auto market is undergoing a change under the hood. The previously beloved six-cylinder and eight-cylinder power engines are gradually losing their dominance, while three-cylinder engines are emerging. News on October 8 showed that the U.S. auto market is undergoing a change under the hood. The beloved six-cylinder and eight-cylinder power engines in the past are gradually losing their dominance, and the three-cylinder engine is beginning to emerge. In most people's minds, Americans love large-displacement models, and the "American big V8" has always been the Synonymous with American cars. However, according to data recently released by foreign media, the landscape of the U.S. auto market is undergoing tremendous changes, and the battle under the hood is intensifying. It is understood that before 2019, the United States

Template Metaprogramming in C++ FAQ Interview Questions Template Metaprogramming in C++ FAQ Interview Questions Aug 22, 2023 pm 03:33 PM

C++ is a programming language widely used in various fields. Its template metaprogramming is an advanced programming technique that allows programmers to transform types and values ​​at compile time. Template metaprogramming is a widely discussed topic in C++, so questions related to it are quite common in interviews. Here are some common template metaprogramming interview questions in C++ that you may be asked. What is template metaprogramming? Template metaprogramming is a technique for manipulating types and values ​​at compile time. It uses templates and metafunctions to generate based on types and values

How to implement image template and mask processing in Vue? How to implement image template and mask processing in Vue? Aug 17, 2023 am 08:49 AM

How to implement image template and mask processing in Vue? In Vue, we often need to perform some special processing on images, such as adding template effects or masks. This article will introduce how to use Vue to achieve these two image processing effects. 1. Image template processing When using Vue to process images, we can use the filter attribute of CSS to achieve template effects. The filter attribute adds graphic effects to the element, and the brightness filter can change the brightness of the picture. we can change

Actual test of NVIDIA AI game engine: real-time chat with NPC, Chinese is fluent Actual test of NVIDIA AI game engine: real-time chat with NPC, Chinese is fluent Mar 04, 2024 am 09:40 AM

The intelligent NPC created by Academician Huang in "Cyberpunk 2077" can already speak Chinese? Qubit's first-hand experience, witnessing NPCs conversing fluently in both Chinese and English, with natural expressions and movements, and matching mouth shapes... If there wasn't a screen in front of me, it would really feel like being there. . At this year's CES exhibition, Nvidia used its intelligent engine Avatar Cloud Engine (ACE) to make game NPCs "alive", which caused quite a shock. △The intelligent NPC displayed at CES uses ACE. The characters in the game can have realistic voice conversations with players, while showing vivid expressions and body movements without having to prepare a script in advance. At the time of its debut, there were Ubisoft, Tencent, NetEase, MiHoYo and other countries.

Flask-Bootstrap: Add templates to Flask applications Flask-Bootstrap: Add templates to Flask applications Jun 17, 2023 pm 01:38 PM

Flask-Bootstrap: Adding templates to Flask applications Flask is a lightweight Python web framework that provides a simple and flexible way to build web applications. It is a very popular framework, but its default templates have limited functionality. To create attractive user interfaces, use additional frameworks or libraries. This is where Flask-Bootstrap comes in. Flask-Bootstrap is a Twitter-based

See all articles