Seditio Source
Root |
./othercms/dotclear-2.22/plugins/importExport/inc/flat/class.flat.backup.php
<?php
/**
 * @brief importExport, a plugin for Dotclear 2
 *
 * @package Dotclear
 * @subpackage Plugins
 *
 * @copyright Olivier Meunier & Association Dotclear
 * @copyright GPL-2.0-only
 */
if (!defined('DC_RC_PATH')) {
    return;
}

class
flatBackup
{
    protected
$fp;
    private
$line_cols = [];
    private
$line_name;
    private
$line_num;

    private
$replacement = [
       
'/(?<!\\\\)(?>(\\\\\\\\)*+)(\\\\n)/u' => "\$1\n",
       
'/(?<!\\\\)(?>(\\\\\\\\)*+)(\\\\r)/u' => "\$1\r",
       
'/(?<!\\\\)(?>(\\\\\\\\)*+)(\\\\")/u' => '$1"',
       
'/(\\\\\\\\)/'                        => '\\',
    ];

    public function
__construct($file)
    {
        if (
file_exists($file) && is_readable($file)) {
           
$this->fp       = fopen($file, 'rb');
           
$this->line_num = 1;
        } else {
            throw new
Exception(__('No file to read.'));
        }
    }

    public function
__destruct()
    {
        if (
is_resource($this->fp)) {
            @
fclose($this->fp);
        }
    }

    public function
getLine()
    {
        if ((
$line = $this->nextLine()) === false) {
            return
false;
        }

        if (
substr($line, 0, 1) == '[') {
           
$this->line_name = substr($line, 1, strpos($line, ' ') - 1);

           
$line            = substr($line, strpos($line, ' ') + 1, -1);
           
$this->line_cols = explode(',', $line);

            return
$this->getLine();
        } elseif (
substr($line, 0, 1) == '"') {
           
$line = preg_replace('/^"|"$/', '', $line);
           
$line = preg_split('/(^"|","|(?<!\\\)\"$)/m', $line);

            if (
count($this->line_cols) != count($line)) {
                throw new
Exception(sprintf('Invalid row count at line %s', $this->line_num));
            }

           
$res = [];

            for (
$i = 0; $i < count($line); $i++) {
               
$res[$this->line_cols[$i]] = preg_replace(array_keys($this->replacement), array_values($this->replacement), $line[$i]);
            }

            return new
flatBackupItem($this->line_name, $res, $this->line_num);
        }

        return
$this->getLine();
    }

    private function
nextLine()
    {
        if (
feof($this->fp)) {
            return
false;
        }
       
$this->line_num++;

       
$line = fgets($this->fp);
       
$line = trim((string) $line);

        return empty(
$line) ? $this->nextLine() : $line;
    }
}

class
flatBackupItem
{
    public
$__name;
    public
$__line;
    private
$__data = [];

    public function
__construct($name, $data, $line)
    {
       
$this->__name = $name;
       
$this->__data = $data;
       
$this->__line = $line;
    }

    public function
f($name)
    {
        return
iconv('UTF-8', 'UTF-8//IGNORE', $this->__data[$name]);
    }

    public function
__get($name)
    {
        return
$this->f($name);
    }

    public function
__set($n, $v)
    {
       
$this->__data[$n] = $v;
    }

    public function
exists($n)
    {
        return isset(
$this->__data[$n]);
    }

    public function
drop(...$args)
    {
        foreach (
$args as $n) {
            if (isset(
$this->__data[$n])) {
                unset(
$this->__data[$n]);
            }
        }
    }

    public function
substitute($old, $new)
    {
        if (isset(
$this->__data[$old])) {
           
$this->__data[$new] = $this->__data[$old];
            unset(
$this->__data[$old]);
        }
    }
}