Explorar el Código

Add files via upload

Capitan Cloud hace 2 años
padre
commit
14f54a4c12

+ 112 - 0
Private/config/config.inc.sample

@@ -0,0 +1,112 @@
+<?php
+
+/**
+ * Copyright 2021, 2024 5 Mode
+ *
+ * This file is part of Xslt-Master.
+ * 
+ * Xslt-Master is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * 
+ * Xslt-Master is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.  
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with Xslt-Master. If not, see <https://www.gnu.org/licenses/>.
+ *
+ * config.inc
+ * 
+ * Xslt-Master configuration settings.
+ *
+ * @author Daniele Bonini <my25mb@aol.com>
+ * @copyrights (c) 2021, 2024 5 Mode     
+ */
+
+define('DEBUG', true);
+ 
+define('APP_NAME', "XsltMaster");
+define('APP_TITLE', "XsltMaster: everyone its xsl tranformation.");
+
+define('APP_HOST', "yourxsltmaster.com");
+define('APP_PATH', "/var/www/yourxsltmaster/Public");
+define('APP_PRIVATE_PATH', "/var/www/yourxsltmaster/Private");
+define('APP_SCRIPT_PATH', "/var/www/yourxsltmaster/Private/scripts");
+define('APP_AJAX_PATH', "/var/www/yourxsltmaster/Private/scripts_ajax");
+define('APP_ERROR_PATH', "/var/www/yourxsltmaster/Private/error");
+define('APP_DATA_PATH', "/var/www/yourxsltmaster/Private/data");
+define('APP_LICENSE', <<<LICENSETEXT
+Copyright (c) 2016, 2024 5 Mode
+All rights reserved.
+
+This file is part of Xslt-Master.
+
+Xslt-Master is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Xslt-Master is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.  
+
+You should have received a copy of the GNU General Public License
+along with Xslt-Master. If not, see <https://www.gnu.org/licenses/>.
+
+https://opensource.org/licenses/GPL-3.0
+LICENSETEXT
+);
+// Default Locale, in two letters format
+define('APP_DEF_LANG', "en-US");
+define('APP_MAX_TOT_REC', 50);
+define('APP_FILE_MAX_SIZE', 1100000);
+
+
+$CONFIG = [
+
+   'DEBUG' => true,
+ 
+   'APP' => [
+      'NAME' => "Xslt-Master",
+      'TITLE' => "Xslt-Master: everyone its xsl tranformation.",
+      'HOST' => "yourxsltmaster.com", 
+      'PATH' => "/var/www/yourxsltmaster/Public",
+      'PRIVATE_PATH' => "/var/www/yourxsltmaster/Private", 
+      'SCRIPT_PATH' => "/var/www/yourxsltmaster/Private/scripts",
+      'AJAX_PATH' => "/var/www/yourxsltmaster/Private/scripts_ajax",
+      'ERROR_PATH' => "/var/www/yourxsltmaster/Private/error",
+      'DATA_PATH' => "/var/www/yourxsltmaster/Private/data",
+      'LICENSE' => <<<LICENSETEXT
+Copyright (c) 2016, 2024 5 Mode
+All rights reserved.
+
+This file is part of Xslt-Master.
+
+Xslt-Master is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Xslt-Master is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.  
+
+You should have received a copy of the GNU General Public License
+along with Xslt-Master. If not, see <https://www.gnu.org/licenses/>.
+
+https://opensource.org/licenses/GPL-3.0 
+LICENSETEXT
+             ,
+      'DEF_LANG' => "en-US",
+      'MAX_TOT_REC' => 50, 
+      'FILE_MAX_SIZE' => 1100000   
+
+      ]
+    
+    ];  
+

+ 94 - 0
Private/config/const.php.inc

@@ -0,0 +1,94 @@
+<?php
+
+/**
+ * Copyright 2021, 2024 5 Mode
+ *
+ * This file is part of Xslt-Master.
+ * 
+ * Xslt-Master is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * 
+ * Xslt-Master is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.  
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with Xslt-Master. If not, see <https://www.gnu.org/licenses/>.
+ *
+ * const.inc
+ * 
+ * Xslt-Master constant file.
+ *
+ * @author Daniele Bonini <my25mb@aol.com>
+ * @copyrights (c) 2021, 2024, 5 Mode     
+ */
+
+if (!defined("PHP_BR")) {
+  define('PHP_BR', "<br>");
+}
+if (!defined("PHP_CN")) {
+  define('PHP_CN', "zh-CN");
+}
+if (!defined("PHP_EN")) {
+  define('PHP_EN', "en-US");
+}
+if (!defined("PHP_ES")) {
+  define('PHP_ES', "es-ES");
+}
+if (!defined("PHP_FR")) {
+  define('PHP_FR', "fr-FR");
+}
+if (!defined("PHP_HYPHEN")) {
+  define('PHP_HYPHEN', "-");
+}
+if (!defined("PHP_IT")) {
+  define('PHP_IT', "it-IT");
+}
+if (!defined("PHP_PIPE")) {
+  define('PHP_PIPE', "|");
+}
+if (!defined("PHP_FILE_PIPE")) {
+  define('PHP_FILE_PIPE', ">");
+}
+if (!defined("PHP_SLASH")) {
+  define('PHP_SLASH', "/");
+}
+if (!defined("PHP_SPACE")) {
+  define('PHP_SPACE', " ");
+}
+if (!defined("PHP_STR")) {
+  define('PHP_STR', "");
+}
+if (!defined("PHP_TILDE")) {
+  define('PHP_TILDE', "~");
+}
+if (!defined("PHP_UNDERSCORE")) {
+  define('PHP_UNDERSCORE', "_");
+}
+if (!defined("PHP_UPLOAD_ERR_OK")) {
+  define('PHP_UPLOAD_ERR_OK', 0);
+}
+if (!defined("PHP_UPLOAD_ERR_INI_SIZE")) {
+  define('PHP_UPLOAD_ERR_INI_SIZE', 1);
+}
+if (!defined("PHP_UPLOAD_ERR_FORM_SIZE")) {
+  define('PHP_UPLOAD_ERR_FORM_SIZE', 2);
+}
+if (!defined("PHP_UPLOAD_ERR_PARTIAL")) {
+  define('PHP_UPLOAD_ERR_PARTIAL', 3);
+}
+if (!defined("PHP_UPLOAD_ERR_NO_FILE")) {
+  define('PHP_UPLOAD_ERR_NO_FILE', 4);
+}
+if (!defined("PHP_UPLOAD_ERR_NO_TMP_DIR")) {
+  define('PHP_UPLOAD_ERR_NO_TMP_DIR', 6);
+}
+if (!defined("PHP_UPLOAD_ERR_CANT_WRITE")) {
+  define('PHP_UPLOAD_ERR_CANT_WRITE', 7);
+}
+if (!defined("PHP_UPLOAD_ERR_EXTENSION")) {
+  define('PHP_UPLOAD_ERR_EXTENSION', 8);
+}

+ 121 - 0
Private/core/init.inc

@@ -0,0 +1,121 @@
+<?php
+
+/**
+ * Copyright 2021, 2024 5 Mode
+ *
+ * This file is part of Xslt-Master.
+ * 
+ * Xslt-Master is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * 
+ * Xslt-Master is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.  
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with Xslt-Master. If not, see <https://www.gnu.org/licenses/>.
+ *
+ * init.inc
+ * 
+ * Xslt-Master Initialization file.
+ *
+ * @author Daniele Bonini <my25mb@aol.com>
+ * @copyrights (c) 2016, 2024, 5 Mode   
+ */
+
+//use fivemode\fivemode\Class;
+
+error_reporting(E_ALL & ~ (E_WARNING | E_NOTICE | E_STRICT | E_DEPRECATED));  
+ini_set('display_startup_errors',1);  
+ini_set('display_errors',1);  
+ini_set('log_errors',1); 
+
+
+// CONFIGURATION
+define("CONFIG_PATH", __DIR__ . DIRECTORY_SEPARATOR . ".." . DIRECTORY_SEPARATOR . "config");
+
+require CONFIG_PATH . DIRECTORY_SEPARATOR . "config.inc";
+require CONFIG_PATH . DIRECTORY_SEPARATOR . "const.php.inc";
+
+define("FUNCTIONS_PATH", __DIR__ . DIRECTORY_SEPARATOR . ".." . DIRECTORY_SEPARATOR . "functions");
+
+require FUNCTIONS_PATH . DIRECTORY_SEPARATOR . "func.string.inc";
+require FUNCTIONS_PATH . DIRECTORY_SEPARATOR . "func.various.inc";
+
+
+mb_internal_encoding("UTF-8");
+
+
+// ERROR HANDLING AND LOGGING
+
+if (DEBUG) {
+  error_reporting(E_ALL | E_STRICT);  
+  ini_set('display_startup_errors',1);  
+  ini_set('display_errors',1);
+  ini_set('log_errors',1); 
+} else {
+  error_reporting(E_ALL & ~ (E_WARNING | E_NOTICE | E_STRICT | E_DEPRECATED));  
+  ini_set('display_startup_errors',0);  
+  ini_set('display_errors',0);  
+  ini_set('log_errors',1); 
+}
+
+header("Expires: 0");
+header("Pragma: no-cache");
+// HTTP/1.1 support
+header("Cache-Control: private,no-cache,max-age=0,s-maxage=0,must-revalidate");
+
+//Err::setDefaultHandlers();
+
+
+// SHUTDOWN 
+
+/**
+ * Shutdown callback.
+ * 
+ * @return void
+ */
+function shutdownCallback() {
+  
+//Err::setLogOnlyHandlers();
+
+/*  
+  if (Cache::issetInstance()) {  
+    //For non-persistent connections only
+    //$cache = &Cache::getInstance();
+    //$cache->close();
+
+    Cache::unsetInstance();
+  }
+*/
+  
+}
+register_shutdown_function("shutdownCallback");
+
+// ERROR PARAMETERS
+
+//errNo
+//define("ERR_NO", substr(filter_input1(INPUT_GET, "errNo", FILTER_SANITIZE_MD5TOKEN), 0, 100));
+//if (ERR_NO!==PHP_STR && !filter_var1(ERR_NO, FILTER_VALIDATE_ERRNO)) {
+//  Err::trigger_error1(ERR::ERR_ERR, "Invalid error number: " . ERR_NO, __FILE__, __LINE__);
+//}
+
+//errKey
+//define("ERR_KEY", array_search(ERR_NO, Err::$A_ERR_NO));
+
+//errMsg
+//define("ERR_MSG", substr(filter_input1(INPUT_GET, "errMsg", FILTER_SANITIZE_ERRMSG), 0, 200));
+
+//errScript
+//define("ERR_SCRIPT", substr(filter_input(INPUT_GET, "errScript", FILTER_SANITIZE_STRING), 0, 255));
+
+//errLine
+//define("ERR_LINE",  substr(filter_input(INPUT_GET, "errLine", FILTER_SANITIZE_NUMBER_INT), 0, 5));
+
+//errStack
+//define("ERR_STACK", substr(filter_input1(INPUT_GET, "errStack", FILTER_SANITIZE_STRING_WITHBR), 0, 2000));
+
+?>

