replaceHtmlmaster
@@ -138,6 +138,23 @@ See code documentation in <code>src/commands/insertHtml.php</code>. | |||
<h3>replaceHtml</h3> | |||
See code documentation in <code>src/commands/replaceHtml.php</code>. | |||
<!-- ********************************************************************************* --> | |||
<h2>Page configuration</h2> | |||
Each html page of the site may contain its own configuration, used by some commands. | |||
<br>Page configuration is a piece of yaml included in a html comment, typically located in the <code><head></code> part of the page | |||
<br>This yaml must contain a directive <code>tigsite</code> which contains the configuration directives. | |||
<br> | |||
<br>Example : | |||
<pre> | |||
<head> | |||
<!-- | |||
tigsite: | |||
sidebar-right: genealogy/sidebar-genealogy.fr.html | |||
--> | |||
</head> | |||
</pre> | |||
</article> | |||
</body> | |||
@@ -1,8 +0,0 @@ | |||
commandClass: replaceHtml | |||
before: '<aside class="right">' | |||
after: '</aside>' | |||
replacement-file: maths/sidebar-maths.html | |||
#exclude: | |||
# - index.html |
@@ -0,0 +1,8 @@ | |||
# | |||
# Command to replace the right sidebar | |||
# Uses the page configuration 'sidebar-right' directive | |||
# | |||
commandClass: replaceHtml | |||
before: '<aside class="right">' | |||
after: '</aside>' | |||
replacement-directive: sidebar-right |
@@ -1,9 +1,10 @@ | |||
location: /home/thierry/dev/tig12/tig12.net/web | |||
exclude: | |||
- 'z.*' | |||
- '*/z.*' | |||
- .git | |||
- .gitignore | |||
- static | |||
- maths/categories/milewski | |||
- maths/grothenuls | |||
@@ -0,0 +1,46 @@ | |||
<?php | |||
/****************************************************************************** | |||
Page configuration management. | |||
Page configuration is a piece of yaml included in a html comment | |||
that must contain a 'tigsite' (self::MARKER) directive. | |||
@license GPL | |||
@history 2019-03-26 12:17:29+01:00 Thierry Graff, Creation | |||
********************************************************************************/ | |||
class PageConfig{ | |||
/** String used to identify the page configuration in a html comment **/ | |||
const MARKER = 'tigsite'; | |||
// ****************************************************** | |||
/** | |||
Computes a page configuration : extracts the yaml from the page, checks the syntax, fills default values and returns a correct config. | |||
If the page does not contain configuration, returns an empty array. | |||
@param $page Absolute path to a html file that may contain a configuration | |||
@return An array containing the configuration with default values filled | |||
@throws Exception if a required directive is missing or invalid. | |||
**/ | |||
public static function compute($page){ | |||
$content = file_get_contents($page); | |||
$p = '#<!--\s*?\n(\s*' . self::MARKER . '\:.*?)-->#sm'; | |||
preg_match($p, $content, $m); | |||
if(count($m) == 0){ | |||
return []; // no page configuration found. | |||
} | |||
// eliminate useless white spaces | |||
// that may exist if the yaml embedded in the page is tabulated | |||
$pos = strpos($m[1], self::MARKER); | |||
$lines = explode(PHP_EOL, $m[1]); | |||
$config = ''; | |||
foreach($lines as $line){ | |||
if(trim($line) == ''){ | |||
continue; | |||
} | |||
$config .= substr($line, $pos) . PHP_EOL; | |||
} | |||
$yaml = jthYAML::parse($config); | |||
return $yaml[self::MARKER]; | |||
} | |||
}// end class |
@@ -1,20 +1,21 @@ | |||
<?php | |||
/****************************************************************************** | |||
Checks the correctness of a site configuration file | |||
Site configuration management | |||
@license GPL | |||
@history 2019-02-18 12:01:41+01:00 Thierry Graff, Creation | |||
********************************************************************************/ | |||
class checkSiteConfig{ | |||
class SiteConfig{ | |||
// ****************************************************** | |||
/** | |||
Computes a site configuration : checks the syntax, fills default values and returns a correct config. | |||
@param $config Configuration contained in config.yml of a site, in an array | |||
@return An array containing the configuration with default values filled | |||
@throws Exception if a directive is missing or invalid | |||
@throws Exception if a required directive is missing or invalid. | |||
**/ | |||
public static function check($config){ | |||
public static function compute($config){ | |||
if(!isset($config['location'])){ | |||
throw new Exception("Missing \$config['site']['location']"); | |||
} |
@@ -15,7 +15,7 @@ class expandVariables{ | |||
// ****************************************************** | |||
/** | |||
@param $subject ThePiece of html that may contain strings to expanded | |||
@param $subject The piece of html that may contain strings to expanded | |||
@param $params Depend on the strings that need to be expanded | |||
See particular functions to have the list of required parameters. | |||
**/ | |||
@@ -56,7 +56,8 @@ class expandVariables{ | |||
$relative = str_replace($params['root-dir'], '', $params['current-file']); | |||
$parts = explode('/', $relative); | |||
$n = count($parts) - 2; // -2 because -1 for first / and -1 for last part of the path | |||
return str_repeat('../', $n); | |||
$tmp = str_repeat('../', $n); | |||
return substr($tmp, 0, -1); // remove last '/' | |||
} | |||
}// end class |
@@ -25,7 +25,7 @@ class insertHtml implements Command { | |||
// | |||
// check parameters | |||
// | |||
$params['site'] = checkSiteConfig::check($params['site']); | |||
$params['site'] = SiteConfig::compute($params['site']); | |||
if(!isset($params['command']['before']) && !isset($params['command']['after'])){ | |||
throw new Exception("\$params['command'] must contain either 'before' or 'after'"); | |||
@@ -14,13 +14,21 @@ class replaceHtml implements Command { | |||
must exist and be unique. | |||
@param $params Associative array that MUST contain the following keys : | |||
- 'site' (required) : associative array ; see format in docs/ | |||
- 'site' (required) : associative array corresponding to global site configuration | |||
See format in docs/ | |||
- 'command' (required) : associative aray with the following keys : | |||
- 'before' and 'after' (required) : html piece of code surrounding the html replaced by this function. | |||
- 'replacement-file' : relative path to the file containing the a file containing | |||
the new html code to insert between 'before' and 'after'. | |||
- 'replacement-string' : string containing the new html code to insert between 'before' and 'after'. | |||
NOTE : 'command' must contain 'replacement-file' or 'replacement-string' but not both. | |||
- 'before' and 'after' (required) : html pieces of code surrounding the html replaced by this function. | |||
- 'replacement-file' : relative path to the file containing | |||
the new html code to insert between 'before' and 'after'. | |||
- 'replacement-string' : string containing the new html code | |||
to insert between 'before' and 'after'. | |||
- 'replacement-directive' : string containing the directive of a page configuration. | |||
This directive indicates the path to a file containing | |||
the new html code to insert between 'before' and 'after'. | |||
NOTE : 'command' must contain one and only one of | |||
'replacement-file' or 'replacement-string' or 'replacement-directive' | |||
- 'exclude' : array of files that must not be concerned by replacement. | |||
@throws Exception in case of bad parameter | |||
@@ -32,7 +40,7 @@ class replaceHtml implements Command { | |||
// | |||
// check parameters | |||
// | |||
$params['site'] = checkSiteConfig::check($params['site']); | |||
$params['site'] = SiteConfig::compute($params['site']); | |||
if(!isset($params['command']['before'])){ | |||
throw new Exception("Missing \$params['command']['before']"); | |||
@@ -40,25 +48,36 @@ class replaceHtml implements Command { | |||
if(!isset($params['command']['after'])){ | |||
throw new Exception("Missing \$params['command']['after']"); | |||
} | |||
if(!isset($params['command']['replacement-file']) && !isset($params['command']['replacement-string'])){ | |||
throw new Exception("\$params['command'] must contain either 'replacement-file' or 'replacement-string'"); | |||
$b1 = isset($params['command']['replacement-file']); | |||
$b2 = isset($params['command']['replacement-string']); | |||
$b3 = isset($params['command']['replacement-directive']); | |||
if(!$b1 && !$b2 && !$b3){ | |||
throw new Exception("\$params['command'] must contain either 'replacement-file' or 'replacement-string' or 'replacement-directive'"); | |||
} | |||
if(isset($params['command']['replacement-file']) && isset($params['command']['replacement-string'])){ | |||
if($b1 && $b2){ | |||
throw new Exception("\$params['command'] cannot contain both 'replacement-file' and 'replacement-string'"); | |||
} | |||
if($b1 && $b3){ | |||
throw new Exception("\$params['command'] cannot contain both 'replacement-file' and 'replacement-directive'"); | |||
} | |||
if($b2 && $b3){ | |||
throw new Exception("\$params['command'] cannot contain both 'replacement-string' and 'replacement-directive'"); | |||
} | |||
if(!isset($params['command']['exclude'])){ | |||
$params['command']['exclude'] = []; | |||
} | |||
// | |||
// do the job | |||
// prepare variables | |||
// | |||
if(isset($params['command']['replacement-file'])){ | |||
if($b1){ | |||
$replace = file_get_contents($params['site']['location'] . DS . $params['command']['replacement-file']); | |||
} | |||
else{ | |||
else if($b2){ | |||
$replace = $params['command']['replacement-string']; | |||
} | |||
$replace = $params['command']['before'] . $replace . $params['command']['after']; | |||
if(!$b3){ | |||
$replace = $params['command']['before'] . $replace . $params['command']['after']; | |||
} | |||
$excludes = []; | |||
foreach($params['site']['exclude'] as $exclude){ | |||
@@ -76,17 +95,38 @@ class replaceHtml implements Command { | |||
]; | |||
$files = jth_rscandir::rscandir($params['site']['location'], $rscandirParams); | |||
// | |||
// perform replacement | |||
// | |||
$pattern = '#' . preg_quote($params['command']['before']) . '(.*?)' . preg_quote($params['command']['after']) . '#sm'; | |||
$N = count($files); | |||
for($i=0; $i < $N; $i++){ | |||
echo "processing {$files[$i]}\n"; | |||
$subject = file_get_contents($files[$i]); | |||
$replace2 = expandVariables::expand($replace, ['root-dir' => $params['site']['location'], 'current-file' => $files[$i]]); | |||
foreach($files as $file){ | |||
echo "processing $file\n"; | |||
$subject = file_get_contents($file); | |||
if($b3){ | |||
// $replace must be computed for each page | |||
$pageConfig = PageConfig::compute($file); | |||
if(!isset($pageConfig[$params['command']['replacement-directive']])){ | |||
// replacement-directive does not exist for this page, no need to replace | |||
continue; | |||
} | |||
$replacementDirective = $pageConfig[$params['command']['replacement-directive']]; | |||
$replacementFile = $params['site']['location'] . DS . $replacementDirective; | |||
if(!is_file($replacementFile)){ | |||
$msg = "Bad value for '$replacementDirective' : \"$replacementFile\"" | |||
. "\n in file $replacementFile"; | |||
throw new Exception($msg); | |||
} | |||
$replace = file_get_contents($replacementFile); | |||
$replace = $params['command']['before'] . $replace . $params['command']['after']; | |||
} | |||
$replace2 = expandVariables::expand($replace, ['root-dir' => $params['site']['location'], 'current-file' => $file]); | |||
// echo "\n"; print_r($replace2); echo "\n"; | |||
// continue; | |||
$new = preg_replace($pattern, $replace2, $subject, -1, $count); | |||
if($count == 0){ | |||
continue; | |||
} | |||
file_put_contents($files[$i], $new); | |||
file_put_contents($file, $new); | |||
} | |||
} | |||
@@ -76,7 +76,6 @@ if(!class_exists($config['command']['commandClass'])){ | |||
exit; | |||
} | |||
//echo "\n<pre>"; print_r($config); echo "</pre>\n"; exit; | |||
try{ | |||
$config['command']['commandClass']:: execute($config); | |||
} | |||