自己练手写的模板引擎
自己练手写的模板引擎 使用方法: 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; } } ?>
<?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; } }
<?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; } }
<!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>

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

AI Hentai Generator
Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen



Was die PPT-Maskierung angeht, sind viele Leute sicher nicht damit vertraut, wenn sie PPT erstellen, sondern erfinden es einfach, was ihnen gefällt. Daher wissen viele Menschen nicht, was PPT-Maskierung bedeutet Ich weiß, was diese Maske bewirkt, und ich weiß nicht einmal, dass sie das Bild weniger eintönig machen kann. Freunde, die lernen möchten, kommen und fügen Sie einige PPT-Masken zu Ihren PPT-Bildern hinzu. Wie fügt man also eine PPT-Maske hinzu? Bitte lesen Sie unten. 1. Zuerst öffnen wir PPT, wählen ein leeres Bild aus, klicken dann mit der rechten Maustaste auf [Hintergrundformat festlegen] und wählen eine Volltonfarbe aus. 2. Klicken Sie auf [Einfügen], Wortkunst, geben Sie das Wort ein 3. Klicken Sie auf [Einfügen], klicken Sie auf [Form]

PHP-E-Mail-Vorlagen: Passen Sie Ihre E-Mail-Inhalte an und personalisieren Sie sie. Angesichts der Beliebtheit und weiten Verbreitung von E-Mails können herkömmliche E-Mail-Vorlagen den Bedarf der Menschen an personalisierten und individuellen E-Mail-Inhalten nicht mehr erfüllen. Jetzt können wir mithilfe der Programmiersprache PHP benutzerdefinierte und personalisierte E-Mail-Vorlagen erstellen. Dieser Artikel zeigt Ihnen, wie Sie PHP verwenden, um dieses Ziel zu erreichen, und stellt einige spezifische Codebeispiele bereit. 1. Erstellen Sie eine E-Mail-Vorlage. Zuerst müssen wir eine grundlegende E-Mail-Vorlage erstellen. Diese Vorlage kann ein HTM sein

Spezialisierungen von C++-Vorlagen wirken sich auf das Überladen und Umschreiben von Funktionen aus: Funktionsüberladung: Spezialisierte Versionen können unterschiedliche Implementierungen eines bestimmten Typs bereitstellen und sich somit auf die Funktionen auswirken, die der Compiler aufruft. Funktionsüberschreibung: Die spezialisierte Version in der abgeleiteten Klasse überschreibt die Vorlagenfunktion in der Basisklasse und beeinflusst das Verhalten des abgeleiteten Klassenobjekts beim Aufruf der Funktion.

Laut Nachrichten vom 8. Oktober erlebt der US-Automobilmarkt einen Wandel unter der Haube. Die bisher beliebten Sechszylinder- und Achtzylindermotoren verlieren allmählich ihre Dominanz, während Dreizylindermotoren auf dem Vormarsch sind. Die Nachrichten vom 8. Oktober zeigten, dass sich der US-amerikanische Automobilmarkt unter der Haube verändert. Die in der Vergangenheit beliebten Sechszylinder- und Achtzylindermotoren verlieren allmählich ihre Dominanz und der Dreizylindermotor beginnt sich durchzusetzen. In den Köpfen der meisten Menschen lieben Amerikaner Modelle mit großem Hubraum und den „amerikanischen großen V8“. war schon immer das Synonym für amerikanische Autos. Doch laut kürzlich von ausländischen Medien veröffentlichten Daten durchläuft die Landschaft des US-amerikanischen Automobilmarkts enorme Veränderungen und der Kampf unter der Motorhaube verschärft sich. Es wird davon ausgegangen, dass die Vereinigten Staaten vor 2019

C++ ist eine in verschiedenen Bereichen weit verbreitete Programmiersprache. Die Template-Metaprogrammierung ist eine fortschrittliche Programmiertechnologie, die es Programmierern ermöglicht, Typen und Werte zur Kompilierzeit zu transformieren. Die Template-Metaprogrammierung ist ein häufig diskutiertes Thema in C++, daher werden in Interviews häufig Fragen dazu gestellt. Hier finden Sie einige häufig gestellte Fragen in Vorstellungsgesprächen zur Metaprogrammierung von Vorlagen in C++, die Ihnen möglicherweise gestellt werden. Was ist Template-Metaprogrammierung? Template-Metaprogrammierung ist eine Technik zum Bearbeiten von Typen und Werten zur Kompilierungszeit. Es verwendet Vorlagen und Metafunktionen, um basierend auf Typen und Werten zu generieren

Wussten Sie, dass Sie mithilfe von Vorlagen schneller Notizen machen und wichtige Ideen effektiver erfassen können? OneNote verfügt über eine Reihe vorgefertigter Vorlagen, die Sie verwenden können. Das Beste daran ist, dass Sie die Vorlage auch nach Ihren Bedürfnissen gestalten können. Egal, ob Sie Student, Unternehmer oder Freiberufler sind, der kreativ arbeitet. Mit OneNote-Vorlagen können Sie wichtige Notizen in einer Struktur und einem Format aufzeichnen, die Ihrem Stil entsprechen. Eine Vorlage kann eine Skizze eines Notizenprozesses sein. Amateure machen sich einfach Notizen, Profis machen sich Notizen und ziehen daraus durch gut strukturierte Notizen mit Hilfe von Vorlagen Zusammenhänge. Sehen wir uns an, wie Sie Vorlagen in OneNote verwenden. Standard-OneNote-Vorlage verwenden Schritt 1: Drücken Sie Windows+R auf Ihrer Tastatur. Geben Sie Oneno ein

Flask-Bootstrap: Vorlagen zu Flask-Anwendungen hinzufügen Flask ist ein leichtes Python-Webframework, das eine einfache und flexible Möglichkeit zum Erstellen von Webanwendungen bietet. Es handelt sich um ein sehr beliebtes Framework, dessen Standardvorlagen jedoch nur über eingeschränkte Funktionalität verfügen. Um attraktive Benutzeroberflächen zu erstellen, nutzen Sie zusätzliche Frameworks oder Bibliotheken. Hier kommt Flask-Bootstrap ins Spiel. Flask-Bootstrap basiert auf Twitter

Globale Beleuchtung in Echtzeit (Echtzeit-GI) war schon immer der heilige Gral der Computergrafik. Im Laufe der Jahre hat die Industrie verschiedene Methoden zur Lösung dieses Problems vorgeschlagen. Zu den gängigen Methoden gehört die Einschränkung des Problembereichs durch die Verwendung bestimmter Annahmen, wie z. B. statische Geometrie, eine grobe Szenendarstellung oder die Verfolgung grober Sonden, und die Interpolation der Beleuchtung zwischen beiden. In der Unreal Engine wurde das globale Beleuchtungs- und Reflexionssystem Lumen Technology von Krzysztof Narkowicz und Daniel Wright mitbegründet. Das Ziel bestand darin, eine Lösung zu entwickeln, die sich von ihren Vorgängern unterschied und eine gleichmäßige Beleuchtung und eine backenähnliche Lichtqualität erreichen konnte. Kürzlich, bei SIGGRAPH 2022, Krzysztof Narko