+ 14 - 0
Private/data/Linkin-Park-songs.xml

@@ -0,0 +1,14 @@
+<?xml version="1.0"?>
+
+<CONTENT>
+  <ITEM>
+    <ID>01</ID>
+    <NAME>99 Problems</NAME>
+    <INDEX>1</INDEX>
+  </ITEM>
+  <ITEM>
+    <ID>02</ID>
+    <NAME>Encore</NAME>
+    <INDEX>2</INDEX>
+  </ITEM>
+</CONTENT>

+ 17 - 0
Private/data/Linkin-Park-songs.xsl

@@ -0,0 +1,17 @@
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  xmlns:xlink="http://www.w3.org/1999/xlink"  version="1.0">
+
+<xsl:output method="html"/>
+
+<xsl:template match="CONTENT">
+
+  <xsl:for-each select="ITEM[ID>'00']">
+
+     <xsl:sort select="INDEX" data-type="number" order="ascending"/>
+
+     <div class="ve-song-list"><xsl:value-of select="NAME"/></div>
+
+  </xsl:for-each>
+
+</xsl:template>
+
+</xsl:stylesheet>

+ 14 - 0
Private/data/Tina-Turner-songs.xml

@@ -0,0 +1,14 @@
+<?xml version="1.0"?>
+
+<CONTENT>
+  <ITEM>
+    <ID>01</ID>
+    <NAME>Private Dancer</NAME>
+    <INDEX>1</INDEX>
+  </ITEM>
+  <ITEM>
+    <ID>02</ID>
+    <NAME>The Best</NAME>
+    <INDEX>2</INDEX>
+  </ITEM>
+</CONTENT>

+ 17 - 0
Private/data/Tina-Turner-songs.xsl

@@ -0,0 +1,17 @@
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  xmlns:xlink="http://www.w3.org/1999/xlink"  version="1.0">
+
+<xsl:output method="html"/>
+
+<xsl:template match="CONTENT">
+
+  <xsl:for-each select="ITEM[ID>'00']">
+
+     <xsl:sort select="INDEX" data-type="number" order="ascending"/>
+
+     <div class="ve-song-list"><xsl:value-of select="NAME"/></div>
+
+  </xsl:for-each>
+
+</xsl:template>
+
+</xsl:stylesheet>

+ 16 - 0
Private/data/singers.xml

@@ -0,0 +1,16 @@
+<?xml version="1.0"?>
+
+<!--<?xml-stylesheet type="text/xsl" href="/xsl?d=singers"?>-->
+
+<CONTENT>
+  <ITEM>
+    <ID>01</ID>
+    <NAME>Tina Turner</NAME>
+    <INDEX>1</INDEX>
+  </ITEM>
+  <ITEM>
+    <ID>02</ID>
+    <NAME>Linkin Park</NAME>
+    <INDEX>2</INDEX>
+  </ITEM>
+</CONTENT>

+ 18 - 0
Private/data/singers.xsl

@@ -0,0 +1,18 @@
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  xmlns:xlink="http://www.w3.org/1999/xlink"  version="1.0">
+
+<xsl:output method="html"/>
+
+<xsl:template match="CONTENT">
+
+  <xsl:for-each select="ITEM[ID>'00']">
+
+     <xsl:sort select="INDEX" data-type="number" order="ascending"/>
+
+     <div class="ve-singer-list" onclick="loadXML('songs',this.innerHTML.replaceAll(' ','-')+'-songs')"><xsl:value-of select="NAME"/></div>
+
+
+  </xsl:for-each>
+
+</xsl:template>
+
+</xsl:stylesheet>

+ 6 - 0
Private/error/err-404.php

@@ -0,0 +1,6 @@
+<html>
+<head><title>404</title></head>
+<body style="background-image:url('/res/404bg.jpg'); background-size: cover; background-repeat: no-repeat;">
+&nbsp;
+</body>
+</html>

+ 636 - 0
Private/functions/func.string.inc

