<commit_before><?php

/**
 * SowerPHP: Minimalist Framework for PHP
 * Copyright (C) SowerPHP (http://sowerphp.org)
 *
 * Este programa es software libre: usted puede redistribuirlo y/o
 * modificarlo bajo los términos de la Licencia Pública General GNU
 * publicada por la Fundación para el Software Libre, ya sea la versión
 * 3 de la Licencia, o (a su elección) cualquier versión posterior de la
 * misma.
 *
 * Este programa se distribuye con la esperanza de que sea útil, pero
 * SIN GARANTÍA ALGUNA; ni siquiera la garantía implícita
 * MERCANTIL o de APTITUD PARA UN PROPÓSITO DETERMINADO.
 * Consulte los detalles de la Licencia Pública General GNU para obtener
 * una información más detallada.
 *
 * Debería haber recibido una copia de la Licencia Pública General GNU
 * junto a este programa.
 * En caso contrario, consulte <http://www.gnu.org/licenses/gpl.html>.
 */

namespace sowerphp\general;

/**
 * Manejar planillas en formato CSV, ODS y XLS
 *
 * Esta clase permite leer y generar planillas de cálculo
 * @author <NAME>, DeLaF (esteban[at]delaf.cl)
 * @version 2014-03-26
 */
class Utility_Spreadsheet
{

    public static $exts = array('ods', 'xls', 'xlsx', 'csv'); ///< extensions

    /**
     * Lee una planilla de cálculo (CSV, ODS o XLS)
     * @param archivo arreglo pasado el archivo (ejemplo $_FILES['archivo']) o bien la ruta hacia el archivo
     * @author <NAME>, DeLaF (esteban[at]delaf.cl)
     * @version 2014-03-25
     */
    public static function read ($archivo, $hoja = 0)
    {
        $archivo = self::archivo ($archivo);
        // en caso que sea archivo CSV
        if ($archivo['type']=='text/csv' || $archivo['type']=='text/plain') {
            return Utility_Spreadsheet_CSV::read($archivo['tmp_name']);
        }
        // en caso que sea archivo ODS
        else if($archivo['type']=='application/vnd.oasis.opendocument.spreadsheet') {
            return Utility_Spreadsheet_ODS::read($archivo['tmp_name'], $hoja);
        }
        // en caso que sea archivo XLS
        else if($archivo['type']=='application/vnd.ms-excel') {
            return Utility_Spreadsheet_XLS::read($archivo['tmp_name'], $hoja);
        }
        // en caso que sea archivo XLSX
        else if($archivo['type']=='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') {
            return Utility_Spreadsheet_XLS::read($archivo['tmp_name'], $hoja, 'Excel2007');
        }
        // en caso que sea archivo XLSM
        else if($archivo['type']=='application/vnd.ms-excel.sheet.macroEnabled.12') {
            return Utility_Spreadsheet_XLS::read($archivo['tmp_name'], $hoja, 'Excel2007');
        }
    }

    /**
     * Crea una planilla de cálculo a partir de un arreglo
     * @param data Arreglo utilizado para generar la planilla
     * @param id Identificador de la planilla
     * @param formato extension de la planilla para definir formato
     * @author <NAME>, DeLaF (esteban[at]delaf.cl)
     * @version 2013-07-05
     */
    public static function generate ($data, $id, $formato = 'ods')
    {
        // en caso que sea archivo CSV
        if ($formato == 'csv') {
            Utility_Spreadsheet_CSV::generate($data, $id);
        }
        // en caso que sea archivo ODS
        else if($formato == 'ods') {
            Utility_Spreadsheet_ODS::generate($data, $id);
        }
        // en caso que sea archivo XLS
        else if($formato == 'xls') {
            Utility_Spreadsheet_XLS::generate($data, $id);
        }
        else if($formato == 'xml') {
            Utility_Spreadsheet_XML::generate($data, $id);
        }
        // en caso que sea archivo JSON
        else if($formato == 'json') {
            Utility_Spreadsheet_JSON::generate($data, $id);
        }
        // terminar ejecucion del script
        exit();
    }

