Skip to content

Commit

Permalink
Stand-alone YAML parsing; fixes #3
Browse files Browse the repository at this point in the history
  • Loading branch information
sylvainhalle committed Jan 6, 2017
1 parent f0aec50 commit 5d68a2b
Show file tree
Hide file tree
Showing 6 changed files with 1,305 additions and 18 deletions.
46 changes: 33 additions & 13 deletions fw/fw.php
Original file line number Diff line number Diff line change
Expand Up @@ -22,15 +22,15 @@
**************************************************************************/

// Version string (used for version tracking)
define("VERSION_STRING", "1.0.4");
define("VERSION_STRING", "1.0.5");
$HELLO_MSG = "Fantastic Windmill v".
VERSION_STRING." - A static web site generator for PHP programmers\n".
"(C) 2013-2016 Sylvain Hallé, Université du Québec à Chicoutimi";
"(C) 2013-2017 Sylvain Hallé, Université du Québec à Chicoutimi";

$usage_string = <<<EOD
$HELLO_MSG
Usage: php fw.php [--help] [options]
Usage: php fw/fw.php [--help] [options]
Options:
--clean-urls Removes html extension in local links
Expand All @@ -47,6 +47,7 @@
require_once("fw/page.inc.php");
require_once("fw/utils.php");
require_once("fw/html5lib/Parser.php");
require_once("fw/yaml-php/sfYamlParser.php");

// Option defaults {{{
$fw_params = array();
Expand Down Expand Up @@ -93,6 +94,7 @@
// }}}

// Initialization of the instances
$yaml_parser = new sfYamlParser();
$rendering = new Rendering();
$site = new Site();
$pages = array();
Expand All @@ -110,12 +112,12 @@
spitln("\n$HELLO_MSG\n", -1);

// Check if YAML module is installed; otherwise deactivate YAML processing
if (!function_exists("yaml_parse"))
/*if (!function_exists("yaml_parse"))
{
$rendering->setYaml(false);
show_error("WARNING: the YAML PHP module is not installed. ".
"Support for YAML is disabled.");
}
}*/

// List all pages
$file_list = scandir_recursive($rendering->getContentDir());
Expand Down Expand Up @@ -149,10 +151,19 @@
if (file_exists($yaml_filename) && $rendering->getYaml())
{
$yaml_contents = file_get_contents($yaml_filename);
if ($parsed_yaml = yaml_parse($yaml_contents))
$page->mergeYaml($parsed_yaml);
else
show_error("WARNING: Error parsing YAML in $yaml_filename");
try
{
$parsed_yaml = $yaml_parser->parse($yaml_contents);
if ($parsed_yaml)
$page->mergeYaml($parsed_yaml);
else
show_error("WARNING: Error parsing YAML in $yaml_filename");
}
catch (InvalidArgumentException $e)
{
// an error occurred during parsing
show_error("WARNING: Error parsing YAML in $yaml_filename");
}
$page->addIncludedFile($yaml_filename);
}

Expand All @@ -161,10 +172,19 @@
if (count($matches) > 0)
{
$yaml_contents = $matches[0][0];
if ($parsed_yaml = yaml_parse($yaml_contents))
$page->mergeYaml($parsed_yaml);
else
show_error("WARNING: Error parsing YAML at the end of $file");
try
{
$parsed_yaml = $yaml_parser->parse($yaml_contents);
if ($parsed_yaml)
$page->mergeYaml($parsed_yaml);
else
show_error("WARNING: Error parsing YAML at the end of $file");
}
catch (InvalidArgumentException $e)
{
// an error occurred during parsing
show_error("WARNING: Error parsing YAML at the end of $file");
}
$contents = substr($contents, 0, $matches[0][1]); // Trim YAML from file before rendering
}

Expand Down
18 changes: 13 additions & 5 deletions fw/page.inc.php
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,7 @@ public function mustRegenerate()

function recurseYaml($start_dir, $end_dir, $filename)
{
global $yaml_parser;
if ($start_dir[strlen($start_dir) - 1] !== "/")
$start_dir .= "/";
if ($end_dir[strlen($end_dir) - 1] !== "/")
Expand All @@ -142,12 +143,19 @@ function recurseYaml($start_dir, $end_dir, $filename)
if (file_exists($cur_filename))
{
$yaml_contents = file_get_contents($cur_filename);
if ($parsed_yaml = yaml_parse($yaml_contents))
try
{
$out_yaml = array_merge($out_yaml, $parsed_yaml);
}
else
show_error("WARNING: Error parsing YAML in $cur_filename");
$parsed_yaml = $yaml_parser->parse($yaml_contents);
if ($parsed_yaml)
$out_yaml = array_merge($out_yaml, $parsed_yaml);
else
show_error("WARNING: Error parsing YAML in $cur_filename");
}
catch (InvalidArgumentException $e)
{
// an error occurred during parsing
show_error("WARNING: Error parsing YAML in $cur_filename");
}
$this->addIncludedFile($cur_filename);
}
$cur_dir .= $dir."/";
Expand Down
135 changes: 135 additions & 0 deletions fw/yaml-php/sfYaml.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,135 @@
<?php