@@ -0,0 +1,636 @@
+<?php
+
+/**
+ * Copyright 2021, 2024 5 Mode
+ *
+ * This file is part of Xslt-Master.
+ * 
+ * Xslt-Master is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * 
+ * Xslt-Master is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.  
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with Xslt-Master. If not, see <https://www.gnu.org/licenses/>.
+ * 
+ * func.string.inc
+ * 
+ * Xslt-Master string related functions.
+ *
+ * @author Daniele Bonini <my25mb@aol.com>
+ * @copyrights (c) 2016, 2024 5 Mode
+ */
+
+
+/**
+ * Check if the given word is a contraction 
+ * 
+ * @param string $w the word being checked
+ * @return bool if the word is a contraction, true/false
+ */
+function is_contraction(?string $w): bool 
+{
+  $retval = false;
+  if (!isset($w)) {
+    return $retval;
+  }
+  if ($w === mb_strtoupper($w)) {
+    $retval = true;
+  }
+  return $retval;
+}
+
+/**
+ * Check if the passed word is a given name 
+ * 
+ * @param string $w the word being checked
+ * @return bool if the word is a given name, true/false
+ */
+function is_givenName(?string $w): bool 
+{
+  $retval = false;
+  if (!isset($w)) {
+    return $retval;
+  }
+  if (is_ucfirst($w) && !is_contraction($w)) {
+    $retval = true;
+  }
+  return $retval;
+}
+
+
+/**
+ * Check if the given string start with a capital letter
+ * 
+ * @param string $s the string being checked
+ * @return bool if the string starts with a capital letter , true/false
+ */
+function is_ucfirst(?string $s): bool 
+{
+  $retval = false;
+  if (!isset($s)) {
+    return $retval;
+  }
+  if (ucfirst(mb_substr($s,0,1)) === mb_substr($s,0,1)) {
+    $retval = true;
+  }
+  return $retval;
+}
+
+/**
+ * Check if the letter is a vowel
+ * 
+ * @param char $letter the letter to check
+ * @return bool if the letter is vowel, true/false
+ */
+function is_vowel(string $letter): bool 
+{
+  $vowels = ['a','e','i','o','u'];
+  return in_array($letter, $vowels);
+}
+
+/**
+ * Check if the given url is a valid Facebook page
+ * 
+ * Eg:
+ * http://facebook.com/mrdanielebeta                                   
+ * http://facebook.com/pg/makeiteasyforabird
+ * 
+ * @param string $url the url to check
+ * @return bool if the url is Facebook url, true/false
+ */
+function isFacebookUrl(string $url): bool 
+{
+  $retval=false;
+  $maxLength = 60;
+  if (strlen($url)>60) {
+    return $retval;    
+  }
+  $url= strtolower($url);
+  $pattern1 = "/^http(s)?\:\/\/(www\.)?facebook\.com\/[\w\.]+$/";
+  $pattern2 = "/^http(s)?\:\/\/(www\.)?facebook\.com\/pg\/[\w\.]+$/";
+  if (preg_match($pattern1, $url) || preg_match($pattern2, $url)) {
+    $retval=true;
+  } else {
+    $retval=false;
+  }  
+  return $retval;
+}  
+
+/**
+ * Check if the given url is a valid domain url
+ * 
+ * Eg:
+ * http://danielebonini.com
+  * 
+ * @param string $url the url to check
+ * @return bool if the url is a valid domain url, true/false
+ */
+function isUrl(string $url): bool
+{
+  $retval=false;
+  $maxLength = 45;
+  if (strlen($url)>45) {
+    return $retval;    
+  }
+  $url= strtolower($url);
+  $pattern1 = "/^http(s)?\:\/\/(www\.)?\w+\.\w+$/";
+  $pattern2 = "/^http(s)?\:\/\/(www\.)?\w+\.\w+.\w+$/";
+  if (preg_match($pattern1, $url) || preg_match($pattern2, $url)) {
+    $retval=true;
+  } else {
+    $retval=false;
+  }  
+  return $retval;
+}  
+
+/**
+ * Check if the given url is a valid Youtube page
+ * 
+ * Eg:
+ * http://youtube.com/watch?v=eeerwr24334 
+ * 
+ * @param string $url the url to check
+ * @return bool if the url is Youtube url, true/false
+ */
+function isYoutubeUrl(string $url): bool 
+{
+  $retval=false;
+  $maxLength = 50;
+  if (strlen($url)>50) {
+    return $retval;    
+  }
+  $url= strtolower($url);
+  $pattern1 = "/^http(s)?\:\/\/(www\.)?youtube\.com\/watch\?v\=[\w]+$/";
+  if (preg_match($pattern1, $url)) {
+    $retval=true;
+  } else {
+    $retval=false;
+  }  
+  return $retval;
+}  
+
+/**
+ * Test if a word is of a latin language
+ * 
+ * @param string  $word the string to test
+ * @return bool  if $word is of a latin language, true/false
+ */
+function isLatinLang(string $word): bool 
+{
+  
+  //$char = mb_substr($word, 0, 1);
+  //return !preg_match("/[\x{31C0}-\x{31EF}\x{3300}-\x{33FF}\x{3400}-\x{4DBF}\x{4E00}-\x{9FFF}\x{F900}-\x{FAFF}\x{FE30}-\x{FE4F}]{1}/u", $char);
+  
+  $isNonLatinLang = preg_match("/^[\w-]+[\x{31C0}-\x{31EF}\x{3300}-\x{33FF}\x{3400}-\x{4DBF}\x{4E00}-\x{9FFF}\x{F900}-\x{FAFF}\x{FE30}-\x{FE4F}]+$/u", $word) ||
+                    preg_match("/^[\x{31C0}-\x{31EF}\x{3300}-\x{33FF}\x{3400}-\x{4DBF}\x{4E00}-\x{9FFF}\x{F900}-\x{FAFF}\x{FE30}-\x{FE4F}]+$/u", $word) ||
+                    preg_match("/^[\x{31C0}-\x{31EF}\x{3300}-\x{33FF}\x{3400}-\x{4DBF}\x{4E00}-\x{9FFF}\x{F900}-\x{FAFF}\x{FE30}-\x{FE4F}]+[\w-]+$/u", $word) ||
+                    preg_match("/^[\w-]+[\x{31C0}-\x{31EF}\x{3300}-\x{33FF}\x{3400}-\x{4DBF}\x{4E00}-\x{9FFF}\x{F900}-\x{FAFF}\x{FE30}-\x{FE4F}]+[\w-]+$/u", $word);
+  
+  return !$isNonLatinLang;
+}
+
+/*
+ * Check if the given string is specified in json format
+ * 
+ * @param string  $s the string being checked 
+ * @return bool  if $s is in json format, true/false 
+ */
+function is_json(string $s): bool 
+{
+  if (left($s,1)==="{" && right($s,1)==="}" && stripos($s,":")!==false) {
+    return true;    
+  } else {
+    return false;
+  }
+}
+
+/*
+ * Check if the given string is specified in json format
+ * 
+ * @param string  $s the string being checked 
+ * @return bool  if $s is in json format, true/false 
+ */
+function is_listformat(string $s): bool
+{
+  $val = $s;
+  $val = str_replace("'","\'", $val);
+  $val = str_replace('"',"\"", $val);
+  $cmd = "return is_array(".$val.");";
+  $ret = eval($cmd);
+  return $ret;    
+}
+
+
+function json_decode_from_db(string $json, bool $assoc = false) 
+{
+  $temp = $json;
+  $temp = str_replace('\"', '"', $temp);
+  $temp = str_replace("\'", "'", $temp);
+  $temp = str_replace("\\\\", "\\", $temp);
+  
+  return json_decode($temp, $assoc);
+}
+
+/**
+ * Left cut the given substring for the specified length 
+ * 
+ * @param string $string the string being cut on the left
+ * @param int $length the length of the substring to return
+ * @return string the resulting substring    
+ */
+function left(?string $string, int $length): string 
+{
+  if (!isset($string) || $string === PHP_STR) {
+    return PHP_STR;
+  }
+  return mb_substr($string, 0, $length);
+}
+
+/**
+ * Right cut the given string for the specified length 
+ * 
+ * @param string $string the string being cut on the right
+ * @param int $length the length of the substring to return
+ * @return string the resulting substring    
+ */
+function right(?string $string, int $length): string 
+{
+  if (!isset($string) || $string === PHP_STR) {
+    return PHP_STR;
+  }  
+  return mb_substr($string, mb_strlen($string) - $length);
+}
+
+/**
+ * Get the left word of the given sentence 
+ * 
+ * @param string $phrase  the sentence being processed
+ * @return string the first word    
+ */
+function leftWord(?string $phrase): string 
+{
+  if (isset1($phrase, PHP_STR)===PHP_STR) {
+    return PHP_STR;
+  }  
+
+  $aWords = explode(PHP_SPACE, $phrase);
+  return $aWords[0]; 
+}
+
+/**
+ * Get the right word of the given sentence 
+ * 
+ * @param string $phrase  the sentence being processed
+ * @return string the last word    
+ */
+function rightWord(?string $phrase): string 
+{
+  if (isset1($phrase, PHP_STR)===PHP_STR) {
+    return PHP_STR;
+  }  
+
+  $aWords = explode(PHP_SPACE, $phrase);
+  return $aWords[count($aWords)-1];
+}
+
+
+/**
+ * Return the number of words of the given phrase
+ * 
+ * @param string $phrase
+ * @return int the number of words of the phrase
+ */
+function mb_str_word_count(string $phrase): int 
+{
+  $aWords = explode(PHP_SPACE, $phrase);
+  return count($aWords);
+}
+
+/**
+ * Finds the position of first occurrence of a string within another, 
+ * result safe (excluding 0), case insensitive
+ * 
+ * @param string $string the string being searched
+ * @param string $needle the string searched
+ * @param int $offset the position in string to start the search 
+ * @return mixed the position of the needle or False
+ */
+function mb_stripos1(string $string, string $needle, int $offset = 0) 
+{
+  return mb_stripos(PHP_TILDE . $string, $needle, $offset);
+}  
+
+/**
+ * Normalize the case of the given text 
+ * 
+ * @param string $text text to case normalize
+ * @return string the normalized text
+ */
+function str_case_normalize(?string $text): string 
+{
+  $retval = $text;
+  
+  if (!isset($text) || $text === PHP_STR) {
+    return $retval;
+  }
+  
+  $aWords = explode(PHP_SPACE, $text);
+  
+  foreach($aWords as & $word) {
+    if (strtoupper(substr($word,0,1)) === substr($word,0,1)) {
+      $word = ucfirst(strtolower($word));
+    } else {  
+      $word = strtolower($word);
+    }  
+  }
+    
+  $retval = implode(" ", $aWords);
+  
+  return $retval;
+}  
+
+/**
+ * Clean a phase removing repeated spaces and trimming it  
+ * 
+ * @param string $string the string being cleaned
+ * @return string the cleaned string
+ */
+function str_cleanphrase(string $string): string 
+{
+  //return trim(str_replace("  ", PHP_SPACE, str_replace("  ", PHP_SPACE, $string)));
+  
+  //hypen
+  $retval = str_replace(" -", PHP_HYPHEN, $string);
+  $retval = str_replace("- ", PHP_HYPHEN, $retval);
+  $retval = ltrim($retval, PHP_HYPHEN);
+  $retval = rtrim($retval, PHP_HYPHEN);
+  //space
+  $retval = trim(str_replace("  ", PHP_SPACE, str_replace("  ", PHP_SPACE, $retval)));
+  
+  return $retval;
+}  
+
+/**
+ * Clean a phase removing repeated spaces and trimming it  
+ * 
+ * @param string $string the string being cleaned
+ * @return string the cleaned string
+ */
+function str_cleanphrase_M(string $string): string 
+{
+  //return trim(str_replace("  ", PHP_SPACE, str_replace("  ", PHP_SPACE, $string)));
+  
+  //hypen
+  $retval = str_replace(" -", PHP_HYPHEN, $string);
+  $retval = str_replace("- ", PHP_HYPHEN, $retval);
+  $retval = ltrim($retval, PHP_HYPHEN);
+  $retval = rtrim($retval, PHP_HYPHEN);
+  //axterix
+  //$retval = trim(str_replace("**", "*", str_replace("**", "*", $retval)));
+  $retval = str_replace("*", PHP_SPACE, $retval);
+  //space
+  $retval = trim(str_replace("  ", PHP_SPACE, str_replace("  ", PHP_SPACE, $retval)));
+  
+  return $retval;
+}  
+
+/**
+ * Clean a phase removing the plurals  
+ * 
+ * @param string $string the string being cleaned
+ * @return string the cleaned string
+ */
+function str_cleanplurals(string $string): string 
+{
+  $aWords = explode(PHP_SPACE, $string);
+  
+  foreach($aWords as &$word) {
+    if (right($word,3)==="ies") {
+      $word = left($word, strlen($word)-3) . "y";
+    }  
+    if (right($word,3)==="hes" || right($word,3)==="xes") {
+      $word = left($word, strlen($word)-2);
+    }  
+    if (right($word,2)==="es") {
+      $word = left($word, strlen($word)-2) . "e";
+    }  
+    if (right($word,2)!=="ss" && right($word,1)==="s") {
+      $word = left($word, strlen($word)-1);
+    }  
+  }
+  
+  return implode(PHP_SPACE, $aWords);
+}  
+
+/**
+ * Break the given phrase by a word separator
+ * 
+ * @param string $phrase the phrase being broken
+ * @param string $word_separetor the word at which beginning break the phrase
+ * @param string $retFirstPart the resulting broken first part of the phrase 
+ * @param string $retReminder the remaining part of the phrase
+ * @return void
+ */
+function str_phrasebrk(string $phrase, string $word_separetor, & $retFirstPart, & $retRemainder = null): void 
+{
+  $phrase = PHP_SPACE . $phrase . PHP_SPACE;
+  $i = mb_stripos1($phrase, PHP_SPACE . $word_separetor . PHP_SPACE);
+  if ($i) {
+    $retFirstPart = trim(mb_substr($phrase, 0, $i));
+    if (isset($retRemainder)) {
+      $retRemainder = trim(mb_substr($phrase, $i));
+    }
+  } else {  
+    $retFirstPart = trim($phrase);
+    if (isset($retRemainder)) {
+      $retRemainder = PHP_STR;
+    }     
+  }
+}
+
+/**
+ * Return the given needle only if not already present in string
+ * 
+ * @param string $string
+ * @param string $needle
+ * @return string
+ */
+function str_place(string $string, string $needle): string  
+{
+   if (mb_stripos(PHP_TILDE . $string, $needle)) {
+     return PHP_STR;
+   } else {
+     return $needle;
+   }
+}
+
+/**
+ * Replace a pattern in the given string
+ * 
+ * @param string $needle the pattern searched for
+ * @param string $replace the replacement
+ * @param string $string the string being searched
+ * @param int $replacements the number of replacements to perform
+ * @return string the replaced string
+ */
+function str_replace1(string $needle, string $replace, ?string $string, int $replacements = 1): string 
+{
+  if (!isset($string) || $replacements === 0) {
+    return $string;
+  }
+  
+  if ($replacements < 0 ) {
+    $string = implode(PHP_SPACE, array_reverse(explode(PHP_SPACE, $string)));
+    $replace = implode(PHP_SPACE, array_reverse(explode(PHP_SPACE, $replace)));
+    $string = preg_replace("/$needle/i", $replace, $string, abs($replacements));
+    $string = implode(PHP_SPACE, array_reverse(explode(PHP_SPACE, $string)));
+  } else {
+    $string = preg_replace("/$needle/i", $replace, $string, abs($replacements));
+  }
+  
+  return $string;
+}
+
+/**
+ * Reverse the words in the given phrase
+ * 
+ * @param string $string the string being reversed
+ * @return string the resulting reversed string
+ */
+function str_phrase_reverse(string $string): string 
+{
+  settype($aWords, "array");
+  $aWords = explode(PHP_SPACE, $string);
+  $aWords = array_reverse($aWords);
+  return implode(PHP_SPACE, $aWords);
+}
+
+/**
+ * Finds the position of the first occurance of a word 
+ * in the given string, result safe (excluding 0), case insensitive
+ * 
+ * @param string $phrase the phrase being searched
+ * @param string $word the searched word
+ * @param int $offset the position in string to start the search 
+ * @return mixed the position of the searched word, otherwise false 
+ */
+function str_wordipos(string $phrase, string $word, int $offset = 0) 
+{
+  if ($offset<0) {
+    $offset=0;
+  }
+  $word = strtolower($word);
+  $phrase = strtolower($phrase);
+  $aWords = explode(" ", $phrase);
+  $max = count($aWords) - 1;
+  $i = $offset; 
+  while ($i <= $max) {
+    $word2 = $aWords[$i];
+    if ($word === $word2) {
+      return $i + 1;
+    }
+    $i++;
+  }
+  return false;
+}
+
+/**
+ * Remove duplicate words from a phrase
+ * 
+ * @param string $phrase the string being processed
+ * @param bool $removeRightMost if remove the right-most duplicates, true/false
+ * @return string the resulting string
+ */
+function str_word_unique(string $phrase, bool $removeRightMost = true) 
+{
+  settype($aWords, "array");
+  $aWords = explode(PHP_SPACE, $phrase);
+  if ($removeRightMost) {
+    // Remove right-most duplicates from the given string..
+    $aWords = array_unique($aWords);
+  } else {
+    // Remove left-most duplicates from the given string..
+    $aWords = array_reverse($aWords);
+    $aWords = array_unique($aWords);
+    $aWords = array_reverse($aWords);
+  }  
+  return implode(PHP_SPACE, $aWords);
+}  
+
+/**
+ * Short words by the given char limit
+ * 
+ * @param string $phrase the phrase being parsed 
+ * @param int $wordLength the word limit to set
+ * @return string  the resulting phrase
+ */
+function str_word_length(string $phrase, int $wordLength): string 
+{
+  $aWords = explode(PHP_SPACE, $phrase);
+  foreach($aWords as & $word) {
+    $word = mb_substr($word, 0, $wordLength);
+  }
+  return implode(PHP_SPACE, $aWords);
+}
+
+/**
+ * Right trim a word from the given string
+ * 
+ * @param string $phrase the string being trimmed
+ * @param array $aWords the words to remove
+ * @return string the resulting right trimmed phrase 
+ */
+function rtrim_word(string $phrase, array $aWords): string 
+{
+  $retval = PHP_SPACE . $phrase . PHP_SPACE;
+  
+  foreach ($aWords as $word) {
+    if (right($retval, mb_strlen($word) + 2) === (PHP_SPACE . $word . PHP_SPACE)) {
+      $retval = left($retval, mb_strlen($retval) - (mb_strlen($word) + 1));
+    }  
+  }  
+  
+  return str_cleanphrase($retval);
+}
+
+/*
+ * Convert a string in json format to a list
+ * 
+ * @param string $json the string being converted
+ * @return string the resulting list
+ */
+function jsontolist($json) {
+  
+  $ret = $json;
+  if (left($ret,1) === "{" && right($ret,1) === "}") {
+    $ret = str_replace("{", "[", $ret);    
+    $ret = str_replace("}", "]", $ret);
+    $ret = str_replace(":", "=>", $ret);
+  }
+  return $ret;
+  
+}
+
+/**
+ * Trim a word from the given string
+ * 
+ * @param string $phrase the string being trimmed
+ * @param array $aWords the words to remove
+ * @return string the resulting trimmed phrase 
+ */
+function trim_word(string $phrase, array $aWords) {
+
+  $retval = PHP_SPACE . $phrase . PHP_SPACE;
+  
+  foreach ($aWords as $word) {
+    $retval = str_ireplace(PHP_SPACE . $word . PHP_SPACE, PHP_SPACE, $retval);
+  }  
+  
+  return str_cleanphrase($retval);
+}

