From b464ec4c8d90b0bfc950512dfdb458017f87f20d Mon Sep 17 00:00:00 2001 From: Phyks Date: Fri, 20 Sep 2013 17:16:14 +0200 Subject: [PATCH 01/15] Replaced isset($var) by $var !== null on line 481 This allows to iterate through function results (function which returns an array for example). See issue https://github.com/rainphp/raintpl/issues/35#issuecomment-24786805 --- inc/rain.tpl.class.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/inc/rain.tpl.class.php b/inc/rain.tpl.class.php index fbdce66..61ff665 100755 --- a/inc/rain.tpl.class.php +++ b/inc/rain.tpl.class.php @@ -478,7 +478,7 @@ protected function compileCode( $parsed_code ){ $value = "\$value$loop_level"; // value //loop code - $compiled_code .= " $value ){ $counter++; ?>"; + $compiled_code .= " $value ){ $counter++; ?>"; } @@ -1068,4 +1068,4 @@ public function setTag($tag) } } -// -- end \ No newline at end of file +// -- end From 27e4251e2bdc5d520c7e5b1709eab82a1956859e Mon Sep 17 00:00:00 2001 From: Ben Date: Tue, 29 Jul 2014 13:33:50 +0100 Subject: [PATCH 02/15] loop break; functionality --- inc/rain.tpl.class.php | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/inc/rain.tpl.class.php b/inc/rain.tpl.class.php index 1c34665..786e29d 100755 --- a/inc/rain.tpl.class.php +++ b/inc/rain.tpl.class.php @@ -342,6 +342,7 @@ protected function compileTemplate( $template_code, $tpl_basedir ){ //tag list $tag_regexp = array( 'loop' => '(\{loop(?: name){0,1}="\${0,1}[^"]*"\})', + 'break' => '(\{break\})', 'loop_close' => '(\{\/loop\})', 'if' => '(\{if(?: condition){0,1}="[^"]*"\})', 'elseif' => '(\{elseif(?: condition){0,1}="[^"]*"\})', @@ -481,6 +482,14 @@ protected function compileCode( $parsed_code ){ $compiled_code .= " $value ){ $counter++; ?>"; } + + // loop break + elseif( strpos( $html, '{break}' ) !== FALSE ) { + + //else code + $compiled_code .= ''; + + } //close loop tag elseif( strpos( $html, '{/loop}' ) !== FALSE ) { From 59a4035be056ce85b3d9476aa819c8dea0a3f1a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89lie=20Michel?= Date: Sat, 9 Aug 2014 13:42:59 +0200 Subject: [PATCH 03/15] Refactor path_replace Separate function to handle proper URL rewriting. More easy-to-maintain since there is less code duplication. More easy to customize (just add a rewriting rule at *one* place, saying in `rewrite_url`). Cleanup regexps: * (?:") = " (not sure) * "([^"]+?)" = "([^"]+)" = "(.+?)" (and anyway, why a '+' and not a '*' ?) * Isolate protocol to make it easy to add some of them Behavior changes: * `href=@foo@` is not a way to bypass rewriting anymore. You can still use `href = "foo"` (with spaces) * Leading `#` in full URLs (those beginning with http or so) are trimed. This can be easily fixed. * New protocols where added: ftp, file, apt, magnet. It is trivial to change it. (see line 658) * Paths starting with a `/` are prefixed with base_url only, not base_url/template_dir. This is a wanted improvement. --- inc/rain.tpl.class.php | 99 +++++++++++++++++++++++++++--------------- 1 file changed, 65 insertions(+), 34 deletions(-) diff --git a/inc/rain.tpl.class.php b/inc/rain.tpl.class.php index 786e29d..3313783 100755 --- a/inc/rain.tpl.class.php +++ b/inc/rain.tpl.class.php @@ -636,10 +636,53 @@ protected function reduce_path( $path ){ /** - * replace the path of image src, link href and a href. - * url => template_dir/url - * url# => url + * Replace URL according to the following rules: * http://url => http://url + * url# => url + * /url => base_dir/url + * url => path/url (where path generally is base_url/template_dir) + * (The last one is => base_dir/url for href) + * + * @param string $url Url to rewrite. + * @param string $tag Tag in which the url has been found. + * @param string $path Path to prepend to relative URLs. + * @return string rewritten url + */ + protected function rewrite_url($url, $tag, $path) { + // If we don't have to rewrite for this tag, do nothing. + if(!in_array($tag, self::$path_replace_list)) { + return $url; + } + + // Make protocol list. It is a little bit different for . + $protocol = 'http|https|ftp|file|apt|magnet'; + if ($tag == 'a') { + $protocol .= '|mailto|javascript'; + } + + // Regex for URLs that should not change (except the leading #) + $no_change = "/(^($protocol)\:)|(#$)/i"; + if (preg_match($no_change, $url)) { + return rtrim($url, '#'); + } + + // Regex for URLs that need only base url (and not template dir) + $base_only = '/^\//'; + if ($tag == 'a' or $tag == 'form') { + $base_only = '//'; + } + if (preg_match($base_only, $url)) { + return rtrim(self::$base_url, '/') . '/' . ltrim($url, '/'); + } + + // Other URLs + return $path . $url; + } + + + /** + * replace the path of image src, link href and a href. + * @see rewrite_url for more information about how paths are replaced. * * @param string $html * @return string html sostituito @@ -649,38 +692,28 @@ protected function path_replace( $html, $tpl_basedir ){ if( self::$path_replace ){ $tpl_dir = self::$base_url . self::$tpl_dir . $tpl_basedir; - + // reduce the path $path = $this->reduce_path($tpl_dir); - $exp = $sub = array(); - - if( in_array( "img", self::$path_replace_list ) ){ - $exp = array( '/ Date: Sat, 9 Aug 2014 17:06:48 +0200 Subject: [PATCH 04/15] Fix some little errors --- inc/rain.tpl.class.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/inc/rain.tpl.class.php b/inc/rain.tpl.class.php index 3313783..03e990b 100755 --- a/inc/rain.tpl.class.php +++ b/inc/rain.tpl.class.php @@ -704,11 +704,12 @@ protected function path_replace( $html, $tpl_basedir ){ return preg_replace_callback( $exp, function ($matches) { + global $path; $tag = $matches[1]; $_ = $matches[2]; $attr = $matches[3]; $url = $matches[4]; - $new_url = rewrite_url($url, $tag, $path); + $new_url = $this->rewrite_url($url, $tag, $path); return "<$tag$_$attr=\"$new_url\""; }, From e84dba6543fbc9a37890a05eff054d89b478ca38 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89lie=20Michel?= Date: Sat, 9 Aug 2014 17:25:56 +0200 Subject: [PATCH 05/15] Fix nested functions variable access --- inc/rain.tpl.class.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/inc/rain.tpl.class.php b/inc/rain.tpl.class.php index 03e990b..35b4083 100755 --- a/inc/rain.tpl.class.php +++ b/inc/rain.tpl.class.php @@ -703,8 +703,7 @@ protected function path_replace( $html, $tpl_basedir ){ return preg_replace_callback( $exp, - function ($matches) { - global $path; + function ($matches) use ($path) { $tag = $matches[1]; $_ = $matches[2]; $attr = $matches[3]; From 2b7e9960a1efd8ed8f7a2d6a75da928d793b75bb Mon Sep 17 00:00:00 2001 From: Elie Michel Date: Tue, 26 Aug 2014 00:11:33 +0200 Subject: [PATCH 06/15] Restore compatibility with PHP 5.3 --- inc/rain.tpl.class.php | 62 ++++++++++++++++++++++++------------------ 1 file changed, 36 insertions(+), 26 deletions(-) diff --git a/inc/rain.tpl.class.php b/inc/rain.tpl.class.php index 35b4083..87e2183 100755 --- a/inc/rain.tpl.class.php +++ b/inc/rain.tpl.class.php @@ -614,8 +614,9 @@ protected function compileCode( $parsed_code ){ } return $compiled_code; } - - + + + /** * Reduce a path, eg. www/library/../filepath//file => www/filepath/file * @param type $path @@ -648,31 +649,31 @@ protected function reduce_path( $path ){ * @param string $path Path to prepend to relative URLs. * @return string rewritten url */ - protected function rewrite_url($url, $tag, $path) { + protected function rewrite_url( $url, $tag, $path ) { // If we don't have to rewrite for this tag, do nothing. - if(!in_array($tag, self::$path_replace_list)) { + if( !in_array( $tag, self::$path_replace_list ) ) { return $url; } // Make protocol list. It is a little bit different for . $protocol = 'http|https|ftp|file|apt|magnet'; - if ($tag == 'a') { + if ( $tag == 'a' ) { $protocol .= '|mailto|javascript'; } // Regex for URLs that should not change (except the leading #) $no_change = "/(^($protocol)\:)|(#$)/i"; - if (preg_match($no_change, $url)) { - return rtrim($url, '#'); + if ( preg_match( $no_change, $url ) ) { + return rtrim( $url, '#' ); } // Regex for URLs that need only base url (and not template dir) $base_only = '/^\//'; - if ($tag == 'a' or $tag == 'form') { + if ( $tag == 'a' or $tag == 'form' ) { $base_only = '//'; } - if (preg_match($base_only, $url)) { - return rtrim(self::$base_url, '/') . '/' . ltrim($url, '/'); + if ( preg_match( $base_only, $url ) ) { + return rtrim( self::$base_url, '/' ) . '/' . ltrim( $url, '/' ); } // Other URLs @@ -680,6 +681,27 @@ protected function rewrite_url($url, $tag, $path) { } + + /** + * replace one single path corresponding to a given match in the `path_replace` regex. + * This function has no reason to be used anywhere but in `path_replace`. + * @see path_replace + * + * @param array $matches + * @return replacement string + */ + protected function single_path_replace ( $matches ){ + $tag = $matches[1]; + $_ = $matches[2]; + $attr = $matches[3]; + $url = $matches[4]; + $new_url = $this->rewrite_url( $url, $tag, $this->path ); + + return "<$tag$_$attr=\"$new_url\""; + } + + + /** * replace the path of image src, link href and a href. * @see rewrite_url for more information about how paths are replaced. @@ -693,27 +715,15 @@ protected function path_replace( $html, $tpl_basedir ){ $tpl_dir = self::$base_url . self::$tpl_dir . $tpl_basedir; - // reduce the path - $path = $this->reduce_path($tpl_dir); + // Prepare reduced path not to compute it for each link + $this->path = $this->reduce_path( $tpl_dir ); $exp = array(); $exp[] = '/<(link|a)(.*?)(href)="(.*?)"/i'; $exp[] = '/<(img|script|input)(.*?)(src)="(.*?)"/i'; $exp[] = '/<(form)(.*?)(action)="(.*?)"/i'; - return preg_replace_callback( - $exp, - function ($matches) use ($path) { - $tag = $matches[1]; - $_ = $matches[2]; - $attr = $matches[3]; - $url = $matches[4]; - $new_url = $this->rewrite_url($url, $tag, $path); - - return "<$tag$_$attr=\"$new_url\""; - }, - $html - ); + return preg_replace_callback( $exp, 'self::single_path_replace', $html ); } else @@ -751,7 +761,7 @@ function func_replace( $html, $tag_left_delimiter, $tag_right_delimiter, $php_le $this->function_check( $tag ); $extra_var = $this->var_replace( $extra_var, null, null, null, null, $loop_level ); - + // check if there's an operator = in the variable tags, if there's this is an initialization so it will not output any value $is_init_variable = preg_match( "/^(\s*?)\=[^=](.*?)$/", $extra_var ); From d4a540e604f3554beb0ba01900231ddf7a20ad46 Mon Sep 17 00:00:00 2001 From: Elie Michel Date: Tue, 26 Aug 2014 00:23:46 +0200 Subject: [PATCH 07/15] Restore use of $path_replace_list --- inc/rain.tpl.class.php | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/inc/rain.tpl.class.php b/inc/rain.tpl.class.php index 87e2183..3a5f3a0 100755 --- a/inc/rain.tpl.class.php +++ b/inc/rain.tpl.class.php @@ -719,9 +719,15 @@ protected function path_replace( $html, $tpl_basedir ){ $this->path = $this->reduce_path( $tpl_dir ); $exp = array(); - $exp[] = '/<(link|a)(.*?)(href)="(.*?)"/i'; - $exp[] = '/<(img|script|input)(.*?)(src)="(.*?)"/i'; - $exp[] = '/<(form)(.*?)(action)="(.*?)"/i'; + + $tags = array_intersect( array( "link", "a" ), self::$path_replace_list ); + $exp[] = '/<(' . join( '|', $tags ) . ')(.*?)(href)="(.*?)"/i'; + + $tags = array_intersect( array( "img", "script", "input" ), self::$path_replace_list ); + $exp[] = '/<(' . join( '|', $tags ) . ')(.*?)(src)="(.*?)"/i'; + + $tags = array_intersect( array( "form" ), self::$path_replace_list ); + $exp[] = '/<(' . join( '|', $tags ) . ')(.*?)(action)="(.*?)"/i'; return preg_replace_callback( $exp, 'self::single_path_replace', $html ); From 201d0f1f6944034833302941db87569ecd2e31bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89lie=20Michel?= Date: Mon, 1 Sep 2014 11:48:39 +0200 Subject: [PATCH 08/15] Allow RainTPL tags inside urls * Swap path replacing and tag splitting in `compileTemplate`. * Allow double colons inside urls when it is between curly brackets. * Fix #46 --- inc/rain.tpl.class.php | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/inc/rain.tpl.class.php b/inc/rain.tpl.class.php index 3a5f3a0..ddbc9e8 100755 --- a/inc/rain.tpl.class.php +++ b/inc/rain.tpl.class.php @@ -360,12 +360,12 @@ protected function compileTemplate( $template_code, $tpl_basedir ){ $tag_regexp = "/" . join( "|", $tag_regexp ) . "/"; - //split the code with the tags regexp - $template_code = preg_split ( $tag_regexp, $template_code, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY ); - //path replace (src of img, background and href of link) $template_code = $this->path_replace( $template_code, $tpl_basedir ); + //split the code with the tags regexp + $template_code = preg_split ( $tag_regexp, $template_code, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY ); + //compile the code $compiled_code = $this->compileCode( $template_code ); @@ -718,16 +718,18 @@ protected function path_replace( $html, $tpl_basedir ){ // Prepare reduced path not to compute it for each link $this->path = $this->reduce_path( $tpl_dir ); + $url = '(?:(?:\\{.*?\\})?[^{}]*?)*?'; // allow " inside {} for cases in which url contains {function="foo()"} + $exp = array(); $tags = array_intersect( array( "link", "a" ), self::$path_replace_list ); - $exp[] = '/<(' . join( '|', $tags ) . ')(.*?)(href)="(.*?)"/i'; + $exp[] = '/<(' . join( '|', $tags ) . ')(.*?)(href)="(' . $url . ')"/i'; $tags = array_intersect( array( "img", "script", "input" ), self::$path_replace_list ); - $exp[] = '/<(' . join( '|', $tags ) . ')(.*?)(src)="(.*?)"/i'; + $exp[] = '/<(' . join( '|', $tags ) . ')(.*?)(src)="(' . $url . ')"/i'; $tags = array_intersect( array( "form" ), self::$path_replace_list ); - $exp[] = '/<(' . join( '|', $tags ) . ')(.*?)(action)="(.*?)"/i'; + $exp[] = '/<(' . join( '|', $tags ) . ')(.*?)(action)="(' . $url . ')"/i'; return preg_replace_callback( $exp, 'self::single_path_replace', $html ); From 4c74cbc4173e1aa1e71553f1d5a723ea46cec912 Mon Sep 17 00:00:00 2001 From: Vladimir Maksimenko Date: Sun, 29 Mar 2015 20:43:30 +0300 Subject: [PATCH 09/15] root_dir Added "root_dir" to config. It's need to get correct path to templates directory, when php script runs not from root directory. --- inc/rain.tpl.class.php | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/inc/rain.tpl.class.php b/inc/rain.tpl.class.php index ddbc9e8..78bab18 100755 --- a/inc/rain.tpl.class.php +++ b/inc/rain.tpl.class.php @@ -102,6 +102,13 @@ class RainTPL{ */ static $debug = false; + /** + * Path for the root directory + * + * @var string + */ + static $root_dir = ''; + // ------------------------- @@ -260,8 +267,8 @@ protected function check_template( $tpl_name ){ $tpl_basename = basename( $tpl_name ); // template basename $tpl_basedir = strpos($tpl_name,"/") ? dirname($tpl_name) . '/' : null; // template basedirectory $this->tpl['template_directory'] = self::$tpl_dir . $tpl_basedir; // template directory - $this->tpl['tpl_filename'] = $this->tpl['template_directory'] . $tpl_basename . '.' . self::$tpl_ext; // template filename - $temp_compiled_filename = self::$cache_dir . $tpl_basename . "." . md5( $this->tpl['template_directory'] . serialize(self::$config_name_sum)); + $this->tpl['tpl_filename'] = self::$root_dir . $this->tpl['template_directory'] . $tpl_basename . '.' . self::$tpl_ext; // template filename + $temp_compiled_filename = self::$root_dir . self::$cache_dir . $tpl_basename . "." . md5( $this->tpl['template_directory'] . serialize(self::$config_name_sum)); $this->tpl['compiled_filename'] = $temp_compiled_filename . '.rtpl.php'; // cache filename $this->tpl['cache_filename'] = $temp_compiled_filename . '.s_' . $this->cache_id . '.rtpl.php'; // static cache filename $this->tpl['checked'] = true; From 91da1cd07335ec4832c20cd9b2d766dec4e5c587 Mon Sep 17 00:00:00 2001 From: Vladimir Maksimenko Date: Mon, 30 Mar 2015 01:05:22 +0300 Subject: [PATCH 10/15] fixes --- inc/rain.tpl.class.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/inc/rain.tpl.class.php b/inc/rain.tpl.class.php index 78bab18..c3e103e 100755 --- a/inc/rain.tpl.class.php +++ b/inc/rain.tpl.class.php @@ -281,12 +281,12 @@ protected function check_template( $tpl_name ){ // We check if the template is not an external source if(preg_match('/http/', $tpl_name)){ - $this->compileFile('', '', $tpl_name, self::$cache_dir, $this->tpl['compiled_filename'] ); + $this->compileFile('', '', $tpl_name, self::$root_dir . self::$cache_dir, $this->tpl['compiled_filename'] ); return true; } // file doesn't exist, or the template was updated, Rain will compile the template elseif( !file_exists( $this->tpl['compiled_filename'] ) || ( self::$check_template_update && filemtime($this->tpl['compiled_filename']) < filemtime( $this->tpl['tpl_filename'] ) ) ){ - $this->compileFile( $tpl_basename, $tpl_basedir, $this->tpl['tpl_filename'], self::$cache_dir, $this->tpl['compiled_filename'] ); + $this->compileFile( $tpl_basename, $tpl_basedir, $this->tpl['tpl_filename'], self::$root_dir . self::$cache_dir, $this->tpl['compiled_filename'] ); return true; } From 0b0a0a26b6c3e7a106789bada1d18844578cfaf4 Mon Sep 17 00:00:00 2001 From: Vladimir Maksimenko Date: Mon, 30 Mar 2015 01:06:33 +0300 Subject: [PATCH 11/15] fix --- inc/rain.tpl.class.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/inc/rain.tpl.class.php b/inc/rain.tpl.class.php index c3e103e..00d960f 100755 --- a/inc/rain.tpl.class.php +++ b/inc/rain.tpl.class.php @@ -281,12 +281,12 @@ protected function check_template( $tpl_name ){ // We check if the template is not an external source if(preg_match('/http/', $tpl_name)){ - $this->compileFile('', '', $tpl_name, self::$root_dir . self::$cache_dir, $this->tpl['compiled_filename'] ); + $this->compileFile('', '', $tpl_name, self::$root_dir . self::$cache_dir, $this->tpl['compiled_filename'] ); return true; } // file doesn't exist, or the template was updated, Rain will compile the template elseif( !file_exists( $this->tpl['compiled_filename'] ) || ( self::$check_template_update && filemtime($this->tpl['compiled_filename']) < filemtime( $this->tpl['tpl_filename'] ) ) ){ - $this->compileFile( $tpl_basename, $tpl_basedir, $this->tpl['tpl_filename'], self::$root_dir . self::$cache_dir, $this->tpl['compiled_filename'] ); + $this->compileFile( $tpl_basename, $tpl_basedir, $this->tpl['tpl_filename'], self::$root_dir . self::$cache_dir, $this->tpl['compiled_filename'] ); return true; } From cb10d82b3984541920301b7d7c6288753ec09142 Mon Sep 17 00:00:00 2001 From: "Phyks (Lucas Verney)" Date: Wed, 30 Mar 2016 21:46:47 +0200 Subject: [PATCH 12/15] Fix PR according to discussion in https://github.com/rainphp/raintpl/pull/37#issuecomment-203603343 --- inc/rain.tpl.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inc/rain.tpl.class.php b/inc/rain.tpl.class.php index 61ff665..c8f8740 100755 --- a/inc/rain.tpl.class.php +++ b/inc/rain.tpl.class.php @@ -478,7 +478,7 @@ protected function compileCode( $parsed_code ){ $value = "\$value$loop_level"; // value //loop code - $compiled_code .= " $value ){ $counter++; ?>"; + $compiled_code .= " $value ){ $counter++; ?>"; } From bad243b1587ab081d178317025e1ff97485b7606 Mon Sep 17 00:00:00 2001 From: Federico Ulfo Date: Sun, 12 Feb 2017 10:36:03 -0500 Subject: [PATCH 13/15] Update page.html --- tpl/page.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tpl/page.html b/tpl/page.html index 0e2c5c2..baac941 100644 --- a/tpl/page.html +++ b/tpl/page.html @@ -9,7 +9,7 @@ - + @@ -166,7 +166,7 @@