/*
* This file is part of the symfony package.
* (c) 2004-2006 Fabien Potencier <fabien.potencier@symfony-project.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/

/**
* sfYaml offers convenience methods to load and dump YAML.
*
* @package symfony
* @subpackage yaml
* @author Fabien Potencier <fabien.potencier@symfony-project.com>
* @version SVN: $Id: sfYaml.class.php 8988 2008-05-15 20:24:26Z fabien $
*/
class sfYaml
{
static protected
$spec = '1.2';

/**
* Sets the YAML specification version to use.
*
* @param string $version The YAML specification version
*/
static public function setSpecVersion($version)
{
if (!in_array($version, array('1.1', '1.2')))
{
throw new InvalidArgumentException(sprintf('Version %s of the YAML specifications is not supported', $version));
}

self::$spec = $version;
}

/**
* Gets the YAML specification version to use.
*
* @return string The YAML specification version
*/
static public function getSpecVersion()
{
return self::$spec;
}

/**
* Loads YAML into a PHP array.
*
* The load method, when supplied with a YAML stream (string or file),
* will do its best to convert YAML in a file into a PHP array.
*
* Usage:
* <code>
* $array = sfYaml::load('config.yml');
* print_r($array);
* </code>
*
* @param string $input Path of YAML file or string containing YAML
*
* @return array The YAML converted to a PHP array
*
* @throws InvalidArgumentException If the YAML is not valid
*/
public static function load($input)
{
$file = '';

// if input is a file, process it
if (strpos($input, "\n") === false && is_file($input))
{
$file = $input;

ob_start();
$retval = include($input);
$content = ob_get_clean();

// if an array is returned by the config file assume it's in plain php form else in YAML
$input = is_array($retval) ? $retval : $content;
}

// if an array is returned by the config file assume it's in plain php form else in YAML
if (is_array($input))
{
return $input;
}

require_once dirname(__FILE__).'/sfYamlParser.php';

$yaml = new sfYamlParser();

try
{
$ret = $yaml->parse($input);
}
catch (Exception $e)
{
throw new InvalidArgumentException(sprintf('Unable to parse %s: %s', $file ? sprintf('file "%s"', $file) : 'string', $e->getMessage()));
}

return $ret;
}

/**
* Dumps a PHP array to a YAML string.
*
* The dump method, when supplied with an array, will do its best
* to convert the array into friendly YAML.
*
* @param array $array PHP array
* @param integer $inline The level where you switch to inline YAML
*
* @return string A YAML string representing the original PHP array
*/
public static function dump($array, $inline = 2)
{
require_once dirname(__FILE__).'/sfYamlDumper.php';

$yaml = new sfYamlDumper();

return $yaml->dump($array, $inline);
}
}

/**
* Wraps echo to automatically provide a newline.
*
* @param string $string The string to echo with new line
*/
function echoln($string)
{
echo $string."\n";
}
60 changes: 60 additions & 0 deletions fw/yaml-php/sfYamlDumper.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
<?php

/*
* This file is part of the symfony package.
* (c) Fabien Potencier <fabien.potencier@symfony-project.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/

require_once(dirname(__FILE__).'/sfYamlInline.php');

/**
* sfYamlDumper dumps PHP variables to YAML strings.
*
* @package symfony
* @subpackage yaml
* @author Fabien Potencier <fabien.potencier@symfony-project.com>
* @version SVN: $Id: sfYamlDumper.class.php 10575 2008-08-01 13:08:42Z nicolas $
*/
class sfYamlDumper
{
/**
* Dumps a PHP value to YAML.
*
* @param mixed $input The PHP value
* @param integer $inline The level where you switch to inline YAML
* @param integer $indent The level o indentation indentation (used internally)
*
* @return string The YAML representation of the PHP value
*/
public function dump($input, $inline = 0, $indent = 0)
{
$output = '';
$prefix = $indent ? str_repeat(' ', $indent) : '';

if ($inline <= 0 || !is_array($input) || empty($input))
{
$output .= $prefix.sfYamlInline::dump($input);
}
else
{
$isAHash = array_keys($input) !== range(0, count($input) - 1);

foreach ($input as $key => $value)
{
$willBeInlined = $inline - 1 <= 0 || !is_array($value) || empty($value);

$output .= sprintf('%s%s%s%s',
$prefix,
$isAHash ? sfYamlInline::dump($key).':' : '-',
$willBeInlined ? ' ' : "\n",
$this->dump($value, $inline - 1, $willBeInlined ? 0 : $indent + 2)
).($willBeInlined ? "\n" : '');
}
}

return $output;
}
}
Loading

0 comments on commit 5d68a2b

Please sign in to comment.