+ 273 - 0
Private/functions/func.various.inc

@@ -0,0 +1,273 @@
+<?PHP
+/**
+ * Copyright 2021, 2024 5 Mode
+ *
+ * This file is part of Xslt-Master.
+ * 
+ * Xslt-Master is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * 
+ * Xslt-Master is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.  
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with Xslt-Master. If not, see <https://www.gnu.org/licenses/>.
+ *
+ * func.various.inc
+ * 
+ * Xslt-Master various useful functions.
+ *
+ * @author Daniele Bonini <my25mb@aol.com>
+ * @copyrights (c) 2016, 2024, 5 Mode
+ */
+
+if (!function_exists("enableEmoticons")) { 
+/**
+ * Enable the emoticons of the given text
+ * 
+ * @param string $text the text being parsed for emoticons
+ * @return the text with enabled emoticons
+ */
+function enableEmoticons(string $text): string
+{ 
+  global $EMOTICONS;
+  
+  if ($EMOTICONS) {
+    return str_ireplace(array_keys($EMOTICONS),array_values($EMOTICONS), $text);
+  }  
+}  
+}
+
+if (!function_exists("getResource0")) { 
+/**
+ * Get a resource translated 
+ * 
+ * @param string $resource the string to get translated
+ * @param string $destLocale the destination locale
+ * @param string $localeKey the locale key
+ * @return string the translated resource    
+ */  
+function getResource0(string $resource, string $destLocale = "en-US", string $localeKey = "/".SCRIPT_FILENAME): string
+{
+  
+  global $LOCALE;
+  
+  if ($destLocale === "en-US") {
+    return $resource; 
+  }    
+
+  if (($LOCALE[$destLocale][$localeKey]['ping']??PHP_STR)==PHP_STR) {
+    return $resource; 
+  }    
+
+  if (($LOCALE[$destLocale][$localeKey][$resource]??PHP_STR)==PHP_STR) {
+    return $resource; 
+  }    
+  
+  return $LOCALE[$destLocale][$localeKey][$resource];
+}
+}
+
+
+/**
+ * Replacement for echo with debug checking
+ * 
+ * @param boolean $debug_var a debug value, if true the echo will be executed 
+ * @param list $args a variable argument list
+ * @return void
+ */
+function echo_ifdebug($debug_var, ...$args) {
+  if (!DEBUG || !$debug_var) {
+    return;
+  }
+  foreach($args as $arg) {
+    echo $arg;
+  }
+}
+
+/**
+ * Get an integer result for a division
+ * 
+ * @param mixed $a first operand
+ * @param mixed $b second operand
+ * @return int the integer result
+ */
+function intdiv_1($a, $b) {
+  return ($a - $a % $b) / $b;
+}
+
+/**
+ * Check if the number is odd
+ * 
+ * @param mixed $a first operand
+ * @return bool if the number is odd, true/false
+ */
+function is_odd($a) {
+  return ($a % 2) > 0;
+}
+
+/**
+ * Check if the number is pair
+ * 
+ * @param mixed $a first operand
+ * @return bool if the number is pair, true/false
+ */
+function is_pair($a) {
+  return ($a % 2) === 0;
+}
+
+/**
+ * Check if a variable is set with a default return
+ * 
+ * @param mixed $var the variable to check
+ * @param mixed $default the default value
+ * @return mixed the return value
+ */
+function isset1(&$var, $default=false) {
+  if (isset($var)) {
+    return $var;
+  } else {
+    return $default;
+  }
+}
+
+
+if (!function_exists("fixMultipleFileUpload")) { 
+/**
+ * Fix multiple file uploaded array ($_FILE)
+ * 
+ * @param array $f the $_FILE array
+ * @return array the array fixed
+ */
+function fixMultipleFileUpload(&$f): array
+{
+    $files = array();
+    $count = count($f['name']);
+    $keys = array_keys($f);
+   
+    for($i=0;$i<$count;$i++)
+    {
+        foreach($keys as $key)
+        {
+            $files[$i][$key] = $f[$key][$i];
+        }
+    }
+    return $files;
+}
+}
+
+
+/**
+ * Replacement for var_dump with debug checking
+ * 
+ * @param boolean $debug_var a debug value, if true the var_dump will be executed 
+ * @param list $args a variable argument list
+ * @return void
+ */
+function var_dump_ifdebug($debug_var, ...$args) {
+  if (!DEBUG || !$debug_var) {
+    return;
+  }
+  foreach($args as $arg) {
+    var_dump($arg);
+  }
+}
+
+
+if (!function_exists("enableLinks")) { 
+/**
+ * Enable the links of the given text
+ * 
+ * @param string $text the text being parsed for links
+ * @return the text with enabled links
+ */
+function enableLinks(string $text): string
+{
+  //return preg_replace("/(https?:\/\/)([\da-z\.-]+)\.([a-z\.]{2,8})(\/?.+)?/", "<a href='\\0' target=\"_blank\">\\0</a>", $text);
+  return preg_replace("/(https?:\/\/)([\da-z\.-]+)\.([a-z\.]{2,8})(\/?[\da-zA-Z\.\-\_\?\/\&\#\=]+)?/i", "<a href='\\0' target=\"_blank\">\\0</a>", $text);
+}  
+}
+
+if (!function_exists("HTMLencode")) { 
+/**
+ * Encode any HTML of a given string
+ * 
+ * @param string $s the string to encode
+ * @param bool $withBR keep the BR tag, true/false
+ * @return string the string encoded
+ */
+function HTMLencode(?string $s, bool $withBR = false): string 
+{
+    
+  if (!isset($s)) {
+    return PHP_STR;
+  }
+    
+  $s = str_ireplace("&#39;", "'", $s); 
+  $s = str_ireplace("&#34;", "\"", $s);
+  $s = str_ireplace("\\n", "", $s);
+
+  $s = htmlspecialchars($s, ENT_QUOTES |ENT_IGNORE | ENT_HTML5, "UTF-8");
+  
+  if ($withBR) {
+    $s = str_ireplace(chr(10), PHP_BR, $s);
+  }  
+    
+  $s = enableLinks($s);
+  
+  return $s;
+} 
+}
+
+if (!function_exists("HTMLencode2")) { 
+/**
+ * Encode any HTML of a given string
+ * 
+ * @param string $s the string to encode
+ * @param bool $withBR keep the BR tag, true/false
+ * @return string the string encoded
+ */
+function HTMLencode2(?string $s, bool $withBR = false, bool $genLink = false): string 
+{
+    
+  if (!isset($s)) {
+    return PHP_STR;
+  }
+    
+  $s = str_ireplace("&#39;", "'", $s); 
+  $s = str_ireplace("&#34;", "\"", $s);
+  $s = str_ireplace("\\n", "", $s);
+
+  $s = htmlspecialchars($s, ENT_QUOTES |ENT_IGNORE | ENT_HTML5, "UTF-8");
+  
+  if ($withBR) {
+    $s = str_ireplace(chr(10), PHP_BR, $s);
+  }  
+  
+  if ($genLink) {
+    $s = enableLinks($s);
+  }  
+  
+  return $s;
+} 
+}
+
+if (!function_exists("getShortLang")) { 
+/**
+ * Get a the short of the language code 
+ * 
+ * @param string $lang the language code to short
+ * @return string the short lang  
+ */  
+function getShortLang($lang) {
+  if ($lang == PHP_CN) {
+    return "cn";
+  } else { 
+    return left($lang, 2);
+  }
+}
+}