    /**
     * Cargar tabla desde un archivo HTML
     * @todo Revisar errores que se generán por loadHTML (quitar el @, no usarlo!!)
     * @author <NAME>, DeLaF (esteban[at]delaf.cl)
     */
    public static function readFromHTML($html, $tableId = 1, $withColsNames = true, $utf8decode = false)
    {
        // arreglo para ir guardando los datos de la tabla
        $data = array();
        // crear objeto DOM (Document Object Model)
        $dom = new \DOMDocument();
        @$dom->loadHTML($html);
        // crear objeto para hacer querys al documento
        $xpath = new \DOMXPath($dom);
        // si se pidió una tabla por número se sacan todas las tablas y se
        // saca la de la posición (número) requerida
        if (is_numeric($tableId)) {
            $tables = $xpath->query('//table');
            $table = $tables->item($tableId-1);
        }
        // si se está buscando por id la tabla, se hace la búsqueda de forma
        // directa
        else {
            $table = $xpath->query('//div[@id="'.$tableId.'"]');
        }
        // procesar filas
        $rows = $table->getElementsByTagName('tr');
        $from = $withColsNames ? 0 : 1;
        for ($i=$from; $i<$rows->length; ++$i) {
            // procesar columnas de cada fila
            $cols = $rows->item($i)->getElementsByTagName('td');
            $row = array();
            foreach ($cols as $col) {
                $row[] = $utf8decode ? trim(utf8_decode($col->nodeValue)) : trim($col->nodeValue);
            }
            $data[] = $row;
        }
        // retornar datos de la tabla
        return $data;
    }