Path replace on relative path of image

RainTpl is javascript friendly Absolute paths and path ending with # are not replaced

For more info read the documentation: - http://www.raintpl.com/Documentation/Documentation-for-web-designers/WYSIWYG/ + https://feulf.github.io/raintpl From f4ab114208625e3f4fee8f49d57e6f8209394b6e Mon Sep 17 00:00:00 2001 From: Federico Ulfo Date: Sun, 12 Feb 2017 10:36:43 -0500 Subject: [PATCH 14/15] Update rain.tpl.class.php --- inc/rain.tpl.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inc/rain.tpl.class.php b/inc/rain.tpl.class.php index b00d511..7219422 100755 --- a/inc/rain.tpl.class.php +++ b/inc/rain.tpl.class.php @@ -333,7 +333,7 @@ protected function compileFile( $tpl_basename, $tpl_basedir, $tpl_filename, $cac mkdir( $cache_dir, 0755, true ); if( !is_writable( $cache_dir ) ) - throw new RainTpl_Exception ('Cache directory ' . $cache_dir . 'doesn\'t have write permission. Set write permission or set RAINTPL_CHECK_TEMPLATE_UPDATE to false. More details on http://www.raintpl.com/Documentation/Documentation-for-PHP-developers/Configuration/'); + throw new RainTpl_Exception ('Cache directory ' . $cache_dir . 'doesn\'t have write permission. Set write permission or set RAINTPL_CHECK_TEMPLATE_UPDATE to false. More details on https://feulf.github.io/raintpl'); //write compiled file file_put_contents( $compiled_filename, $template_compiled ); From 9eca9d53cbe9bf0178795d22fc0caaf06c712747 Mon Sep 17 00:00:00 2001 From: Federico Ulfo Date: Sun, 12 Feb 2017 10:37:05 -0500 Subject: [PATCH 15/15] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 3f5039c..f8dd728 100644 --- a/README.md +++ b/README.md @@ -3,4 +3,4 @@ The easy and fast template engine for PHP. Rain.TPL makes application easier to create & enables designers/developers to work better together. -http://www.raintpl.com +https://feulf.github.io/raintpl