+ 0 - 0
Private/log/empty


+ 151 - 0
Private/scripts/home.php

@@ -0,0 +1,151 @@
+<?php
+
+/**
+ * Copyright 2021, 2024 5 Mode
+ *
+ * This file is part of Xslt-Master.
+ *
+ * Xslt-Master is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Xslt-Master is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.  
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with Xslt-Master. If not, see <https://www.gnu.org/licenses/>.
+ *
+ * fileName.php
+ * 
+ * Xslt-Master description of the file.
+ *
+ * @author Daniele Bonini <my25mb@aol.com>
+ * @copyrights (c) 2016, 2024 5 Mode
+ */
+
+?>
+
+<!DOCTYPE html>
+<html lang="en-US" xmlns="http://www.w3.org/1999/xhtml">
+<head>
+
+  <meta name="viewport" content="width=device-width, initial-scale=1"/>
+   
+<!--<?PHP echo(APP_LICENSE);?>-->  
+  
+  <title><?PHP echo(APP_TITLE);?></title>
+
+  <link rel="shortcut icon" href="/favicon.ico" />
+
+  <meta name="description" content="Welcome to Xslt-Master!"/>
+  <meta name="keywords" content="Xslt-Master,xsl,generator,on,premise,solution"/>
+  <meta name="robots" content="index,follow"/>
+  <meta name="author" content="5 Mode"/>
+  
+  <script src="/js/jquery-3.6.0.min.js" type="text/javascript"></script>
+  <script src="/js/common.js" type="text/javascript"></script>  
+  <script src="/js/home.js?r=<?PHP echo(time());?>" type="text/javascript"></script>  
+    
+  <link href="/css/style.css?r=<?PHP echo(time());?>" type="text/css" rel="stylesheet">
+  
+</head>
+  
+<body>
+
+ <div id="content">
+  
+     <br><br>
+      Welcome!
+      <br><br>
+          This time we would like to load dynamically in data coming from multiple data source of type xml/xls.<br><br>
+          We would like to create a good skeleton to automatize the update of portals and websites.
+      <br><br><br><br>
+        
+      <div id="cont-singers">
+          <span class="list-title">Singers:</span><br><br>
+          <div id="singers">&nbsp;</div>
+      </div>    
+  
+      <div id="cont-songs">
+          <span class="list-title">Songs:</span><br><br>
+          <div id="songs">&nbsp;</div>
+      </div>    
+     
+      <br><br><br><br>     <br><br><br><br>     <br><br><br><br>     <br><br><br><br>     <br><br><br><br>             
+              
+              
+     <div style"clear:both;margin:auto;height:230px;">         
+     <br><br><br><br>
+           
+      We are the bad tech guys behind 5 Mode.
+      <br><br><br><br>       
+       
+       Feedback: <a href="mailto:posta@elettronica.lol">posta@elettronica.lol</a>
+
+     </div>         
+                       
+ </div> 
+
+ <div id="resources">
+     
+       <br><br>
+           
+       <div id="cont-files">
+          <span class="list-title">Files (in /Private/data):</span><br><br>
+          <div id="files">
+               <div><a href="/donwload/Linkin-Park-songs.xml">Linkin-Park-songs.xml</a></div>
+               <div><a href="/donwload/Linkin-Park-songs.xsl">Linkin-Park-songs.xsl</a></div>
+               <div><a href="/donwload/Tina-Turner-songs.xml">Tina-Turner-songs.xml</a></div>
+               <div><a href="/donwload/Tina-Turner-songs.xml">Tina-Turner-songs.xsl</a></div>
+               <div><a href="/donwload/singers.xml">singers.xml</a></div>
+               <div><a href="/donwload/singers.xml">singers.xsl</a></div>
+          </div>
+       </div> 
+       
+<div id="cont-code">
+<span class="list-title">Code:</span><br><br>
+<div id="cont-precode">
+<pre id="code">
+
+function loadXML(divName, resName) {
+  const xsltProcessor = new XSLTProcessor();
+  // Load the xsl file
+  //alert(resName);
+  myXMLHTTPRequest = new XMLHttpRequest();
+  myXMLHTTPRequest.open("GET", "/xsl?d="+resName, false);
+  myXMLHTTPRequest.send(null);
+  const xslRef = myXMLHTTPRequest.responseXML;
+  xsltProcessor.importStylesheet(xslRef);
+  // Load the XML file
+  myXMLHTTPRequest = new XMLHttpRequest();
+  myXMLHTTPRequest.open("GET", "/xml?d="+resName, false);
+  myXMLHTTPRequest.send(null);
+  xmlDoc = myXMLHTTPRequest.responseXML;
+  const fragment = xsltProcessor.transformToFragment(xmlDoc, document);
+  myDOM = fragment;
+  $("#"+divName).html(fragment);
+}
+</pre>    
+</div>
+</div>
+           
+ </div> 
+  
+<div id="footerCont">&nbsp;</div>
+<div id="footer">
+       <span style="background:#FFFFFF; opacity:0.7;">&nbsp;&nbsp; <a href="dd.html" class="aaa">Disclaimers</a>. A <a href="http://5mode.com" class="aaa">5 Mode</a> project and <a href="http://demo.5mode.com" class="aaa">WYSIWYG</a> system. Some rights reserved.</span>
+</div>  
+
+<script>
+  
+  window.addEventListener("load", function(){
+    loadXML("singers", "singers");
+  });
+  
+</script>  
+ 
+</body>
+</html>

+ 47 - 0
Private/scripts/xml.php

@@ -0,0 +1,47 @@
+<?PHP
+/**
+ * Copyright 2021, 2024 5 Mode
+ *
+ * This file is part of Xslt-Master.
+ *
+ * Xslt-Master is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Xslt-Master is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.  
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with Xslt-Master. If not, see <https://www.gnu.org/licenses/>.
+ *
+ * html.php
+ * 
+ * Xslt-Master html rotviler.
+ *
+ * @author Daniele Bonini <my25mb@aol.com>
+ * @copyrights (c) 2016, 2024 5 Mode
+ */
+
+header("Content-type: text/xml");
+
+$dataName = filter_input(INPUT_GET, "d")??"";
+$dataName = strip_tags($dataName);
+
+//switch ($dataName) {
+//  case "singers":
+//    $XMLfilename = "singers.xml";
+//   break;
+//}
+
+$XMLfilename = $dataName.".xml";
+
+chdir(APP_DATA_PATH);
+
+echo(file_get_contents($XMLfilename));
+
+
+
+  