    /**
     * Método que retorna los nombres de las hojas
     * @param archivo Archivo que se procesará
     * @return Arreglo con los nombres de las hojas
     * @author <NAME>, DeLaF (esteban[at]delaf.cl)
     * @version 2014-03-25
     */
    public static function sheets ($archivo)
    {
        $archivo = self::archivo ($archivo);
        // en caso que sea archivo CSV
        if ($archivo['type']=='text/csv' || $archivo['type']=='text/plain') {
            return Utility_Spreadsheet_CSV::sheets($archivo['tmp_name']);
        }
        // en caso que sea archivo ODS<commit_msg>fix detección de hojas de la planilla<commit_after><?php

/**
 * SowerPHP: Minimalist Framework for PHP
 * Copyright (C) SowerPHP (http://sowerphp.org)
 *
 * Este programa es software libre: usted puede redistribuirlo y/o
 * modificarlo bajo los términos de la Licencia Pública General GNU
 * publicada por la Fundación para el Software Libre, ya sea la versión
 * 3 de la Licencia, o (a su elección) cualquier versión posterior de la
 * misma.
 *
 * Este programa se distribuye con la esperanza de que sea útil, pero
 * SIN GARANTÍA ALGUNA; ni siquiera la garantía implícita
 * MERCANTIL o de APTITUD PARA UN PROPÓSITO DETERMINADO.
 * Consulte los detalles de la Licencia Pública General GNU para obtener
 * una información más detallada.
 *
 * Debería haber recibido una copia de la Licencia Pública General GNU
 * junto a este programa.
 * En caso contrario, consulte <http://www.gnu.org/licenses/gpl.html>.
 */

namespace sowerphp\general;

/**
 * Manejar planillas en formato CSV, ODS y XLS
 *
 * Esta clase permite leer y generar planillas de cálculo
 * @author <NAME>, DeLaF (esteban[at]delaf.cl)
 * @version 2014-03-26
 */
class Utility_Spreadsheet
{

    public static $exts = array('ods', 'xls', 'xlsx', 'csv'); ///< extensions

    /**
     * Lee una planilla de cálculo (CSV, ODS o XLS)
     * @param archivo arreglo pasado el archivo (ejemplo $_FILES['archivo']) o bien la ruta hacia el archivo
     * @author <NAME>, DeLaF (esteban[at]delaf.cl)
     * @version 2014-03-25
     */
    public static function read ($archivo, $hoja = 0)
    {
        $archivo = self::archivo ($archivo);
        // en caso que sea archivo CSV
        if ($archivo['type']=='text/csv' || $archivo['type']=='text/plain') {
            return Utility_Spreadsheet_CSV::read($archivo['tmp_name']);
        }
        // en caso que sea archivo ODS
        else if($archivo['type']=='application/vnd.oasis.opendocument.spreadsheet') {
            return Utility_Spreadsheet_ODS::read($archivo['tmp_name'], $hoja);
        }
        // en caso que sea archivo XLS
        else if($archivo['type']=='application/vnd.ms-excel') {
            return Utility_Spreadsheet_XLS::read($archivo['tmp_name'], $hoja);
        }
        // en caso que sea archivo XLSX
        else if($archivo['type']=='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') {
            return Utility_Spreadsheet_XLS::read($archivo['tmp_name'], $hoja, 'Excel2007');
        }
        // en caso que sea archivo XLSM
        else if($archivo['type']=='application/vnd.ms-excel.sheet.macroEnabled.12') {
            return Utility_Spreadsheet_XLS::read($archivo['tmp_name'], $hoja, 'Excel2007');
        }
    }

    /**
     * Crea una planilla de cálculo a partir de un arreglo
     * @param data Arreglo utilizado para generar la planilla
     * @param id Identificador de la planilla
     * @param formato extension de la planilla para definir formato
     * @author <NAME>, DeLaF (esteban[at]delaf.cl)
     * @version 2013-07-05
     */
    public static function generate ($data, $id, $formato = 'ods')
    {
        // en caso que sea archivo CSV
        if ($formato == 'csv') {
            Utility_Spreadsheet_CSV::generate($data, $id);
        }
        // en caso que sea archivo ODS
        else if($formato == 'ods') {
            Utility_Spreadsheet_ODS::generate($data, $id);
        }
        // en caso que sea archivo XLS
        else if($formato == 'xls') {
            Utility_Spreadsheet_XLS::generate($data, $id);
        }
        else if($formato == 'xml') {
            Utility_Spreadsheet_XML::generate($data, $id);
        }
        // en caso que sea archivo JSON
        else if($formato == 'json') {
            Utility_Spreadsheet_JSON::generate($data, $id);
        }
        // terminar ejecucion del script
        exit();
    }

    /**
     * Cargar tabla desde un archivo HTML
     * @todo Revisar errores que se generán por loadHTML (quitar el @, no usarlo!!)
     * @author <NAME>, DeLaF (esteban[at]delaf.cl)
     */
    public static function readFromHTML($html, $tableId = 1, $withColsNames = true, $utf8decode = false)
    {
        // arreglo para ir guardando los datos de la tabla
        $data = array();
        // crear objeto DOM (Document Object Model)
        $dom = new \DOMDocument();
        @$dom->loadHTML($html);
        // crear objeto para hacer querys al documento
        $xpath = new \DOMXPath($dom);
        // si se pidió una tabla por número se sacan todas las tablas y se
        // saca la de la posición (número) requerida
        if (is_numeric($tableId)) {
            $tables = $xpath->query('//table');
            $table = $tables->item($tableId-1);
        }
        // si se está buscando por id la tabla, se hace la búsqueda de forma
        // directa
        else {
            $table = $xpath->query('//div[@id="'.$tableId.'"]');
        }
        // procesar filas
        $rows = $table->getElementsByTagName('tr');
        $from = $withColsNames ? 0 : 1;
        for ($i=$from; $i<$rows->length; ++$i) {
            // procesar columnas de cada fila
            $cols = $rows->item($i)->getElementsByTagName('td');
            $row = array();
            foreach ($cols as $col) {
                $row[] = $utf8decode ? trim(utf8_decode($col->nodeValue)) : trim($col->nodeValue);
            }
            $data[] = $row;
        }
        // retornar datos de la tabla
        return $data;
    }

    /**
     * Método que retorna los nombres de las hojas
     * @param archivo Archivo que se procesará
     * @return Arreglo con los nombres de las hojas
     * @author <NAME>, DeLaF (esteban[at]delaf.cl)
     * @version 2014-04-27
     */
    public static function sheets ($archivo)
    {
        $archivo = self::archivo ($archivo);
        // en caso que sea archivo CSV
        if ($archivo['type']=='text/csv' || $archivo['type']=='text/plain') {
            return [substr($archivo['name'], 0, -4)];
        }
        // en caso que sea archivo ODS
{'fraction_non_alphanumeric': 0.12782767797737857, 'fraction_numerical': 0.008649367930805056, 'mean_word_length': 2.406515580736544, 'pattern_counts': {'":': 0, '<': 21, '<?xml version=': 0, '>': 35, 'https://': 0, 'lorem ipsum': 0, 'www.': 2, 'xml': 4}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '6682474', 'n_tokens_mistral': 4011, 'n_tokens_neox': 3876, 'n_words': 1107}