+ 47 - 0
Private/scripts/xsl.php

@@ -0,0 +1,47 @@
+<?PHP
+/**
+ * Copyright 2021, 2024 5 Mode
+ *
+ * This file is part of Xslt-Master.
+ *
+ * Xslt-Master is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Xslt-Master is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.  
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with Xslt-Master. If not, see <https://www.gnu.org/licenses/>.
+ *
+ * html.php
+ * 
+ * Xslt-Master html rotviler.
+ *
+ * @author Daniele Bonini <my25mb@aol.com>
+ * @copyrights (c) 2016, 2024 5 Mode
+ */
+
+header("Content-type: text/xsl");
+
+$dataName = filter_input(INPUT_GET, "d")??"";
+$dataName = strip_tags($dataName);
+
+//switch ($dataName) {
+//  case "singers":
+//    $XSLfilename = "singers.xsl";
+//    break;
+//}
+
+$XSLfilename = $dataName.".xsl";
+
+chdir(APP_DATA_PATH);
+
+echo(file_get_contents($XSLfilename));
+
+
+
+  

+ 0 - 0
Private/scripts_ajax/empty


+ 25 - 0
Private/templates/Licenses/license-GPL3.txt

@@ -0,0 +1,25 @@
+/**
+ * Copyright 2021, 2024 5 Mode
+ *
+ * This file is part of Xslt-Master.
+ *
+ * Xslt-Master is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Xslt-Master is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.  
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with Xslt-Master. If not, see <https://www.gnu.org/licenses/>.
+ *
+ * fileName.php
+ * 
+ * Xslt-Master description of the file.
+ *
+ * @author Daniele Bonini <my25mb@aol.com>
+ * @copyrights (c) 2016, 2024 5 Mode
+ */

+ 0 - 0
Private/upload/empty


+ 151 - 0
Public/css/style.css

@@ -0,0 +1,151 @@
+/**
+ * Copyright 2021, 2024 5 Mode
+ *
+ * This file is part of Xslt-Master.
+ *
+ * Xslt-Master is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Xslt-Master is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.  
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with Xslt-Master. If not, see <https://www.gnu.org/licenses/>.
+ *
+ * style.css
+ * 
+ * Xslt-Master CSS stylesheet.
+ *
+ * @author Daniele Bonini <my25mb@aol.com>
+ * @copyrights (c) 2016, 2024 5 Mode
+ */
+
+#footerCont {
+  position: fixed; 
+  top: 2000px; 
+  left:-10px;
+  width: 102%; 
+  border: 1px solid #C2DBF2; 
+  padding: 7px; 
+  background: white; 
+  opacity: 0.3;
+  color:white; 
+  font-family: Arial,Sans,Vardana;
+  font-size: 12px; 
+  text-align: center; 
+  z-index: 99998;
+}
+#footer {
+  position: fixed;
+  float: right;
+  top: 2000px; 
+  left:-10px;
+  width: 100%; 
+  border: 0px solid #C2DBF2; 
+  padding: 7px; 
+  opacity: 1.0;
+  color:black; 
+  font-family: Arial,Sans,Vardana;
+  font-size: 12px; 
+  font-weight: 400;
+  text-align: right; 
+  z-index: 99999;
+}
+#cont-singers {
+  float:left;
+  width: 252px;
+  height: 380px;
+}  
+#content {
+  float:left;
+  width:49%;
+  min-height:1000px;
+  height:100%;
+  min-width:700px;
+  padding-left:2%;
+  margin-left:1%;
+  white-space: normal;
+  background: lightgray;
+}
+#cont-files {
+  float:left;
+  margin-left:80px;
+  width: 252px;
+  height: 280px;
+}  
+#files {
+  width: 250px;
+  height: 250px;
+  border: 2px solid gray;
+  background: transparent;
+}
+#resources {
+  float:left;
+  width:46%;
+  min-height:1000px;
+  height:100%;
+  margin-right:1%;
+  background: lightgoldenrodyellow;
+  border-left: 1px solid darkgray;
+  height: max-content;  
+}
+#singers {
+  width: 250px;
+  height: 350px;
+  border: 2px solid gray;
+  background: white;
+}
+#cont-songs {
+  float:left;
+  margin-left:80px;
+  width: 252px;
+  height: 380px;
+}  
+.list-title {
+  font-weight: 900;
+}
+#songs {
+  width: 250px;
+  height: 350px;
+  border: 2px solid gray;
+  background: white;
+}
+#cont-code {
+  position:relative;
+  margin-top:50px;
+  clear:both;
+  float:left;
+  margin-left:80px;
+  width: 550px;
+  height: 380px;
+}
+#cont-precode {
+  overflow-x: auto;
+  overflow-y: auto;
+}
+#code {
+  width: 480px;
+  height: 350px;
+  border: 2px solid gray;
+  background: white;
+  padding:12px;  
+  white-space: pre-wrap; 
+}
+
+.ve-singer-list {
+  height: 26px;
+  border: 1px solid gray;
+  padding: 6px;
+  padding-top: 8px;
+}
+.ve-song-list {
+  height: 26px;
+  border: 1px solid gray;
+  padding: 6px;
+  padding-top: 8px;
+}
+

+ 80 - 0
Public/dd.html

@@ -0,0 +1,80 @@
+<html>
+<head>
+  
+  <title>5 Mode: Data Disclaimer</title>
+
+  <style>
+    body {
+      background-color: lightgray;
+      margin: 0 0 0 0;
+      font-family: Monospace, Verdana, Serif;
+      font-variant-caps: titling-caps;
+    }
+    a {
+      color: orange;
+      text-decoration: transparent;
+    }
+    a:active {
+      color: orange;
+      text-decoration: transparent;
+    }
+    a:visited {
+      color: orange;
+      text-decoration: transparent;
+    }
+    a:hover {
+      color: orange;
+      text-decoration: transparent;
+    }
+    .desc {
+      color:black;
+      font-size: 1.3vw;
+      position:relative;
+      top:-3vw;
+    }
+    .hop {
+      background-color:#f6f6f6;
+      font-size:5vw;
+      /*font-family: 'Press Start 2P', cursive;*/
+      width: 100%;
+      height: 20%;
+      text-align:center;
+      cursor: pointer;
+    }
+  </style>
+  
+</head>
+
+<body>
+  
+<div class="hop "style="display:table;width:80%;height:100%;clear:both;margin:auto;">
+  <br>  
+  <span style="color:darkgray;">5 Mode: Data Disclaimer</span><br><br>
+  <p class="desc" style="padding:30px;">
+  We go to extraodinary efforts here in 5 Mode to ensure that the data within our website pages is accurate and up-to-date.<br><br>
+
+  We have unique direct touch within our company businesses and development team who provide us with product information starting
+  from before a software announcement through to its launch. Where possible, we verify this information during our review process.
+  Additionally, we love our work so we're always checking and double checking our data, often in combination with user and other
+  contributors feedback.<br><br>
+
+  Even given our herculean efforts we can not guarantee that the information on our website pages is 100% correct.<br><br>
+
+  If a particular information is vital to you, we always recommend asking and testing in a secure developing environment and the
+  best way to start is by visiting the doc of our products, and the doc of the technologies (programming language, webserver, devops,
+  etc.) you are going to use in your places.<br><br>
+
+  If you think that any information of our website is wrong or missing, please contact us <a href="http://5md.io/l/email">here</a>.<br><br>
+
+  Now for the legalese.<br><br>
+
+  5 Mode is not responsible for any errors or omissions, or for the results obtained from the use of the information contained in this website.
+  All information on this site is provided "as is" with no guarantee of completeness, accurancy, timeliness or the results obtained from the use
+  of this information. All the information contained in the linked content is of responsibility of the authors and copyrights holders of that 
+  specific content: we do not assume any responibility for any third-party content linked from this website pages.
+  </p>
+
+</div>
+
+</body>
+</html>

+ 14 - 0
Public/download/Linkin-Park-songs.xml

@@ -0,0 +1,14 @@
+<?xml version="1.0"?>
+
+<CONTENT>
+  <ITEM>
+    <ID>01</ID>
+    <NAME>99 Problems</NAME>
+    <INDEX>1</INDEX>
+  </ITEM>
+  <ITEM>
+    <ID>02</ID>
+    <NAME>Encore</NAME>
+    <INDEX>2</INDEX>
+  </ITEM>
+</CONTENT>

+ 17 - 0
Public/download/Linkin-Park-songs.xsl

@@ -0,0 +1,17 @@
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  xmlns:xlink="http://www.w3.org/1999/xlink"  version="1.0">
+
+<xsl:output method="html"/>
+
+<xsl:template match="CONTENT">
+
+  <xsl:for-each select="ITEM[ID>'00']">
+
+     <xsl:sort select="INDEX" data-type="number" order="ascending"/>
+
+     <div class="ve-song-list"><xsl:value-of select="NAME"/></div>
+
+  </xsl:for-each>
+
+</xsl:template>
+
+</xsl:stylesheet>

+ 14 - 0
Public/download/Tina-Turner-songs.xml

@@ -0,0 +1,14 @@
+<?xml version="1.0"?>
+
+<CONTENT>
+  <ITEM>
+    <ID>01</ID>
+    <NAME>Private Dancer</NAME>
+    <INDEX>1</INDEX>
+  </ITEM>
+  <ITEM>
+    <ID>02</ID>
+    <NAME>The Best</NAME>
+    <INDEX>2</INDEX>
+  </ITEM>
+</CONTENT>

+ 17 - 0
Public/download/Tina-Turner-songs.xsl

@@ -0,0 +1,17 @@
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  xmlns:xlink="http://www.w3.org/1999/xlink"  version="1.0">
+
+<xsl:output method="html"/>
+
+<xsl:template match="CONTENT">
+
+  <xsl:for-each select="ITEM[ID>'00']">
+
+     <xsl:sort select="INDEX" data-type="number" order="ascending"/>
+
+     <div class="ve-song-list"><xsl:value-of select="NAME"/></div>
+
+  </xsl:for-each>
+
+</xsl:template>
+
+</xsl:stylesheet>

+ 16 - 0
Public/download/singers.xml

@@ -0,0 +1,16 @@
+<?xml version="1.0"?>
+
+<!--<?xml-stylesheet type="text/xsl" href="/xsl?d=singers"?>-->
+
+<CONTENT>
+  <ITEM>
+    <ID>01</ID>
+    <NAME>Tina Turner</NAME>
+    <INDEX>1</INDEX>
+  </ITEM>
+  <ITEM>
+    <ID>02</ID>
+    <NAME>Linkin Park</NAME>
+    <INDEX>2</INDEX>
+  </ITEM>
+</CONTENT>

+ 18 - 0
Public/download/singers.xsl

@@ -0,0 +1,18 @@
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  xmlns:xlink="http://www.w3.org/1999/xlink"  version="1.0">
+
+<xsl:output method="html"/>
+
+<xsl:template match="CONTENT">
+
+  <xsl:for-each select="ITEM[ID>'00']">
+
+     <xsl:sort select="INDEX" data-type="number" order="ascending"/>
+
+     <div class="ve-singer-list" onclick="loadXML('songs',this.innerHTML.replaceAll(' ','-')+'-songs')"><xsl:value-of select="NAME"/></div>
+
+
+  </xsl:for-each>
+
+</xsl:template>
+
+</xsl:stylesheet>

+ 80 - 0
Public/index.php

@@ -0,0 +1,80 @@
+<?php
+
+/**
+ * Copyright (c) 2016, 2024, 5 Mode
+ * 
+ * This file is part of Xslt-Master.
+ * 
+ * Xslt-Master is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * 
+ * Xslt-Master is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.  
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with Xslt-Master. If not, see <https://www.gnu.org/licenses/>.
+ *
+ * index.php
+ * 
+ * Xslt-Master index file.
+ *
+ * @author Daniele Bonini <my25mb@aol.com>
+ * @copyrights (c) 2016, 2024, 5 Mode     
+ */
+
+require "../Private/core/init.inc";
+
+
+// FUNCTION AND VARIABLE DECLARATIONS
+$scriptPath = APP_SCRIPT_PATH;
+
+// PARAMETERS VALIDATION
+
+$url = filter_input(INPUT_GET, "url")??"";
+$url = strip_tags($url);
+$url = strtolower(trim(substr($url, 0, 300), "/"));
+
+switch ($url) {
+  case "action":
+
+    $scriptPath = APP_AJAX_PATH;
+    define("SCRIPT_NAME", "action");
+    define("SCRIPT_FILENAME", "action.php");     
+    break;
+
+  case "":
+  case "home":
+  
+    define("SCRIPT_NAME", "home");
+    define("SCRIPT_FILENAME", "home.php");   
+    break;  
+
+  case "xml":
+  
+    define("SCRIPT_NAME", "xml");
+    define("SCRIPT_FILENAME", "xml.php");   
+    break;   
+
+  case "xsl":
+  
+    define("SCRIPT_NAME", "xsl");
+    define("SCRIPT_FILENAME", "xsl.php");   
+    break;   
+  
+  default:
+    
+    $scriptPath = APP_ERROR_PATH;
+    define("SCRIPT_NAME", "err-404");
+    define("SCRIPT_FILENAME", "err-404.php");   
+
+}
+
+if (SCRIPT_NAME==="err-404") {
+  header("HTTP/1.1 404 Not Found");
+}  
+
+require $scriptPath . "/" . SCRIPT_FILENAME;

+ 44 - 0
Public/js/common.js

@@ -0,0 +1,44 @@
+/**
+ * Copyright 2021, 2024 5 Mode
+ *
+ * This file is part of Xslt-Master.
+ *
+ * Xslt-Master is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Xslt-Master is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.  
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with Xslt-Master. If not, see <https://www.gnu.org/licenses/>.
+ *
+ * common.js
+ * 
+ * Xslt-Master common javascript code.
+ *
+ * @author Daniele Bonini <my25mb@aol.com>
+ * @copyrights (c) 2016, 2024 5 Mode
+ */
+
+function loadXML(divName, resName) {
+  const xsltProcessor = new XSLTProcessor();
+  // Load the xsl file
+  //alert(resName);
+  myXMLHTTPRequest = new XMLHttpRequest();
+  myXMLHTTPRequest.open("GET", "/xsl?d="+resName, false);
+  myXMLHTTPRequest.send(null);
+  const xslRef = myXMLHTTPRequest.responseXML;
+  xsltProcessor.importStylesheet(xslRef);
+  // Load the XML file
+  myXMLHTTPRequest = new XMLHttpRequest();
+  myXMLHTTPRequest.open("GET", "/xml?d="+resName, false);
+  myXMLHTTPRequest.send(null);
+  xmlDoc = myXMLHTTPRequest.responseXML;
+  const fragment = xsltProcessor.transformToFragment(xmlDoc, document);
+  myDOM = fragment;
+  $("#"+divName).html(fragment);
+}

+ 39 - 0
Public/js/home.js

@@ -0,0 +1,39 @@
+/**
+ * Copyright 2021, 2024 5 Mode
+ *
+ * This file is part of Xslwiz.
+ *
+ * Xslwiz is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Xslwiz is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.  
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with Xslwiz. If not, see <https://www.gnu.org/licenses/>.
+ *
+ * fileName.php
+ * 
+ * Xslwiz description of the file.
+ *
+ * @author Daniele Bonini <my25mb@aol.com>
+ * @copyrights (c) 2016, 2024 5 Mode
+ */
+
+
+function setFooterPos() {
+  if (document.getElementById("footerCont")) {
+    tollerance = 16;
+    $("#footerCont").css("top", parseInt( window.innerHeight - $("#footerCont").height() - tollerance ) + "px");
+    $("#footer").css("top", parseInt( window.innerHeight - $("#footer").height() - tollerance ) + "px");
+  }
+}
+
+window.addEventListener("load", function(){
+  setTimeout("setFooterPos()",500);
+});
+  

+ 318 - 0
Public/js/htmlencode.js

@@ -0,0 +1,318 @@
+/**
+ * [js-htmlencode]{@link https://github.com/emn178/js-htmlencode}
+ *
+ * @version 0.3.0
+ * @author Chen, Yi-Cyuan [emn178@gmail.com]
+ * @copyright Chen, Yi-Cyuan 2014-2017
+ * @license MIT
+ */
+/*jslint bitwise: true */
+(function () {
+  'use strict';
+
+  var root = typeof window === 'object' ? window : {};
+  var NODE_JS = !root.JS_HTMLENCODE_NO_NODE_JS && typeof process === 'object' && process.versions && process.versions.node;
+  if (NODE_JS) {
+    root = global;
+  }
+  var COMMON_JS = !root.JS_HTMLENCODE_NO_COMMON_JS && typeof module === 'object' && module.exports;
+  var AMD = typeof define === 'function' && define.amd;
+
+  var HTML_ENTITIES = {
+    '&nbsp;' : '\u00A0',
+    '&iexcl;' : '\u00A1',
+    '&cent;' : '\u00A2',
+    '&pound;' : '\u00A3',
+    '&curren;' : '\u00A4',
+    '&yen;' : '\u00A5',
+    '&brvbar;' : '\u00A6',
+    '&sect;' : '\u00A7',
+    '&uml;' : '\u00A8',
+    '&copy;' : '\u00A9',
+    '&ordf;' : '\u00AA',
+    '&laquo;' : '\u00AB',
+    '&not;' : '\u00AC',
+    '&shy;' : '\u00AD',
+    '&reg;' : '\u00AE',
+    '&macr;' : '\u00AF',
+    '&deg;' : '\u00B0',
+    '&plusmn;' : '\u00B1',
+    '&sup2;' : '\u00B2',
+    '&sup3;' : '\u00B3',
+    '&acute;' : '\u00B4',
+    '&micro;' : '\u00B5',
+    '&para;' : '\u00B6',
+    '&middot;' : '\u00B7',
+    '&cedil;' : '\u00B8',
+    '&sup1;' : '\u00B9',
+    '&ordm;' : '\u00BA',
+    '&raquo;' : '\u00BB',
+    '&frac14;' : '\u00BC',
+    '&frac12;' : '\u00BD',
+    '&frac34;' : '\u00BE',
+    '&iquest;' : '\u00BF',
+    '&Agrave;' : '\u00C0',
+    '&Aacute;' : '\u00C1',
+    '&Acirc;' : '\u00C2',
+    '&Atilde;' : '\u00C3',
+    '&Auml;' : '\u00C4',
+    '&Aring;' : '\u00C5',
+    '&AElig;' : '\u00C6',
+    '&Ccedil;' : '\u00C7',
+    '&Egrave;' : '\u00C8',
+    '&Eacute;' : '\u00C9',
+    '&Ecirc;' : '\u00CA',
+    '&Euml;' : '\u00CB',
+    '&Igrave;' : '\u00CC',
+    '&Iacute;' : '\u00CD',
+    '&Icirc;' : '\u00CE',
+    '&Iuml;' : '\u00CF',
+    '&ETH;' : '\u00D0',
+    '&Ntilde;' : '\u00D1',
+    '&Ograve;' : '\u00D2',
+    '&Oacute;' : '\u00D3',
+    '&Ocirc;' : '\u00D4',
+    '&Otilde;' : '\u00D5',
+    '&Ouml;' : '\u00D6',
+    '&times;' : '\u00D7',
+    '&Oslash;' : '\u00D8',
+    '&Ugrave;' : '\u00D9',
+    '&Uacute;' : '\u00DA',
+    '&Ucirc;' : '\u00DB',
+    '&Uuml;' : '\u00DC',
+    '&Yacute;' : '\u00DD',
+    '&THORN;' : '\u00DE',
+    '&szlig;' : '\u00DF',
+    '&agrave;' : '\u00E0',
+    '&aacute;' : '\u00E1',
+    '&acirc;' : '\u00E2',
+    '&atilde;' : '\u00E3',
+    '&auml;' : '\u00E4',
+    '&aring;' : '\u00E5',
+    '&aelig;' : '\u00E6',
+    '&ccedil;' : '\u00E7',
+    '&egrave;' : '\u00E8',
+    '&eacute;' : '\u00E9',
+    '&ecirc;' : '\u00EA',
+    '&euml;' : '\u00EB',
+    '&igrave;' : '\u00EC',
+    '&iacute;' : '\u00ED',
+    '&icirc;' : '\u00EE',
+    '&iuml;' : '\u00EF',
+    '&eth;' : '\u00F0',
+    '&ntilde;' : '\u00F1',
+    '&ograve;' : '\u00F2',
+    '&oacute;' : '\u00F3',
+    '&ocirc;' : '\u00F4',
+    '&otilde;' : '\u00F5',
+    '&ouml;' : '\u00F6',
+    '&divide;' : '\u00F7',
+    '&oslash;' : '\u00F8',
+    '&ugrave;' : '\u00F9',
+    '&uacute;' : '\u00FA',
+    '&ucirc;' : '\u00FB',
+    '&uuml;' : '\u00FC',
+    '&yacute;' : '\u00FD',
+    '&thorn;' : '\u00FE',
+    '&yuml;' : '\u00FF',
+    '&quot;' : '\u0022',
+    '&amp;' : '\u0026',
+    '&lt;' : '\u003C',
+    '&gt;' : '\u003E',
+    '&apos;' : '\u0027',
+    '&OElig;' : '\u0152',
+    '&oelig;' : '\u0153',
+    '&Scaron;' : '\u0160',
+    '&scaron;' : '\u0161',
+    '&Yuml;' : '\u0178',
+    '&circ;' : '\u02C6',
+    '&tilde;' : '\u02DC',
+    '&ensp;' : '\u2002',
+    '&emsp;' : '\u2003',
+    '&thinsp;' : '\u2009',
+    '&zwnj;' : '\u200C',
+    '&zwj;' : '\u200D',
+    '&lrm;' : '\u200E',
+    '&rlm;' : '\u200F',
+    '&ndash;' : '\u2013',
+    '&mdash;' : '\u2014',
+    '&lsquo;' : '\u2018',
+    '&rsquo;' : '\u2019',
+    '&sbquo;' : '\u201A',
+    '&ldquo;' : '\u201C',
+    '&rdquo;' : '\u201D',
+    '&bdquo;' : '\u201E',
+    '&dagger;' : '\u2020',
+    '&Dagger;' : '\u2021',
+    '&permil;' : '\u2030',
+    '&lsaquo;' : '\u2039',
+    '&rsaquo;' : '\u203A',
+    '&euro;' : '\u20AC',
+    '&fnof;' : '\u0192',
+    '&Alpha;' : '\u0391',
+    '&Beta;' : '\u0392',
+    '&Gamma;' : '\u0393',
+    '&Delta;' : '\u0394',
+    '&Epsilon;' : '\u0395',
+    '&Zeta;' : '\u0396',
+    '&Eta;' : '\u0397',
+    '&Theta;' : '\u0398',
+    '&Iota;' : '\u0399',
+    '&Kappa;' : '\u039A',
+    '&Lambda;' : '\u039B',
+    '&Mu;' : '\u039C',
+    '&Nu;' : '\u039D',
+    '&Xi;' : '\u039E',
+    '&Omicron;' : '\u039F',
+    '&Pi;' : '\u03A0',
+    '&Rho;' : '\u03A1',
+    '&Sigma;' : '\u03A3',
+    '&Tau;' : '\u03A4',
+    '&Upsilon;' : '\u03A5',
+    '&Phi;' : '\u03A6',
+    '&Chi;' : '\u03A7',
+    '&Psi;' : '\u03A8',
+    '&Omega;' : '\u03A9',
+    '&alpha;' : '\u03B1',
+    '&beta;' : '\u03B2',
+    '&gamma;' : '\u03B3',
+    '&delta;' : '\u03B4',
+    '&epsilon;' : '\u03B5',
+    '&zeta;' : '\u03B6',
+    '&eta;' : '\u03B7',
+    '&theta;' : '\u03B8',
+    '&iota;' : '\u03B9',
+    '&kappa;' : '\u03BA',
+    '&lambda;' : '\u03BB',
+    '&mu;' : '\u03BC',
+    '&nu;' : '\u03BD',
+    '&xi;' : '\u03BE',
+    '&omicron;' : '\u03BF',
+    '&pi;' : '\u03C0',
+    '&rho;' : '\u03C1',
+    '&sigmaf;' : '\u03C2',
+    '&sigma;' : '\u03C3',
+    '&tau;' : '\u03C4',
+    '&upsilon;' : '\u03C5',
+    '&phi;' : '\u03C6',
+    '&chi;' : '\u03C7',
+    '&psi;' : '\u03C8',
+    '&omega;' : '\u03C9',
+    '&thetasym;' : '\u03D1',
+    '&upsih;' : '\u03D2',
+    '&piv;' : '\u03D6',
+    '&bull;' : '\u2022',
+    '&hellip;' : '\u2026',
+    '&prime;' : '\u2032',
+    '&Prime;' : '\u2033',
+    '&oline;' : '\u203E',
+    '&frasl;' : '\u2044',
+    '&weierp;' : '\u2118',
+    '&image;' : '\u2111',
+    '&real;' : '\u211C',
+    '&trade;' : '\u2122',
+    '&alefsym;' : '\u2135',
+    '&larr;' : '\u2190',
+    '&uarr;' : '\u2191',
+    '&rarr;' : '\u2192',
+    '&darr;' : '\u2193',
+    '&harr;' : '\u2194',
+    '&crarr;' : '\u21B5',
+    '&lArr;' : '\u21D0',
+    '&uArr;' : '\u21D1',
+    '&rArr;' : '\u21D2',
+    '&dArr;' : '\u21D3',
+    '&hArr;' : '\u21D4',
+    '&forall;' : '\u2200',
+    '&part;' : '\u2202',
+    '&exist;' : '\u2203',
+    '&empty;' : '\u2205',
+    '&nabla;' : '\u2207',
+    '&isin;' : '\u2208',
+    '&notin;' : '\u2209',
+    '&ni;' : '\u220B',
+    '&prod;' : '\u220F',
+    '&sum;' : '\u2211',
+    '&minus;' : '\u2212',
+    '&lowast;' : '\u2217',
+    '&radic;' : '\u221A',
+    '&prop;' : '\u221D',
+    '&infin;' : '\u221E',
+    '&ang;' : '\u2220',
+    '&and;' : '\u2227',
+    '&or;' : '\u2228',
+    '&cap;' : '\u2229',
+    '&cup;' : '\u222A',
+    '&int;' : '\u222B',
+    '&there4;' : '\u2234',
+    '&sim;' : '\u223C',
+    '&cong;' : '\u2245',
+    '&asymp;' : '\u2248',
+    '&ne;' : '\u2260',
+    '&equiv;' : '\u2261',
+    '&le;' : '\u2264',
+    '&ge;' : '\u2265',
+    '&sub;' : '\u2282',
+    '&sup;' : '\u2283',
+    '&nsub;' : '\u2284',
+    '&sube;' : '\u2286',
+    '&supe;' : '\u2287',
+    '&oplus;' : '\u2295',
+    '&otimes;' : '\u2297',
+    '&perp;' : '\u22A5',
+    '&sdot;' : '\u22C5',
+    '&lceil;' : '\u2308',
+    '&rceil;' : '\u2309',
+    '&lfloor;' : '\u230A',
+    '&rfloor;' : '\u230B',
+    '&lang;' : '\u2329',
+    '&rang;' : '\u232A',
+    '&loz;' : '\u25CA',
+    '&spades;' : '\u2660',
+    '&clubs;' : '\u2663',
+    '&hearts;' : '\u2665',
+    '&diams;' : '\u2666'
+  };
+
+  var decodeEntity = function (code) {
+    // name type
+    if (code.charAt(1) !== '#') {
+      return HTML_ENTITIES[code] || code;
+    }
+
+    var n, c = code.charAt(2);
+    // hex number
+    if (c === 'x' || c === 'X') {
+      c = code.substring(3, code.length - 1);
+      n = parseInt(c, 16);
+    } else {
+      c = code.substring(2, code.length - 1);
+      n = parseInt(c);
+    }
+    return isNaN(n) ? code : String.fromCharCode(n);
+  };
+
+  var htmlEncode = function (str) {
+    return str.replace(/&/g, '&amp;').replace(/"/g, '&quot;').replace(/'/g, '&#39;')
+      .replace(/</g, '&lt;').replace(/>/g, '&gt;');
+  };
+
+  var htmlDecode = function (str) {
+    return str.replace(/&#?\w+;/g, decodeEntity);
+  };
+
+  var exports = htmlEncode;
+  htmlEncode.htmlEncode = htmlEncode;
+  htmlEncode.htmlDecode = htmlDecode;
+  if (COMMON_JS) {
+    module.exports = exports;
+  } else {
+    root.htmlEncode = htmlEncode;
+    root.htmlDecode = htmlDecode;
+    if (AMD) {
+      define(function() {
+        return exports;
+      });
+    }
+  }
+})();

La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 1 - 0
Public/js/jquery-3.6.0.min.js


Algunos archivos no se mostraron porque demasiados archivos cambiaron en este cambio