feat: ECMA and Python Script file with documentation done.

This commit is contained in:
KyMAN 2024-10-11 13:42:28 +02:00
parent 3a16280484
commit 50af2ad9c5
101 changed files with 3765 additions and 0 deletions

6
.gitignore vendored Normal file
View File

@ -0,0 +1,6 @@
*.apache2.conf
*[Ss]ecrets?*
/Python/Abstracts/AnPMap.py
/Python/Abstracts/Applications.py
.sass-cache
__pycache__

View File

@ -0,0 +1,73 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="200mm"
height="200mm"
viewBox="0 0 200 200"
version="1.1"
id="svg1"
inkscape:version="1.3.1 (9b9bdc1480, 2023-11-25, custom)"
sodipodi:docname="ErrorsManager.logo.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="mm"
inkscape:zoom="0.72183587"
inkscape:cx="376.12428"
inkscape:cy="428.07515"
inkscape:window-width="1920"
inkscape:window-height="1011"
inkscape:window-x="1920"
inkscape:window-y="32"
inkscape:window-maximized="1"
inkscape:current-layer="layer1" />
<defs
id="defs1" />
<g
inkscape:label="Capa 1"
inkscape:groupmode="layer"
id="layer1">
<path
id="path2"
style="fill:#992211;stroke-width:5.68737;stroke-linecap:round;fill-opacity:1"
d="M 100.0001 9.9999064 A 90 90 0 0 0 84.99998 11.393103 L 84.99998 21.600749 A 80 80 0 0 0 55.127384 33.913692 L 48.001721 26.788029 A 90 90 0 0 0 26.788029 48.001721 L 33.913692 55.127384 A 80 80 0 0 0 21.600749 84.99998 L 11.393103 84.99998 A 90 90 0 0 0 9.9999064 100.0001 A 90 90 0 0 0 11.393103 115.00022 L 21.600749 115.00022 A 80 80 0 0 0 33.913692 144.87281 L 26.788029 151.99847 A 90 90 0 0 0 48.001721 173.21217 L 55.127384 166.0865 A 80 80 0 0 0 84.99998 178.39945 L 84.99998 188.60658 A 90 90 0 0 0 100.0001 189.99977 A 90 90 0 0 0 115.00022 188.60658 L 115.00022 178.39945 A 80 80 0 0 0 144.87281 166.0865 L 151.99796 173.21165 A 90 90 0 0 0 173.21165 151.99796 L 166.0865 144.87281 A 80 80 0 0 0 178.39945 115.00022 L 188.60658 115.00022 A 90 90 0 0 0 189.99977 100.0001 A 90 90 0 0 0 188.71458 84.99998 L 178.56843 84.99998 A 80 80 0 0 0 166.16298 55.050387 L 173.33722 47.876147 A 90 90 0 0 0 152.12353 26.662972 L 144.94929 33.837211 A 80 80 0 0 0 115.00022 21.431767 L 115.00022 11.285616 A 90 90 0 0 0 100.0001 9.9999064 z M 100.0001 40.000142 A 60 60 0 0 1 160.00005 100.0001 A 60 60 0 0 1 100.0001 160.00005 A 60 60 0 0 1 40.000142 100.0001 A 60 60 0 0 1 100.0001 40.000142 z " />
<path
id="path5"
style="fill:#229999;stroke-width:5.75487;stroke-linecap:round;fill-opacity:1"
d="M 100.0001 50.000049 A 50 50 0 0 0 85.164827 52.304818 L 90.000191 119.99991 L 110 119.99991 L 114.83899 52.259859 A 50 50 0 0 0 100.0001 50.000049 z M 90.000191 129.99982 L 85.541032 147.83542 A 50 50 0 0 0 100.0001 150.00015 A 50 50 0 0 0 114.45916 147.83542 L 110 129.99982 L 90.000191 129.99982 z " />
</g>
<g
inkscape:groupmode="layer"
id="layer3"
inkscape:label="Backup"
style="display:none"
sodipodi:insensitive="true">
<path
id="path1-9"
style="fill:#880044;stroke-width:6.58587;stroke-linecap:round"
d="M 100.0001,9.999906 A 90,90 0 0 0 9.9999064,100.0001 90,90 0 0 0 100.0001,189.99977 90,90 0 0 0 189.99977,100.0001 90,90 0 0 0 100.0001,9.999906 Z m 0,9.999907 A 80,80 0 0 1 179.99987,100.0001 80,80 0 0 1 100.0001,179.99987 80,80 0 0 1 19.999813,100.0001 80,80 0 0 1 100.0001,19.999813 Z" />
<path
id="path2-3"
style="fill:#ffff00;stroke-width:11.542;stroke-linecap:round"
d="M 100.0001,30.000236 A 70,70 0 0 0 30.000236,100.0001 70,70 0 0 0 100.0001,169.99996 70,70 0 0 0 169.99996,100.0001 70,70 0 0 0 100.0001,30.000236 Z m 0,9.999906 A 60,60 0 0 1 160.00005,100.0001 60,60 0 0 1 100.0001,160.00005 60,60 0 0 1 40.000142,100.0001 60,60 0 0 1 100.0001,40.000142 Z" />
<path
id="rect2-1"
style="fill:#ff0000;stroke-width:3.67973;stroke-linecap:round"
d="M 84.99998,0 V 84.99998 H 0 v 30.00024 h 84.99998 v 84.99998 h 30.00024 V 115.00022 H 200.0002 V 84.99998 H 115.00022 V 0 Z" />
<path
id="path1"
style="fill:#880044;stroke-width:6.58587;stroke-linecap:round"
d="m 115.00022,11.285616 v 10.159587 a 80,80 0 0 1 29.93925,12.401827 l 7.18406,-7.184058 A 90,90 0 0 0 115.00022,11.285616 Z M 84.99998,11.393103 A 90,90 0 0 0 48.001204,26.788029 l 7.155119,7.155119 A 80,80 0 0 1 84.99998,21.581628 Z m 10.864453,18.796269 a 70,70 0 0 0 -8.167977,0.910022 l 3.999239,9.655224 a 60,60 0 0 1 16.608285,5.17e-4 l 3.93361,-9.495544 A 70,70 0 0 0 95.864433,30.189372 Z M 59.979801,42.57983 A 70,70 0 0 0 42.740027,60.045947 l 9.495544,3.93361 A 60,60 0 0 1 63.979557,52.235055 Z m 79.974449,0.160197 -3.93361,9.495544 a 60,60 0 0 1 11.7445,11.743986 l 9.65523,-3.999756 A 70,70 0 0 0 139.95425,42.740027 Z m 33.38297,5.136637 -7.18405,7.184058 a 80,80 0 0 1 12.40131,29.939258 h 10.1601 A 90,90 0 0 0 173.33722,47.876664 Z M 26.788029,48.001204 A 90,90 0 0 0 11.393103,84.99998 h 10.188525 a 80,80 0 0 1 12.36152,-29.843657 z m 142.112771,39.695252 -9.65522,3.999239 a 60,60 0 0 1 -5.2e-4,16.608285 l 9.49554,3.93361 a 70,70 0 0 0 0.1602,-24.541134 z m -137.641209,0.06615 a 70,70 0 0 0 -0.160197,24.541134 l 9.655224,-3.99924 a 60,60 0 0 1 5.17e-4,-16.608284 z M 11.393103,115.00022 a 90,90 0 0 0 15.394926,36.99825 l 7.155119,-7.1546 a 80,80 0 0 1 -12.36152,-29.84365 z m 167.024947,0 a 80,80 0 0 1 -12.36152,29.84314 l 7.15512,7.15511 a 90,90 0 0 0 15.39493,-36.99825 z m -126.182995,21.02042 -9.655225,3.99975 a 70,70 0 0 0 17.466117,17.23978 l 3.93361,-9.49555 A 60,60 0 0 1 52.235055,136.02064 Z m 95.529565,0 a 60,60 0 0 1 -11.74398,11.7445 l 3.99975,9.65523 a 70,70 0 0 0 17.23978,-17.46612 z m -56.068408,23.22442 -3.93361,9.49554 a 70,70 0 0 0 24.541138,0.1602 l -3.99924,-9.65522 a 60,60 0 0 1 -16.608288,-5.2e-4 z m 53.147148,6.81147 a 80,80 0 0 1 -29.84314,12.36152 v 10.18853 a 90,90 0 0 0 36.99825,-15.39493 z m -89.68652,5.2e-4 -7.155119,7.15512 a 90,90 0 0 0 36.998259,15.39441 v -10.18853 a 80,80 0 0 1 -29.84314,-12.361 z" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 6.0 KiB

Binary file not shown.

View File

@ -0,0 +1,125 @@
<!DOCTYPE html>
<html lang="{language}">
<head>
<title data-i18n="{title_i18n}">{title_text}</title>
<meta http-equiv="content-type" content="text/html;charset={charset}" />
<meta charset="{charset}" />
<meta name="xdoc:project" content="ErrorsManager" />
<meta name="xdoc:link" content="{link}" />
<meta name="xdoc:git" content="https://git.k3y.pw/KyMAN/ErrorsManager" />
<meta name="xdoc:author" content="KyMAN" />
<meta name="xdoc:since" content="20240626" />
<meta name="xdoc:version" content="20240626" />
<meta name="xdoc:access" content="public" />
<meta name="xdoc:donate:btc" content="" />
<meta name="xdoc:donate:ltc" content="" />
<meta name="xdoc:donate:doge" content="" />
<meta name="xdoc:donate:dash" content="" />
<style data-type="text/css;charset=utf-8" data-language="CSS1.2" data-rel="stylesheet" charset="utf-8">
html,body{
height : 100%;
margin : 0em;
}
</style>
<script data-type="text/javascript;charset=utf-8" data-language="ECMAScript 2015" src="https://anp.local/ecma/AnPScriptsLoader.ecma.js" data-crossorigin="anonymous" charset="utf-8"></script>
<script data-type="text/javascript;charset=utf-8" data-language="ECMAScript 2015" charset="utf-8">
const domain = /^https?\:\/{2}[^\/]+\.((anprm\.)?local|anprm)/i.test(window.location) ? "local" : "k3y.pw";
new AnPScriptsLoader({
styles : [
// "https://cdn." + domain + "/css/Cantarell.v17.remote.css",
// "https://cdn." + domain + "/css/Roboto.v30.remote.css",
// "https://cdn." + domain + "/css/RobotoMono.v23.remote.css",
// "https://cdn." + domain + "/css/FA6F.v6.5.2.remote.css",
"https://cdn." + domain + "/css/Roboto.v30.local.css",
"https://cdn." + domain + "/css/RobotoMono.v23.local.css",
"https://cdn." + domain + "/css/FA6F.v6.5.2.local.css",
"/scss/ErrorsManager.scss",
"https://wmarkdown." + domain + "/css/WMarkDown.icons.FontAwesome.css",
"https://wmarkdown." + domain + "/css/WMarkDown.web.icons.css",
"https://wmarkdown." + domain + "/scss/WMarkDown.scss",
"https://cdn." + domain + "/data/styles/Highlight.v11.10.0.min.css"
],
scripts : [[
"/ecma/ErrorsManager.ecma.js",
"https://cdn." + domain + "/js/Highlight.v11.10.0.min.js",
"https://wmarkdown." + domain + "/ecma/WMarkDown.ecma.js",
"https://cdn." + domain + "/data/scripts/Highlight.v11.10.0.min.js",
"https://cdn." + domain + "/data/scripts/tex-mml-chtml.v3.2.2.js"
], [
"https://anp." + domain + "/ecma/Application/AnP.ecma.js"
], [
"https://anp." + domain + "/ecma/Managers/Settings.ecma.js",
"https://anp." + domain + "/ecma/Application/URI.ecma.js",
"https://anp." + domain + "/ecma/Managers/Globals.ecma.js",
"https://anp." + domain + "/ecma/Managers/I18N.ecma.js",
"https://anp." + domain + "/ecma/Managers/PrintTypes.ecma.js",
"https://anp." + domain + "/ecma/Managers/Threads.ecma.js",
"https://anp." + domain + "/ecma/Application/Attributes.ecma.js",
"https://anp." + domain + "/ecma/Application/HTMLPreload.ecma.js"
], [
"https://anp." + domain + "/ecma/Components/Base.ecma.js"
]]
}, () => {
wmarkdown = new WMarkDown({dictionary : "https://wmarkdown." + domain + "/json/WMarkDown.dict.es.kyman.json"});
anp = new AnP({
globals : {
anp_root : "https://anp." + domain,
errors_manager_root : ""
},
callback : () => anp.base.set(".errors-manager")
});
});
</script>
</head>
<body class="anp errors-manager">
<header>
<h1 data-i18n="errors_manager" data-i18n-without="true" title="{{errors_manager}}">
<a href="{link}" target="_blank">
<span class="image">
<img src="{logo}" />
<span style="background-image:url('{logo}');"></span>
</span>
<span data-i18n="errors_manager">{{errors_manager}}</span>
</a>
</h1>
<nav class="main-menu">
<ul>
<li data-i18n="web" data-i18n-without="true" title="{{web}}">
<a href="/" target="_self">
<span data-icon="web"></span>
<span data-i18n="web">{{web}}</span>
</a>
</li>
<li data-i18n="git" data-i18n-without="true" title="{{git}}">
<a href="https://git.k3y.pw/KyMAN/ErrorsManager" target="_self">
<span data-icon="git"></span>
<span data-i18n="git">{{git}}</span>
</a>
</li>
</ul>
</nav>
</header>
<main>{contents}</main>
<footer>
<span class="license">
<a class="license-image" href="http://creativecommons.org/licenses/by-nc-sa/4.0/" target="_blank" data-i18n="license_cc_by_nc_sa_4" data-i18n-without="true" title="{{license_cc_by_nc_sa_4}}">
<span data-i18n="license_cc_by_nc_sa_4">{{license_cc_by_nc_sa_4}}</span>
<img src="https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png" data-i18n="license_cc_by_nc_sa_4" data-i18n-without="true" alt="{{license_cc_by_nc_sa_4}}">
</a>
</span>
</footer>
</body>
</html>

View File

@ -0,0 +1,3 @@
[
"get:/ /ErrorsManager/Public"
]

View File

@ -0,0 +1,42 @@
{
"errors_manager_host_name" : "/^(https?\\:\\/{2})?errorsmanager\\.(k3y\\.pw|(anprm\\.)?local|anprm)/",
"errors_manager_default_settings_files" : [
"/JSON/ErrorsManager.py.settings.json"
],
"errors_manager_default_secrets_files" : [
"/JSON/ErrorsManager.py.settings.secrets.json"
],
"errors_manager_default_i18n_files" : [
"/JSON/I18N/ErrorsManager.py.i18n.espanol.json"
],
"errors_manager_default_routes_files" : [
"/JSON/ErrorsManager.py.routes.json",
"/JSON/ErrorsManager.py.routes.secrets.json"
],
"errors_manager_default_views_files" : [],
"errors_manager_resources" : {
"charset" : "utf-8",
"logo" : "/images/ErrorsManager.png",
"link" : "https://errorsmanager.k3y.pw/",
"git" : "https://git.k3y.pw/KyMAN/ErrorsManager",
"project" : "ErrorsManager",
"web" : "https://errorsmanager.k3y.pw",
"authors" : "KyMAN",
"class" : "errors-manager",
"snake" : "errors_manager",
"metas" : {},
"styles" : ["/scss/ErrorsManager.scss"],
"menu" : [
["web", "_self", "/"],
["git", "_blank", "https://git.k3y.pw/KyMAN/ErrorsManager"]
],
"licenses" : [
["copyright", null, null, {
"year" : "2024-2025",
"entity" : "KyMAN"
}],
["cc_by_nc_sa_4"]
],
"dictionary" : "https://wmarkdown.{domain}/json/WMarkDown.dict.es.kyman.json"
}
}

View File

@ -0,0 +1,6 @@
{
"alarabiyah" : {
"errors_manager" : "سوء التصرف"
}
}

View File

@ -0,0 +1,6 @@
{
"azerbaycanca" : {
"errors_manager" : "Qalereya"
}
}

View File

@ -0,0 +1,6 @@
{
"blanga" : {
"errors_manager" : "ভুল বোঝাবুঝি"
}
}

View File

@ -0,0 +1,6 @@
{
"bokmal" : {
"errors_manager" : "MistakesManager"
}
}

View File

@ -0,0 +1,6 @@
{
"bulgarski" : {
"errors_manager" : "Грешки Manager"
}
}

View File

@ -0,0 +1,6 @@
{
"catala" : {
"errors_manager" : "ErrorsManager"
}
}

View File

@ -0,0 +1,6 @@
{
"cestina" : {
"errors_manager" : "ChybyManager"
}
}

View File

@ -0,0 +1,6 @@
{
"dansk" : {
"errors_manager" : "MistakesManager"
}
}

View File

@ -0,0 +1,6 @@
{
"deutsch" : {
"errors_manager" : "Fehlermanager"
}
}

View File

@ -0,0 +1,6 @@
{
"eesti" : {
"errors_manager" : "VeadManager"
}
}

View File

@ -0,0 +1,6 @@
{
"ellinika" : {
"errors_manager" : "Διαχειριστής λαθών"
}
}

View File

@ -0,0 +1,6 @@
{
"english" : {
"errors_manager" : "MistakesManager"
}
}

View File

@ -0,0 +1,5 @@
{
"espanol" : {
"errors_manager" : "ErrorsManager"
}
}

View File

@ -0,0 +1,6 @@
{
"esperanto" : {
"errors_manager" : "Eraroj"
}
}

View File

@ -0,0 +1,6 @@
{
"farsi" : {
"errors_manager" : "اشتباهات مدیر"
}
}

View File

@ -0,0 +1,6 @@
{
"francais" : {
"errors_manager" : "Gestionnaire des erreurs"
}
}

View File

@ -0,0 +1,6 @@
{
"gaeilge" : {
"errors_manager" : "MistakesManager"
}
}

View File

@ -0,0 +1,6 @@
{
"hangugeo" : {
"errors_manager" : "Mistakes 관리자"
}
}

View File

@ -0,0 +1,6 @@
{
"hanyu" : {
"errors_manager" : "錯誤管理者"
}
}

View File

@ -0,0 +1,6 @@
{
"hindi" : {
"errors_manager" : "MistakesManager"
}
}

View File

@ -0,0 +1,6 @@
{
"indonesia" : {
"errors_manager" : "Login"
}
}

View File

@ -0,0 +1,6 @@
{
"italiano" : {
"errors_manager" : "MistakesManager"
}
}

View File

@ -0,0 +1,6 @@
{
"ivrit" : {
"errors_manager" : "טעויות"
}
}

View File

@ -0,0 +1,6 @@
{
"latviski" : {
"errors_manager" : "KļūdasManager"
}
}

View File

@ -0,0 +1,6 @@
{
"lietuviskai" : {
"errors_manager" : "Comment"
}
}

View File

@ -0,0 +1,6 @@
{
"magyar" : {
"errors_manager" : "MistakesManager"
}
}

View File

@ -0,0 +1,6 @@
{
"malayu" : {
"errors_manager" : "Kesalahan Kesalahan Pengurus"
}
}

View File

@ -0,0 +1,6 @@
{
"nederlands" : {
"errors_manager" : "Foutenbeheer"
}
}

View File

@ -0,0 +1,6 @@
{
"nihongo" : {
"errors_manager" : "ミステークマネージャー"
}
}

View File

@ -0,0 +1,6 @@
{
"polski" : {
"errors_manager" : "Błąd menedżer"
}
}

View File

@ -0,0 +1,6 @@
{
"portugues" : {
"errors_manager" : "ErrosManager"
}
}

View File

@ -0,0 +1,6 @@
{
"romaneste" : {
"errors_manager" : "GreşeliManager"
}
}

View File

@ -0,0 +1,6 @@
{
"russkiy" : {
"errors_manager" : "Ошибки менеджера"
}
}

View File

@ -0,0 +1,6 @@
{
"shqip" : {
"errors_manager" : "Gabimet Manager"
}
}

View File

@ -0,0 +1,6 @@
{
"slovencina" : {
"errors_manager" : "ChybyManager"
}
}

View File

@ -0,0 +1,6 @@
{
"slovenscina" : {
"errors_manager" : "NapakeManager"
}
}

View File

@ -0,0 +1,6 @@
{
"suomi" : {
"errors_manager" : "Virheet"
}
}

View File

@ -0,0 +1,6 @@
{
"svenska" : {
"errors_manager" : "MisstagManager"
}
}

View File

@ -0,0 +1,6 @@
{
"tagalog" : {
"errors_manager" : "Nagkakamali"
}
}

View File

@ -0,0 +1,6 @@
{
"thai" : {
"errors_manager" : "ตัวจัดการข้อผิดพลาด"
}
}

View File

@ -0,0 +1,6 @@
{
"turkce" : {
"errors_manager" : "HatalarManager"
}
}

View File

@ -0,0 +1,6 @@
{
"ukrainska" : {
"errors_manager" : "Мапа"
}
}

View File

@ -0,0 +1,6 @@
{
"urdu" : {
"errors_manager" : "غلط‌فہمی"
}
}

View File

@ -0,0 +1,6 @@
{
"zhongwen" : {
"errors_manager" : "错误的管理者"
}
}

13
Public/doc/es/bugs.w.md Normal file
View File

@ -0,0 +1,13 @@
```wmd-options
language = es
title_i18n = errors_manager_title_bugs
title_text = Bugs - ErrorsManager
```
<!-- [[wmd]] -->
## Bugs
En esta sección se listarán los bugs encontrados en la librería y el estado en el que se encuentran para su reparación por parte de los desarrolladores.
<!-- [[wmd]] -->

View File

@ -0,0 +1,26 @@
```wmd-options
language = es
title_i18n = errors_manager_title_description
title_text = Descripción - ErrorsManager
```
<!-- [[wmd]] -->
El proyecto ErrorsManager es un proyeto ideado y desarrollado por Srx00 orientado a gestionar errores de una forma eficiente, compacta, sencilla y compatible entre plataformas. La idea radica en que la forma más simple de poder gestionar y mostrar errores de tipo global es gestionando un sistema Booleano que nos permite identificar punto a punto si algo es correcto o no, donde la solución más práctica, sencilla, eficiente, de bajos recursos y bajo peso sería el uso natural de binarios sobre valores enteros como valores comunes a todos los lenguajes, mediante la práctica del Bitwise y operadores binarios, ya sean nativos \(Como en la mayoría de los lenguajes) o alternativos \(Como es parcialmente en el caso de SQL Server), sin embargo, esto nos da un problema de funcionamiento real el cual podemos ver representado en la siguiente tabla:
[|
|= Lenguaje | Bits de entero | Bits de Bitwise seguros
| JavaScript | 32 | 31
| SQL Server | 64 | 28
| Python | Infinito | Infinito
|]
> [!!] Es cierto que Python no puede trabajar valores infinitos y que su valor máximo entero es de 64 bits, sin embargo, éste hace uso de una práctica que individualiza los dígitos del valor y los calcula en múltiples ciclos, que pese a ser un proceso más lento por ser fuera de la mantisa, aunque éstos se agrupon binariamente, permite un uso que puede extenderse hasta casi los 4GB de longitud, por tanto, hablando de semejantes longitudes lo consideramos, al uso de esta librería, como infinito.
> [!!] Es verdad que en los SQL el entero es de 32 bits, sin embargo, existe la variación del BigInt que nos permite tener enteros de hasta 64 bits. Es importante tener en cuenta que ciertos motores como MySQL/MariaDB no contemplan el uso físico de la mantisa pudiendo ser ejectados en entornos de 32 bits y poder trabajar valores de 64 bits, por lo que se cuenta únicamente por gestión de memoria, pero como uso serguro en decimal tenemos 64 bits, pero como uso Bitwise lo tenemos que bajar de 32 bits.
Visto este problema tanto de limitaciones como de diferentes longitudes de trabajo para los Bitwise existe esta librería. La idea es cambiar un valor numérico entero por un String cuya longitud se condiciona a los 2GB en la mínima \(32 bits de mantisa, pese a que éste sea realmente más, pero no en potencia 2 que serían los 4GB). También hay que tener en cuenta que el espacio asignado en lenguajes fuertemente tipados o de gestión de memoria, sería un despropósito asignar semejante cantidades, motivo por el cual, esta librería lo deja a una longitud de 512 bytes de tamaño para la gestión de errores. Dicha longitud se basará en Base64, base la cual sería una potencia 6 de base 2, es decir, por caracter tendríamos una gestión de 6 errores simultáneos distintos, por lo que 512 bytes daría lugar a la posibilidad de gestión de 512 \* 6, que vendría siendo **3072 errores simultáneos por String**.
> [!!] Esta librería permite alternar trabajo con Strings y valores numéricos enteros, siendo más eficiente y rápido, además de nativo, el uso de valores numéricos enteros positivos, así que se aconseja que mientras se esté por debajo de los 28 bits de longitud se haga uso de este sistema, a partir de ahí se aconseja el uso de Strings mediante esta librería.
<!-- [[wmd]] -->

49
Public/doc/es/design.w.md Normal file
View File

@ -0,0 +1,49 @@
```wmd-options
language = es
title_i18n = errors_manager_title_design
title_text = Diseño - ErrorsManager
```
<!-- [[wmd]] -->
## Diseño
El diseño de la interfaz de muestreo e información del proyecto ErrorsManager viene siendo la extraída de forma directa del proyecto AnP y el propio WMarkDown, con la diferencia principal de los colores primario y secundario.
Empezando por los colores, tenemos los siguientes:
[|
|= Tipo | Hexadecimal | RGBA | Muestra
| Fondo | #EFEFEF | rgba\(239, 239, 239, 1) | [[#EFEFEF]]
| Frontal | #222 | rgba\(34, 34, 34, 1) | [[#222]]
| Primario | #812 | rgba\(136, 17, 34, 1) | [[#812]]
| Secundario | #218 | rgba\(34, 17, 136, 1) | [[#218]]
| Gris | #888 | rgba\(136, 136, 136, 1) | [[#888]]
| Tabla título | #19888888 | rgba\(136, 136, 136, 0.1) | [[color rgba(136, 136, 136, 0.1)]]
| Tabla Select | #19888888 | rgba\(136, 136, 136, 0.1) | [[color rgba(136, 136, 136, 0.1)]]
| Tabla impar | #38888888 | rgba\(136, 136, 136, 0.2) | [[color rgba(136, 136, 136, 0.2)]]
| Tabla par | #00FFFFFF | rgba\(255, 255, 255, 0) | [[color rgba(255, 255, 255, 0)]]
| Borde interno | #19888888 | rgba\(136, 136, 136, 0.5) | [[color rgba(136, 136, 136, 0.5)]]
| Diccionario | #551a22 | rgba\(85, 26, 34, 1) | [[#551a22]]
| Diccionario en | #224d55 | rgba\(34, 77, 85, 1) | [[#224d55]]
| Code impar | #38C8C8C8 | rgba\(200, 200, 200, 0.2) | [[color rgba(200, 200, 200, 0.2)]]
|]
Por otro lado, tenemos las fuentes de texto usados en la Web de este proyecto, las cuales son:
* **Roboto**. Para el texto en general.
* https://fonts.google.com/specimen/Roboto?query=roboto
* **Roboto Mono**. Para los bloques de código.
* https://fonts.google.com/specimen/Roboto+Mono?query=roboto
* **Font Awesome**. Para la iconificación general de la Web.
* https://fontawesome.com/
El tamaño de la fuente, así como de los elementos de la Web se basan en un sistema que simulan los DPI en la Web, usando la magnitud "EM" para determinar un tamaño dinámico sobre el bloque anfitrión del mismo. Por defecto, éste se basa en dividir en 40 celdas desde el lado de la pantalla o del marco de visualización más estrecho, quedando como tamaño de fuente por defecto una celda.
La cabecera hace uso de 4 celdas y el pie de página consta de 2. Ambos ordenan sus elementos en un bloque Flex a modo tupla.
Finalmente tenemos el logo del proyecto, que representa una centralización de recursos sobre otros proyectos exponiendo un punto central del que parten todos los demás proyectos más grandes.
((!image /images/ErrorsManager.png))
<!-- [[wmd]] -->

View File

@ -0,0 +1,55 @@
```wmd-options
language = es
title_i18n = errors_manager_title_donates
title_text = Donaciones - ErrorsManager
```
<!-- [[wmd]] -->
## Donaciones
Este proyecto es plenamente gratuito pues es un proyecto orientado a complementar otros proyectos de los mismos desarrolladores. No tiene ningún plan de ingresos ni pasivos ni activos más allá de lo que se expone en este título. Si alguien quisiere colaborar en que este proyecto no sólo esté abierto por requisitos de los autores, sino también cara un mantenimiento hacia terceros, a continuación presentamos unas direcciones de Cryptoactivos donde se podrá donar sin ninguna cuantía mínima establecida.
- **Bitcoin** o *BTC*: [bitcoin:bc1qypwl4063lhcjx7zmktqrs7n7s3dypwn5nr6h9u?label=ErrorsManagerDonation bc1qypwl4063lhcjx7zmktqrs7n7s3dypwn5nr6h9u]
- **Litecoin** o *LTC*: [litecoin:ltc1qlqmy4pzl9f2kmqrgn8prfkjrndnnqw770j77ey?label=ErrorsManagerDonation ltc1qlqmy4pzl9f2kmqrgn8prfkjrndnnqw770j77ey]
- **Dogecoin** o *DOGE*: [dogecoin:DA8dwyPzs9KL3mZWQh1feJztPhq8dn7QRq?label=ErrorsManagerDonation DA8dwyPzs9KL3mZWQh1feJztPhq8dn7QRq]
- **Dash**: [dash:Xp8EnKd6PdhiLiibPhb9joQHqKcb2LvDMn?label=ErrorsManagerDonation Xp8EnKd6PdhiLiibPhb9joQHqKcb2LvDMn]
- **Faircoin** o *FAIR*: [faircoin:fLG4irvJt1xt67kPDTjEbNinXW3vUFvKzQ?label=ErrorsManagerDonation fLG4irvJt1xt67kPDTjEbNinXW3vUFvKzQ]
> [!!] Mientras no halla ninguna condición de recursos que impida el mantenimiento gratuito de este servicio, éste permanecerá mantenido y público independientemente de los ingresos obtenidos a partir de los donativos.
> [!#] Los usuarios que colaboren y quieran ser referenciados, éstos serán referenciados en este apartado mediante un Quote de comentario de usuario con el Nick y avatar correspondiente, pero sólo en caso de que ellos quieran aparecer aquí.
> [!#] Se mantendrá informados a los usuarios de todo aquel donativo dado y la cantidad económica adquirida, y será publicado su uso y tenencia para que halla constancia pública del uso que se le dé a dichos recursos.
> [!@Srx00] Quería agredecer de forma persona aquellas aportaciones que serán bien recibidas y valoradas para este proyecto, ya sea como valor simbólico como de mantenimiento. Así, que desde el desarrollo y como desarrollador de este proyecto, muchas gracias a todos aquellos que ponen su granito de arena para este proyecto y por lo tanto, en pro de todos. Muchas gracias, de verdad.
### Balance
A continuación se mostrará una tabla de balance con respecto a las cantidades y usos dados.
[|
|= Activo | Cantidad | Motivo | Usuario | Cantidad total actual
| **BTC** | 0 BTC | Inicio del contador de unidades de BTC. | | 0 BTC
| **LTC** | 0 LTC | Inicio del contador de unidades de LTC. | | 0 LTC
| **DOGE** | 0 DOGE | Inicio del contador de unidades de DOGE. | | 0 DOGE
| **DASH** | 0 DASH | Inicio del contador de unidades de DASH. | | 0 DASH
| **FAIR** | 0 FAIR | Inicio del contador de unidades de FAIR. | | 0 FAIR
|]
Cómputo total actual en tenencia.
[|
|= Activo | Cantidad | Número de Operaciones
| **BTC** | 0 BTC | 0
| **LTC** | 0 LTC | 0
| **DOGE** | 0 DOGE | 0
| **DASH** | 0 DASH | 0
| **FAIR** | 0 FAIR | 0
|]
### Donantes
A continuación, los comentarios de los donantes.
<!-- [[wmd]] -->

21
Public/doc/es/faq.w.md Normal file
View File

@ -0,0 +1,21 @@
```wmd-options
language = es
title_i18n = errors_manager_title_faq
title_text = F.A.Q. - ErrorsManager
```
<!-- [[wmd]] -->
## F.A.Q.
En este apartado se responderán a las preguntas más frecuentes que se puedan realizar en el entorno cercano de este proyecto.
> [!?] **¿Por qué la realización de este proyecto pudiendo gestionar los errores mediante matrices, enviando consigo los textos descriptivos de cada uno de los errores?** En teoría, las diferentes capas de una aplicación podrían estar desarrolladas en distintos entornos de desarrollo, por ejemplo, no es lo mismo trabajar procedimientos almacenados desde una base de datos que controladores en el servidor o métodos en el cliente. Para poder compatibilizar todos estos entornos cuando entre ellos consumen servicios expuestos, éstos han de conocer las posibles respuestas y consigo, los distintos mensajes de error que se devuelvan, por tanto, para ahorrar ancho de banda, ya sea a nivel local, de red o Internet, es mejor, en estos casos concretos, enviar un código que defina y especifique todo antes que toda aquella información al respecto que puede ser bastante. Al no existir un sistema unificado para dicho fin con las características de longitud y eficiencia deseada, por lo menos, desde el conocimiento de Srx00, pues éste decidió crear esta librería.
> [!?] **¿Por qué este trabajo está público y gratuito?** Esta librería es una librería que sí o sí iba a desarrollar Srx00 para los fines de los distintos proyectos que desarrolla. Al no tener un modelo de negocio y no estar sujeto a clientes, éste quedará libre y gratuito, dentro de los términos y condiciones de la licencia Creative Commons BY-NC-SA 4.0. Ésto permite no sólo compartir con la comunidad, sino también currículum y una forma de extender el conocimiento de existencia de este tipo de proyectos de Srx00.
> [!?] **¿Por qué la licencia Creative Commons de Atribución, No Comercial y que se Permite Compartir, CC-BY-NC-SA 4.0?** Porque Srx00 quiere compartir con la comunidad este trabajo, sin embargo, una de las condiciones más importantes es reconocer la autoría original, lo que ofrece Currículum y conocimiento del trabajo del o los autores, además de no permitir la comercialización de dicho proyecto, lo que no impide que éste pueda estar en un proyecto comercial siempre que lo que se venda no sea este proyecto. Las licencias como MIT o GPL no cumplen con dichas espectativas y Srx00 tiene la filosofía de que todo trabajo ha de ser reconocido a su autor aunque éste no lo requiera o precise pues es su trabajo.
> [!?] **Al ser un proyecto CC-BY-NC-SA 4.0, el cual tiene como condición No Comercial. ¿Podría integrar este proyecto en un proyecto personal de caracter privado y comercial?** Sí, siempre que éste reconozca la autoría de este proyecto y que no sea éste la base de negocio económico de dicho proyecto, es decir, si se integra para gestionar los errores del proyecto o cualquier otra cosa que ayude o facilite el trabajo del mismo pero la base económica del proyecto sea otra cosa agena a eso se permite perfectamente el uso y manipulación del mismo.
<!-- [[wmd]] -->

View File

@ -0,0 +1,140 @@
```wmd-options
language = es
title_i18n = errors_manager_title_integration
title_text = Integración - ErrorsManager
```
<!-- [[wmd]] -->
## Integración
El proyecto ErrorsManager viene siendo un proyecto que se basa principalmente en un objeto que parte de una clase, aunque en lenguajes como los SQL, éste parte de una librería que contiene las acciones necesarias para poder trabajar con ésta.
### JavaScript/ECMAScript
En proyectos de JavaScript/ECMAScript, existen varias formas de ser adjuntas, sin embargo, aquí hablaremos únicamente de la adjunción directa vía etiqueta SCRIPT de HTML pues cada entorno de desarrollo tendrá su forma de cargar dicha librería. Para poder hacer uso de esta librería puede ser mediante sistema local, a partir de descargar dicha librería; o bien, hacer uso de la librería original de este servidor o cualquier otro CDN, aunque se aconseja siempre que sea el oficial.
```html
<script data-type="text/javascript;charset=utf-8" data-language="ECMAScript 2015" src="https://errorsmanager.k3y.pw/ecma/ErrorsManager.ecma.js" data-crossorigin="anonymous" charset="utf-8"></script>
```
> [!@Srx00] Estos atributos que aquí se exponen son míos con la folosofía de preservar ciertos atributos que antiguamente se utilizaban y que a creencia personal, son útiles para identificar a qué clase de Script te enfrentas sin necesidad de tener que ver el contenido del fichero que vinculan, así que los elementos que salen como *data-* no serían nacesarios de aplicar, simplemente siguen una filosofía personal que siempre aparecerán expuestos en mis desarrollos personales.
Los Links que se pueden usar para dicho fin son los siguientes:
* https://errorsmanager.k3y.pw/ecma/ErrorsManager.ecma.js
* https://git.k3y.pw/KyMAN/ErrorsManager/raw/branch/main/Public/ecma/ErrorsManager.ecma.js
Para descargar el archivo original tenemos el siguiente link:
* https://git.k3y.pw/KyMAN/ErrorsManager/src/branch/main/Public/ecma/ErrorsManager.ecma.js
Luego, para poder hacer uso de dicha librería simplemente hemos de crear el objeto que contiene las órdenes con el alfabeto correspondiente.
```js
"use strict";
const errors_manager = new ErrorsManager();
console.log(errors_manager.get_alphabet());
```
De esta forma, comprobamos que realmente funciona imprimiendo el alfabeto usado para el String.
### Python
La integración en Python se puede hacer de varias formas según interese al desarrollador, sin embargo, hay que tener encuenta que ésto puede dar lugar a problemas de funcionalidad según se haga.
> [!!] Recuerda que Python funciona bajo los permisos del usuario ejecutor, por lo que es importante tener encuenta los permisos, ya sean por las ACL como por los permisos nativos del sistema.
#### Directo
La integración directa dentro de un proyecto Python sería básicamente descargar el siguiente archivo Python desde el propio Git e integrarlo dentro de nuestro proyecto.
* https://git.k3y.pw/KyMAN/ErrorsManager/src/branch/main/Python/ErrorsManager.py
Si el fichero fue instalado en el directorio "Assets" dentro de nuestro proyecto, su implementación sería la siguiente:
```py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from Assets.ErrorsManager import ErrorsManager
errors_manager:ErrorsManager = ErrorsManager()
print(errors_manager.get_alphabet())
```
#### Enlace Simbólico
Una integración a partir de un Enlace Simbólico \(Sistemas UNIX) o Acceso Directo \(Sistemas DOS) simlemente es tener descargado el archivo mencionado justo en el apartado **[#directo Directo]** en cualquier parte de que nos interese tenerlo como un recurso compartido y éste ser vinculado mediante Enlace Simbólico o Acceso Directo dentro de nuestro proyecto. Siguiendo con el ejemplo anterior, y en nuestro caso, en un entorno UNIX, éste sería:
```sh
#!/bin/bash
mkdir /CARPETA_DE_RECURSOS_COMPARTIDOS
cd /CARPETA_DE_RECURSOS_COMPARTIDOS
wget https://git.k3y.pw/KyMAN/ErrorsManager/raw/branch/main/Python/ErrorsManager.py
ln -s ErrorsManager.py /PROYECTO_PYTHON/Assets/ErrorsManager.py
```
Y de la misma forma que el anterior, tendríamos:
```py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from Assets.ErrorsManager import ErrorsManager
errors_manager:ErrorsManager = ErrorsManager()
print(errors_manager.get_alphabet())
```
#### Indirecto o En Caliente
La última forma que se expone es la carga indirecta o compilado en caliente. Python tiene 3 modos de trabajo:
* **Compilado**, donde se compila un PYC u otro formato dependiendo del propio compilador, que pese a seguir siendo interpretado por una VM, éste ya no tendría el proceso del precompilado.
* **Precompilado**, donde se ejecuta directamente un archivo PY que lance toda la aplicación, ya sea con carga de archivos importados o seá únicamente un fichero, donde se compila en memoria y tras ello será ejecutado e interpretado. Este método es el más habitual.
* **Compilado en caliente**, el cual se usa para cargar librerías que pueden o no estar dentro del proyecto y se cargan como ficheros binarios, luego éstos se compilan en caliente dentro de la aplicació ya ejecutada y luego se ejecutan éstos al nivel donde se haga la compilación.
En este caso sería el último, y ésto nos permite cargar cualquier fichero en cualquier punto del sistema operativo mediante su Path, ya sea absoluto o relativo. Suponiendo que está en un directorio de recursos compartidos entre aplicaciones, y partiendo del ejemplo del apartado anterior **[#enlace-simb-lico Enlace Simbólico]**, el resultado sería el siguiente:
```python
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from os.path import exists as path_exists
path:str = "/CARPETA_DE_RECURSOS_COMPARTIDOS/ErrorsManager.py"
if path_exists(path):
opened:BufferedReader
with open(path, "rb") as opened:
try:
exec(compile(opened.read(), "ErrorsManager.py", "exec"), globals())
errors_manager:ErrorsManager = ErrorsManager()
print(errors_manager.get_alphabet())
except Exception as exception:
print(exception.getMessage())
else:
print("No existe el Path '" + path + "'.")
```
> [!!] Este método tiene tres problemas: el primero de todos, y más importante es que hay que tener en cuenta que para aplicaciones compiladas no vale pues la librería quedaría sin compilar a petición de la aplicación; requiere de que exista siempre esa librería, sino nos dirá que no existe, y eso puede ser un problema a la hora de compartir el proyecto; y finalmente, los permisos que tenga el fichero para ser cargado, aunque no le afectaría el permiso de ejecución pues como podemos ver, simplemente lee su contenido y luego lo ejecuta, pero no ejecuta propiamente el fichero.
<!-- [[wmd]] -->

55
Public/doc/es/manual.w.md Normal file
View File

@ -0,0 +1,55 @@
```wmd-options
language = es
title_i18n = errors_manager_title_manual
title_text = Manual - ErrorsManager
```
<!-- [[wmd]] -->
## Manual
[[include manual/basis.w.md]]
[[include manual/set_alphabet.w.md]]
[[include manual/get_alphabet.w.md]]
[[include manual/is_string.w.md]]
[[include manual/is_integer.w.md]]
[[include manual/is_array.w.md]]
[[include manual/type.w.md]]
[[include manual/process.w.md]]
[[include manual/bits.w.md]]
[[include manual/to_array.w.md]]
[[include manual/to_array_binary.w.md]]
[[include manual/to_integer.w.md]]
[[include manual/to_string.w.md]]
[[include manual/to_unknown.w.md]]
[[include manual/has.w.md]]
[[include manual/has_range.w.md]]
[[include manual/compact.w.md]]
[[include manual/bitwise.w.md]]
[[include manual/set.w.md]]
[[include manual/join.w.md]]
[[include manual/set_blocks.w.md]]
[[include manual/slice.w.md]]
<!-- [[wmd]] -->

View File

@ -0,0 +1,54 @@
```wmd-options
language = es
title_i18n = errors_manager_title_basis
title_text = Base conceptual - ErrorsManager
```
<!-- [[wmd]] -->
En este apartado se analizará cada una de las funcionalidades de esta librería, en común entre todos los lenguajes, de esta forma se podrá gestionar de una forma común entre los distintos entornos a los que pertenece.
Antes de empezar, hay que aclarar que esta librería se basa en un funcionamiento mediante Bitwise dentro de un String, donde cada caracter representa un valor numérico entero en una base binaria cuya potencia por defecto será 6, es decir, que cada caracter representa un valor numérico decimal entero positivo entre 0 y 63, ambos incluídos, y cuando hay más de un valor, éste será como cuando hay más de un dígito en base decimal, permitiendo recrear valores numéricos enormes. Para poder llevar a cabo ésto, se requiere de un alfabeto de caracteres el cual determina por posición, qué valor numérico decimal entero positivo representa. Por defecto, el alfabeto usado es el Base64, el cual es el siguiente:
```txt
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=
```
> [!#] Es cierto que Base64 realmente no tiene 64 caracteres, sino 65. Esto sucede por el caracter de relleno para que cumpla con el protocolo de la codificación de Base64. En nuestro caso, éste último caracter será ignorado pues se usará, dentro del conjunto matemático los 64 caracteres que representan las posiciones de la 0 a la 63, los cuales incluyen el caracter más ("+") y el caracter igual ("=").
> [!! ¡OJO!] Es importante entender que se diferenciarán las mayúsculas de las minúsculas cara entornos como los SQL lo cual hay que forzarlo en las funciones de trabajo con caracteres y Strings.
> [!! IMPORTANTE] Para que los errores puedan ser multiplataforma e integrados en lenguajes o plataformas externas, el alfabeto y la potencia de la base han de coincidir, sino, los errores en formato String serán mal interpretados.
La librería trabaja tres tipos muy concretos de datos equivalentes de error:
* **Integer**: Viene siendo un valor numérico entero cuyos Bits representan, de forma Booleana, cada uno de los errores, hasta un máximo seguro de 28 bits de longitud.
* **String**: Viene siendo una cadena de caracteres en el alfabeto dado que determina el código de error. Viene a representar lo mismo que el *Integer* pero con la diferencia de que cada caracter viene siendo un valor numérico en una base específica cuya unión hace enteros simulados más largos y cuyos bits por posición, representan lo dicho anteriormente.
* **Array**: Viene siendo lo mismo que el String pero cada caracter es subsituído por el entero correspondiente al que hace referencia dentro de un vector, lista, Array, tupla, etc., y éste está comprendido entre 0 y la base del String menos 1, ambos incluídos. Por ejemplo, en Base64 sería entre 0 y 63, ambos incuídos.
```maths
\begin{align}
Base = 64 \\
Rango(x, y) = [x, y] = [0, 64 - 1] = [0, 2^{log_2{64}} - 1] \\ \\
B = Base \\
Rango(x, y) = [x, y] = [0, B - 1] = [0, 2^{log_2{B}} - 1] \\
\end{align}
```
> [!!] Es importante mencionar que el código de error visual es el propio String, sin embargo, el código de error para ser procesado y trabajado es el Array.
La librería se basa en un objeto o en un espacio de nombres, pero entornos que no posean ninguna de las dos cosas señaladas anteriormente o que el uso de éstas requiera de un trabajo engorroso o profundo sobre dicho entorno, éstos usarán la cabecera de nombre en todos sus elementos a usar **errors_manager_** en Snake o **ErrorsManager** en Pascal según convenga su uso.
* **Métodos** y **Funciones**: Irá en Snake.
* **Tablas** y **Vistas**: Irá en Pascal.
* **Variables**: Irá en Snake.
* **Constantes**: Irá en Snake Upper.
> [!#] La librería, al no trabajar entorno gráfico pues es simplemente para el lado de desarrollo, ésta no posee entradas en Kebab para clases e IDs entre otras claves. Además, por filosofía no se usa Camel, sino Pascal.
<!-- [[wmd]] -->

View File

@ -0,0 +1,45 @@
```wmd-options
language = es
title_i18n = errors_manager_title_bits
title_text = bits - ErrorsManager
```
<!-- [[wmd]] -->
### bits
[[@ [integer] ErrorsManager.bits(!Integer|String|Array<Integer> code)]]
El método **bits** es un método objeto que retorna el número de bits que contiene el código de error, que viene siendo el número de comprobaciones Booleanas que contiene.
```py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from Assets.ErrorsManager import ErrorsManager
errors_manager:ErrorsManager = ErrorsManager()
print(errors_manager.bits(105))
print(errors_manager.bits("pB"))
print(errors_manager.bits([41, 1]))
```
```js
"use strict";
/** @type {ErrorsManager} */
const errors_manager = new ErrorsManager();
console.log(errors_manager.bits(105));
console.log(errors_manager.bits("pB"));
console.log(errors_manager.bits([41, 1]));
```
La respuesta en todos los casos sería 7.
> [!!] Es importante destacar que el número de Bits parte desde la última comprobación de error Booleano que dio "true", es decir, si se esperan 20 comprobaciones pero los últimos valores de comprobación son "false", es decir, que no tienen error, éstos no saldrán reflejados en el valor de bits final, a excepción de valores de relleno que pueden ser dados en los Sring y los Array.
<!-- [[wmd]] -->

View File

@ -0,0 +1,105 @@
```wmd-options
language = es
title_i18n = errors_manager_title_bitwise
title_text = bitwise - ErrorsManager
```
<!-- [[wmd]] -->
### bitwise
[[@ [Integer] ErrorsManager.bitwise(!Integer code, !Integer bits)]]
[[@ [String] ErrorsManager.bitwise(!String code, !Integer bits)]]
[[@ [Array<Integer>] ErrorsManager.bitwise(!Array<Integer> code, !Integer bits)]]
El método **bitwise** es un método objeto nos permite hacer desplazamiento de Bit en el código de error tantos Bits como queramos, siendo el número de Bits positivo hacia la izquierda, creando los Bits requeridos; y siendo el número de Bits negativo hacia la derecha, eliminando consigo ese número de Bits por ese lado.
```py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from Assets.ErrorsManager import ErrorsManager
errors_manager:ErrorsManager = ErrorsManager()
options:tuple[int] = (-10, -5, -3, -1, 0, 1, 3, 5, 10)
value:int|str|list[int]
for i, value in enumerate((105, "pB", [41, 1])):
bits:int
for bits in options:
new_value:int|str|list[int] = errors_manager.bitwise(value, bits)
print((
value,
errors_manager.to_array_binary(value),
bits,
new_value,
errors_manager.to_array_binary(new_value)
))
```
```js
"use strict";
/** @type {ErrorsManager} */
const errors_manager = new ErrorsManager(),
/** @type {Array.<number>} */
options = [-10, -5, -3, -1, 0, 1, 3, 5, 10];
[105, "pB", [41, 1]].forEach((value, i) => options.forEach(bits => {
/** @type {number|String|Array.<number>} */
const new_value = errors_manager.bitwise(value, bits);
console.log([
value,
errors_manager.to_array_binary(value),
bits,
new_value,
errors_manager.to_array_binary(new_value)
]);
}));
```
El resultado de estas pruebas son los siguientes:
[|
|= Valor | Binario | Bits | Desplazado | Binario desplazado
| 105 | \["101001", "000001"] | -10 | 0 | \["000000"]
| 105 | \["101001", "000001"] | -5 | 3 | \["000011"]
| 105 | \["101001", "000001"] | -3 | 13 | \["001101"]
| 105 | \["101001", "000001"] | -1 | 52 | \["110100"]
| 105 | \["101001", "000001"] | 0 | 105 | \["101001", "000001"]
| 105 | \["101001", "000001"] | 1 | 210 | \["010010", "000011"]
| 105 | \["101001", "000001"] | 3 | 840 | \["001000", "001101"]
| 105 | \["101001", "000001"] | 5 | 3360 | \["100000", "110100"]
| 105 | \["101001", "000001"] | 10 | 107520 | \["000000", "010000", "011010"]
| "pB" | \["101001", "000001"] | -10 | "A" | \["000000"]
| "pB" | \["101001", "000001"] | -5 | "DA" | \["000011", "000000"]
| "pB" | \["101001", "000001"] | -3 | "NA" | \["001101", "000000"]
| "pB" | \["101001", "000001"] | -1 | "0A" | \["110100", "000000"]
| "pB" | \["101001", "000001"] | 0 | "pB" | \["101001", "000001"]
| "pB" | \["101001", "000001"] | 1 | "SD" | \["010010", "000011"]
| "pB" | \["101001", "000001"] | 3 | "IN" | \["001000", "001101"]
| "pB" | \["101001", "000001"] | 5 | "g0" | \["100000", "110100"]
| "pB" | \["101001", "000001"] | 10 | "AQa" | \["000000", "010000", "011010"]
| \[41, 1] | \["101001", "000001"] | -10 | \[0] | \["000000"]
| \[41, 1] | \["101001", "000001"] | -5 | \[3, 0] | \["000011", "000000"]
| \[41, 1] | \["101001", "000001"] | -3 | \[13, 0] | \["001101", "000000"]
| \[41, 1] | \["101001", "000001"] | -1 | \[52, 0] | \["110100", "000000"]
| \[41, 1] | \["101001", "000001"] | 0 | \[41, 1] | \["101001", "000001"]
| \[41, 1] | \["101001", "000001"] | 1 | \[18, 3] | \["010010", "000011"]
| \[41, 1] | \["101001", "000001"] | 3 | \[8, 13] | \["001000", "001101"]
| \[41, 1] | \["101001", "000001"] | 5 | \[32, 52] | \["100000", "110100"]
| \[41, 1] | \["101001", "000001"] | 10 | \[0, 16, 26] | \["000000", "010000", "011010"]
|]
<!-- [[wmd]] -->

View File

@ -0,0 +1,78 @@
```wmd-options
language = es
title_i18n = errors_manager_title_compact
title_text = compact - ErrorsManager
```
<!-- [[wmd]] -->
### compact
[[@ [Integer] ErrorsManager.compact(!Integer code)]]
[[@ [String] ErrorsManager.compact(!String code)]]
[[@ [Array<Integer>] ErrorsManager.compact(!Array<Integer> code)]]
El método **compact** es un método objeto que elimina los ceros a la izquierda del código de error en formao Array o String. Cuando a éste se le envía el formato Integer, éste retornará el mismo pues los valores numéricos enteros no tienen dicha propiedad.
```py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from Assets.ErrorsManager import ErrorsManager
errors_manager:ErrorsManager = ErrorsManager()
value:int|str|list[int]
for i, value in enumerate((105, "pBAA", [41, 1, 0, 0])):
compacted:int|str|list[int] = errors_manager.compact(value)
print([
"Prueba " + str(i),
value,
errors_manager.to_array_binary(value),
compacted,
errors_manager.to_array_binary(compacted)
])
```
```js
"use strict";
/** @type {ErrorsManager} */
const errors_manager = new ErrorsManager();
[105, "pBAA", [41, 1, 0, 0]].forEach((value, i) => {
/** @type {number|String|Array.<number>} */
const compacted = errors_manager.compact(value);
console.log([
"Prueba " + i,
value,
errors_manager.to_array_binary(value),
compacted,
errors_manager.to_array_binary(compacted)
]);
});
```
El resultado de estas pruebas son los siguientes:
[|
|= Prueba | Valor | Binario | Compactado | Binario compactado
| 0 | 105 | \["101001", "000001"] | 105 | \["101001", "000001"]
| 1 | "pBAA" | \["101001", "000001", "000000", "000000"] | "pB" | \["101001", "000001"]
| 2 | \[41, 1, 0, 0] | \["101001", "000001", "000000", "000000"] | \[41, 1] | \["101001", "000001"]
|]
> [!!] Los binarios aquí representados están en base al método objeto de pruebas **to_array_binary**, y es posible que no se espere dicho binario del valor dado por su orden, pero es el método que se usa para hacer las comprobaciones pertinentes.
> [!!] Los valores compactados lo único que hacen es simplificar el valor a la mínima unidad como valor, en el caso de los String como caracteres; y en el caso de los Array como enteros, motivo por el cual, cuando salen los binarios compactados salen con ceros a la izquierda en el último bloque binario, sin embargo, podemos ver que lo que son bloques completamente 0 se eliminarán.
<!-- [[wmd]] -->

View File

@ -0,0 +1,42 @@
```wmd-options
language = es
title_i18n = errors_manager_title_get_alphabet
title_text = get_alphabet - ErrorsManager
```
<!-- [[wmd]] -->
### get_alphabet
[[@ [string] ErrorsManager.get_alphabet()]]
El método **get_alphabet** es un método objeto que retorna el alfabeto actualmente en uso del objeto ErrorsManager.
```py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from Assets.ErrorsManager import ErrorsManager
mi_alfabeto:str = "qwertyuiopasdfghjklzxcvbnm1234567890QWERTYUIOPASDFGHJKLZXCVBNM+/"
errors_manager:ErrorsManager = ErrorsManager(mi_alfabeto)
# Imprime mi alfabeto como alfabeto actual en uso.
print(errors_manager.get_alphabet())
```
```js
"use strict";
/** @type {String} */
const mi_alfabeto = "qwertyuiopasdfghjklzxcvbnm1234567890QWERTYUIOPASDFGHJKLZXCVBNM+/",
/** @type {ErrorsManager} */
errors_manager = new ErrorsManager(mi_alfabeto);
// Imprime mi alfabeto como alfabeto actual en uso.
console.log(errors_manager.get_alphabet());
```
<!-- [[wmd]] -->

View File

@ -0,0 +1,118 @@
```wmd-options
language = es
title_i18n = errors_manager_title_has
title_text = has - ErrorsManager
```
<!-- [[wmd]] -->
### has
[[@ [Boolean] ErrorsManager.has(!Integer|String|Array<Integer> code, Integer|Array<Integer> bits)]]
El método **has** es un método objeto que verifica si hay error o no en el código dado o en un o varios bits dados.
```py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from Assets.ErrorsManager import ErrorsManager
errors_manager:ErrorsManager = ErrorsManager()
print(("Prueba 1", errors_manager.has(0)))
print(("Prueba 2", errors_manager.has("A")))
print(("Prueba 3", errors_manager.has([0, 0])))
print(("Prueba 4", errors_manager.has(105)))
print(("Prueba 5", errors_manager.has("pB")))
print(("Prueba 6", errors_manager.has([41, 1])))
print(("Prueba 7", errors_manager.has(105, 5)))
print(("Prueba 8", errors_manager.has("pB", 5)))
print(("Prueba 9", errors_manager.has([41, 1], 5)))
print(("Prueba 10", errors_manager.has(105, 4)))
print(("Prueba 11", errors_manager.has("pB", 4)))
print(("Prueba 12", errors_manager.has([41, 1], 4)))
print(("Prueba 13", errors_manager.has(105, (5, 6))))
print(("Prueba 14", errors_manager.has("pB", (5, 6))))
print(("Prueba 15", errors_manager.has([41, 1], (5, 6))))
print(("Prueba 16", errors_manager.has(105, (4, 5, 6))))
print(("Prueba 17", errors_manager.has("pB", (4, 5, 6))))
print(("Prueba 18", errors_manager.has([41, 1], (4, 5, 6))))
print(["Prueba 19", errors_manager.has(105, (1, 2))])
print(["Prueba 20", errors_manager.has("pB", (1, 2))])
print(["Prueba 121", errors_manager.has([41, 1], (1, 2))])
```
```js
"use strict";
/** @type {ErrorsManager} */
const errors_manager = new ErrorsManager();
console.log(["Prueba 1", errors_manager.has(0)]);
console.log(["Prueba 2", errors_manager.has("A")]);
console.log(["Prueba 3", errors_manager.has([0, 0])]);
console.log(["Prueba 4", errors_manager.has(105)]);
console.log(["Prueba 5", errors_manager.has("pB")]);
console.log(["Prueba 6", errors_manager.has([41, 1])]);
console.log(["Prueba 7", errors_manager.has(105, 5)]);
console.log(["Prueba 8", errors_manager.has("pB", 5)]);
console.log(["Prueba 9", errors_manager.has([41, 1], 5)]);
console.log(["Prueba 10", errors_manager.has(105, 4)]);
console.log(["Prueba 11", errors_manager.has("pB", 4)]);
console.log(["Prueba 12", errors_manager.has([41, 1], 4)]);
console.log(["Prueba 13", errors_manager.has(105, [5, 6])]);
console.log(["Prueba 14", errors_manager.has("pB", [5, 6])]);
console.log(["Prueba 15", errors_manager.has([41, 1], [5, 6])]);
console.log(["Prueba 16", errors_manager.has(105, [4, 5, 6])]);
console.log(["Prueba 17", errors_manager.has("pB", [4, 5, 6])]);
console.log(["Prueba 18", errors_manager.has([41, 1], [4, 5, 6])]);
console.log(["Prueba 19", errors_manager.has(105, [1, 2])]);
console.log(["Prueba 20", errors_manager.has("pB", [1, 2])]);
console.log(["Prueba 121", errors_manager.has([41, 1], [1, 2])]);
```
La respuesta a estos ejemplos sería:
[|
|= Prueba | Python | JavaScript
| 1 | False | false
| 2 | False | false
| 3 | False | false
| 4 | True | true
| 5 | True | true
| 6 | True | true
| 7 | True | true
| 8 | True | true
| 9 | True | true
| 10 | False | false
| 11 | False | false
| 12 | False | false
| 13 | True | true
| 14 | True | true
| 15 | True | true
| 16 | True | true
| 17 | True | true
| 18 | True | true
| 19 | False | false
| 20 | False | false
| 21 | False | false
|]
> [!!] Cuando se especifican los Bits, éstos han de cumplirse en todos los casos.
<!-- [[wmd]] -->

View File

@ -0,0 +1,85 @@
```wmd-options
language = es
title_i18n = errors_manager_title_has_range
title_text = has_range - ErrorsManager
```
<!-- [[wmd]] -->
### has_range
[[@ [Boolean] ErrorsManager.has_range(!Integer|String|Array<Integer> code, !Integer _from, Integer _to)]]
El método **has_range** es un método objeto que verifica si hay error o no en un rango de bits del código dado o no.
```py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from Assets.ErrorsManager import ErrorsManager
errors_manager:ErrorsManager = ErrorsManager()
print(("Prueba 1", errors_manager.has_range(105, 2, 6)))
print(("Prueba 2", errors_manager.has_range("pB", 2, 6)))
print(("Prueba 3", errors_manager.has_range([41, 1], 2, 6)))
print(("Prueba 4", errors_manager.has_range(105, 1, 2)))
print(("Prueba 5", errors_manager.has_range("pB", 1, 2)))
print(("Prueba 6", errors_manager.has_range([41, 1], 1, 2)))
print(("Prueba 7", errors_manager.has_range(105, 4)))
print(("Prueba 8", errors_manager.has_range("pB", 4)))
print(("Prueba 9", errors_manager.has_range([41, 1], 4)))
print(("Prueba 10", errors_manager.has_range(105, 0, 2)))
print(("Prueba 11", errors_manager.has_range("pB", 0, 2)))
print(("Prueba 12", errors_manager.has_range([41, 1], 0, 2)))
```
```js
"use strict";
/** @type {ErrorsManager} */
const errors_manager = new ErrorsManager();
console.log(("Prueba 1", errors_manager.has_range(105, 2, 6)));
console.log(("Prueba 2", errors_manager.has_range("pB", 2, 6)));
console.log(("Prueba 3", errors_manager.has_range([41, 1], 2, 6)));
console.log(("Prueba 4", errors_manager.has_range(105, 1, 2)));
console.log(("Prueba 5", errors_manager.has_range("pB", 1, 2)));
console.log(("Prueba 6", errors_manager.has_range([41, 1], 1, 2)));
console.log(("Prueba 7", errors_manager.has_range(105, 4)));
console.log(("Prueba 8", errors_manager.has_range("pB", 4)));
console.log(("Prueba 9", errors_manager.has_range([41, 1], 4)));
console.log(("Prueba 10", errors_manager.has_range(105, 0, 2)));
console.log(("Prueba 11", errors_manager.has_range("pB", 0, 2)));
console.log(("Prueba 12", errors_manager.has_range([41, 1], 0, 2)));
```
La respuesta a estos ejemplos sería:
[|
|= Prueba | Python | JavaScript
| 1 | True | true
| 2 | True | true
| 3 | True | true
| 4 | False | false
| 5 | False | false
| 6 | False | false
| 7 | False | false
| 8 | False | false
| 9 | False | false
| 10 | True | true
| 11 | True | true
| 12 | True | true
|]
> [!!] El atributo **_from** es obligatorio, sin embargo, el atributo **_to** es opcional. Cuando **_to** no está definido se entiende que es hasta el último Bit.
<!-- [[wmd]] -->

View File

@ -0,0 +1,89 @@
```wmd-options
language = es
title_i18n = errors_manager_title_is_array
title_text = is_array - ErrorsManager
```
<!-- [[wmd]] -->
### is_array
[[@ [Boolean] ErrorsManager:is_array(!?Any value)]]
El método **is_array** es un método estático que verifica si el valor dado es un Array o no, y en caso de estar en entornos como Python, hablamos de si son Listas o Tuplas.
```py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from Assets.ErrorsManager import ErrorsManager
errors_manager:ErrorsManager = ErrorsManager()
print(["Prueba 1", errors_manager.is_array("")])
print(["Prueba 2", errors_manager.is_array("Hola xD")])
print(["Prueba 3", errors_manager.is_array(None)])
print(["Prueba 4", errors_manager.is_array(5)])
print(["Prueba 5", errors_manager.is_array(-8)])
print(["Prueba 6", errors_manager.is_array(-104.56)])
print(["Prueba 7", errors_manager.is_array(6.007)])
print(["Prueba 8", errors_manager.is_array(.345)])
print(["Prueba 9", errors_manager.is_array(ErrorsManager)])
print(["Prueba 10", errors_manager.is_array(errors_manager)])
print(["Prueba 11", errors_manager.is_array(["Esto es un String"])])
print(["Prueba 12", errors_manager.is_array(['S', 't', 'r', 'i', 'n', 'g'])])
print(["Prueba 13", errors_manager.is_array(True)])
print(["Prueba 14", errors_manager.is_array(False)])
print(["Prueba 15", errors_manager.is_array((True,))])
print(["Prueba 16", errors_manager.is_array([2, 45, 18, 24])])
```
```js
"use strict";
/** @type {ErrorsManager} */
const errors_manager = new ErrorsManager();
console.log(["Prueba 1", errors_manager.is_array("")]);
console.log(["Prueba 2", errors_manager.is_array("Hola xD")]);
console.log(["Prueba 3", errors_manager.is_array(null)]);
console.log(["Prueba 4", errors_manager.is_array(5)]);
console.log(["Prueba 5", errors_manager.is_array(-8)]);
console.log(["Prueba 6", errors_manager.is_array(-104.56)]);
console.log(["Prueba 7", errors_manager.is_array(6.007)]);
console.log(["Prueba 8", errors_manager.is_array(.345)]);
console.log(["Prueba 9", errors_manager.is_array(ErrorsManager)]);
console.log(["Prueba 10", errors_manager.is_array(errors_manager)]);
console.log(["Prueba 11", errors_manager.is_array(["Esto es un String"])]);
console.log(["Prueba 12", errors_manager.is_array(['S', 't', 'r', 'i', 'n', 'g'])]);
console.log(["Prueba 13", errors_manager.is_array(true)]);
console.log(["Prueba 14", errors_manager.is_array(false)]);
console.log(["Prueba 15", errors_manager.is_array([true])]);
console.log(["Prueba 16", errors_manager.is_array([2, 45, 18, 24])]);
```
En los ejemplos anteriores sacaríamos los siguientes resultados:
[|
|= Prueba | Python | JavaScript
| 1 | False | false
| 2 | False | false
| 3 | False | false
| 4 | False | false
| 5 | False | false
| 6 | False | false
| 7 | False | false
| 8 | False | false
| 9 | False | false
| 10 | False | false
| 11 | True | true
| 12 | True | true
| 13 | False | false
| 14 | False | false
| 15 | True | true
| 16 | True | true
|]
<!-- [[wmd]] -->

View File

@ -0,0 +1,89 @@
```wmd-options
language = es
title_i18n = errors_manager_title_is_integer
title_text = is_integer - ErrorsManager
```
<!-- [[wmd]] -->
### is_integer
[[@ [Boolean] ErrorsManager:is_integer(!?Any value)]]
El método **is_integer** es un método estático que verifica si el valor dado es un un valor numérico entero o no.
```py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from Assets.ErrorsManager import ErrorsManager
errors_manager:ErrorsManager = ErrorsManager()
print(["Prueba 1", errors_manager.is_integer("")])
print(["Prueba 2", errors_manager.is_integer("Hola xD")])
print(["Prueba 3", errors_manager.is_integer(None)])
print(["Prueba 4", errors_manager.is_integer(5)])
print(["Prueba 5", errors_manager.is_integer(-8)])
print(["Prueba 6", errors_manager.is_integer(-104.56)])
print(["Prueba 7", errors_manager.is_integer(6.007)])
print(["Prueba 8", errors_manager.is_integer(.345)])
print(["Prueba 9", errors_manager.is_integer(ErrorsManager)])
print(["Prueba 10", errors_manager.is_integer(errors_manager)])
print(["Prueba 11", errors_manager.is_integer(["Esto es un String"])])
print(["Prueba 12", errors_manager.is_integer(['S', 't', 'r', 'i', 'n', 'g'])])
print(["Prueba 13", errors_manager.is_integer(True)])
print(["Prueba 14", errors_manager.is_integer(False)])
print(["Prueba 15", errors_manager.is_integer((True,))])
print(["Prueba 16", errors_manager.is_integer([2, 45, 18, 24])])
```
```js
"use strict";
/** @type {ErrorsManager} */
const errors_manager = new ErrorsManager();
console.log(["Prueba 1", errors_manager.is_integer("")]);
console.log(["Prueba 2", errors_manager.is_integer("Hola xD")]);
console.log(["Prueba 3", errors_manager.is_integer(null)]);
console.log(["Prueba 4", errors_manager.is_integer(5)]);
console.log(["Prueba 5", errors_manager.is_integer(-8)]);
console.log(["Prueba 6", errors_manager.is_integer(-104.56)]);
console.log(["Prueba 7", errors_manager.is_integer(6.007)]);
console.log(["Prueba 8", errors_manager.is_integer(.345)]);
console.log(["Prueba 9", errors_manager.is_integer(ErrorsManager)]);
console.log(["Prueba 10", errors_manager.is_integer(errors_manager)]);
console.log(["Prueba 11", errors_manager.is_integer(["Esto es un String"])]);
console.log(["Prueba 12", errors_manager.is_integer(['S', 't', 'r', 'i', 'n', 'g'])]);
console.log(["Prueba 13", errors_manager.is_integer(true)]);
console.log(["Prueba 14", errors_manager.is_integer(false)]);
console.log(["Prueba 15", errors_manager.is_integer([true])]);
console.log(["Prueba 16", errors_manager.is_integer([2, 45, 18, 24])]);
```
En los ejemplos anteriores sacaríamos los siguientes resultados:
[|
|= Prueba | Python | JavaScript
| 1 | False | false
| 2 | False | false
| 3 | False | false
| 4 | True | true
| 5 | True | true
| 6 | False | false
| 7 | False | false
| 8 | False | false
| 9 | False | false
| 10 | False | false
| 11 | False | false
| 12 | False | false
| 13 | False | false
| 14 | False | false
| 15 | False | false
| 16 | False | false
|]
<!-- [[wmd]] -->

View File

@ -0,0 +1,89 @@
```wmd-options
language = es
title_i18n = errors_manager_title_is_string
title_text = is_string - ErrorsManager
```
<!-- [[wmd]] -->
### is_string
[[@ [Boolean] ErrorsManager:is_string(!?Any value)]]
El método **is_string** es un método estático que verifica si el valor dado es un String o no.
```py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from Assets.ErrorsManager import ErrorsManager
errors_manager:ErrorsManager = ErrorsManager()
print(["Prueba 1", errors_manager.is_string("")])
print(["Prueba 2", errors_manager.is_string("Hola xD")])
print(["Prueba 3", errors_manager.is_string(None)])
print(["Prueba 4", errors_manager.is_string(5)])
print(["Prueba 5", errors_manager.is_string(-8)])
print(["Prueba 6", errors_manager.is_string(-104.56)])
print(["Prueba 7", errors_manager.is_string(6.007)])
print(["Prueba 8", errors_manager.is_string(.345)])
print(["Prueba 9", errors_manager.is_string(ErrorsManager)])
print(["Prueba 10", errors_manager.is_string(errors_manager)])
print(["Prueba 11", errors_manager.is_string(["Esto es un String"])])
print(["Prueba 12", errors_manager.is_string(['S', 't', 'r', 'i', 'n', 'g'])])
print(["Prueba 13", errors_manager.is_string(True)])
print(["Prueba 14", errors_manager.is_string(False)])
print(["Prueba 15", errors_manager.is_string((True,))])
print(["Prueba 16", errors_manager.is_string([2, 45, 18, 24])])
```
```js
"use strict";
/** @type {ErrorsManager} */
const errors_manager = new ErrorsManager();
console.log(["Prueba 1", errors_manager.is_string("")]);
console.log(["Prueba 2", errors_manager.is_string("Hola xD")]);
console.log(["Prueba 3", errors_manager.is_string(null)]);
console.log(["Prueba 4", errors_manager.is_string(5)]);
console.log(["Prueba 5", errors_manager.is_string(-8)]);
console.log(["Prueba 6", errors_manager.is_string(-104.56)]);
console.log(["Prueba 7", errors_manager.is_string(6.007)]);
console.log(["Prueba 8", errors_manager.is_string(.345)]);
console.log(["Prueba 9", errors_manager.is_string(ErrorsManager)]);
console.log(["Prueba 10", errors_manager.is_string(errors_manager)]);
console.log(["Prueba 11", errors_manager.is_string(["Esto es un String"])]);
console.log(["Prueba 12", errors_manager.is_string(['S', 't', 'r', 'i', 'n', 'g'])]);
console.log(["Prueba 13", errors_manager.is_string(true)]);
console.log(["Prueba 14", errors_manager.is_string(false)]);
console.log(["Prueba 15", errors_manager.is_string([true])]);
console.log(["Prueba 16", errors_manager.is_string([2, 45, 18, 24])]);
```
En los ejemplos anteriores sacaríamos los siguientes resultados:
[|
|= Prueba | Python | JavaScript
| 1 | True | true
| 2 | True | true
| 3 | True | true
| 4 | False | false
| 5 | False | false
| 6 | False | false
| 7 | False | false
| 8 | False | false
| 9 | False | false
| 10 | False | false
| 11 | False | false
| 12 | False | false
| 13 | False | false
| 14 | False | false
| 15 | False | false
| 16 | False | false
|]
<!-- [[wmd]] -->

View File

@ -0,0 +1,26 @@
```wmd-options
language = es
title_i18n = errors_manager_title_join
title_text = join - ErrorsManager
```
<!-- [[wmd]] -->
### join
[[@ [String] ErrorsManager.set(!String code, !string error, Integer bit = 0, Integer length = 0)]]
El método **join** es un método objeto que nos permite realizar dos acciones:
* Unir dos códigos de error en formato String, el segundo sobre el primero en la posición dada.
* Y también nos permite resetear Bits del código de error a 0.
Ambas funciones de unir códigos y resetear a cero son mezclables, es decir, cuando se une un segundo código de error en formato String, éste se une mediante "OR" al código actual desde la posición que se le determine, por tanto, si lo que se quiere es substituir Bits lo que hay que hacer es pasar a cero los Bits que se crean que vayan a ser alterados.
> [!!] Es importante destacar que en lenguajes de tipados flexibles como JavaScript, esta función puede cubrir no sólo códigos de error en formato numérico String sino también en Integer y Array, y es el motivo por el cual se puede encontrar este método como unificado en dichos entornos. Para este motivo tendríamos la siguiente estructura de método.
[[@ [String] ErrorsManager.join(!(String|Integer|Array<Integer>) code, !(String|Integer|Array<Integer>) error, Integer bit = 0, Integer length = 0)]]
> [!!] Para lenguajes rígidos como los SQL, C#, etc. Para poder integrar otro código de error Integer es necesario llamar al método "set" en vez de a éste, en los lenguajes flexibles puede hacerse uso de ambos.
<!-- [[wmd]] -->

View File

@ -0,0 +1,85 @@
```wmd-options
language = es
title_i18n = errors_manager_title_process
title_text = process - ErrorsManager
```
<!-- [[wmd]] -->
### process
[[@ [Array<Array<Integer, String>>] ErrorsManager.process(!Integer|String|Array<Integer> code, !Array<String> messages)]]
El método **process** es un método objeto que retorna el alfabeto actualmente en uso del objeto ErrorsManager.
```py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from Assets.ErrorsManager import ErrorsManager
i:int
errors_manager:ErrorsManager = ErrorsManager()
error_messages:tuple[str] = ["error_message_" + str(i) for i in range(16)]
print(errors_manager.process(105, error_messages))
print(errors_manager.process("pB", error_messages))
print(errors_manager.process([41, 1], error_messages))
```
```js
"use strict";
/** @type {ErrorsManager} */
const errors_manager = new ErrorsManager(),
/** @type {Array.<String>} */
error_messages = "0123456789abcdef".split("").map((_, i) => "error_message_" + i);
console.log(errors_manager.process(105, error_messages));
console.log(errors_manager.process("pB", error_messages));
console.log(errors_manager.process([41, 1], error_messages));
```
El resultado de estas pruebas es:
[|
|= i | Bit | Mensaje
| 0 | 0 | error_message_0
| 3 | 3 | error_message_3
| 5 | 5 | error_message_5
| 6 | 6 | error_message_6
|]
Esto viene siendo porque el código de error se puede ver de la siguiente forma:
[|
|= Byte | String | Array | Binario
| 0 | p | 41 | 101001
| 1 | B | 1 | 000001
|]
Si unimos todos los valores en un único binario tendríamos:
``105 = \[1, 41] = \[000001, 101001] = 000001101001 = 1101001``
Si miramos las posiciones de los bytes tenemos:
[|
|= Bit | Valor | Mensaje
| 0 | 1 | error_message_0
| 1 | 0 |
| 2 | 0 |
| 3 | 1 | error_message_3
| 4 | 0 |
| 5 | 1 | error_message_5
| 6 | 1 | error_message_6
| 7 | 0 |
| 8 | 0 |
| 9 | 0 |
| 10 | 0 |
| 11 | 0 |
|]
<!-- [[wmd]] -->

View File

@ -0,0 +1,26 @@
```wmd-options
language = es
title_i18n = errors_manager_title_set
title_text = set - ErrorsManager
```
<!-- [[wmd]] -->
### set
[[@ [String] ErrorsManager.set(!String code, !Integer error, Integer bit = 0, Integer length = 0)]]
El método **set** es un método objeto que nos permite realizar dos acciones:
* Establecer un valor numérico a nuestro código de error en formato String actual en una posición específica.
* Y también nos permite resetear Bits del código de error a 0.
Ambas funciones de establecer valor y resetear a cero son mezclables, es decir, cuando se establece un valor, éste se une mediante "OR" al código actual desde la posición que se le determine, por tanto, si lo que se quiere es substituir Bits lo que hay que hacer es pasar a cero los Bits que se crean que vayan a ser alterados.
> [!!] Es importante destacar que en lenguajes de tipados flexibles como JavaScript, esta función puede cubrir no sólo códigos de error en formato numérico entero sino también en String y Array, y es el motivo por el cual se puede encontrar este método como unificado en dichos entornos. Para este motivo tendríamos la siguiente estructura de método.
[[@ [String] ErrorsManager.set(!(String|Integer|Array<Integer>) code, !(String|Integer|Array<Integer>) error, Integer bit = 0, Integer length = 0)]]
> [!!] Para lenguajes rígidos como los SQL, C#, etc. Para poder integrar otro código de error String es necesario llamar al método "join" en vez de a éste, en los lenguajes flexibles puede hacerse uso de ambos.
<!-- [[wmd]] -->

View File

@ -0,0 +1,54 @@
```wmd-options
language = es
title_i18n = errors_manager_title_set_alphabet
title_text = set_alphabet - ErrorsManager
```
<!-- [[wmd]] -->
### set_alphabet
[[@ ErrorsManager.set_alphabet(?!String alphabet)]]
El método **set_alphabet** es un método objeto para establecer de forma externa al objeto, el alfabeto que determinará el código resultante de error y que condicionará su interpretación. Dicha función tendrá de entrada la nueva cadena la cual será un String de al menos 64 caracteres, y éstos han de ser distintos entre sí o funcionará mal. No hay retorno.
```py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from Assets.ErrorsManager import ErrorsManager
errors_manager:ErrorsManager = ErrorsManager()
nuevo_alfabeto:str = "qwertyuiopasdfghjklzxcvbnm1234567890QWERTYUIOPASDFGHJKLZXCVBNM+/"
# Imprime el alfabeto por defecto.
print(errors_manager.get_alphabet())
errors_manager.set_alphabet(nuevo_alfabeto)
# Imprime el nuevo alfabeto con su nuevo orden.
print(errors_manager.get_alphabet())
```
```js
"use strict";
/** @type {ErrorsManager} */
const errors_manager = new ErrorsManager(),
/** @type {String} */
nuevo_alfabeto = "qwertyuiopasdfghjklzxcvbnm1234567890QWERTYUIOPASDFGHJKLZXCVBNM+/";
// Imprime el alfabeto por defecto.
console.log(errors_manager.get_alphabet());
errors_manager.set_alphabet(nuevo_alfabeto);
// Imprime el nuevo alfabeto con su nuevo orden.
console.log(errors_manager.get_alphabet());
```
> [!!] Se pueden cambiar los caracteres por otros que no sean necesariamente de base64, sin embargo, hay que tener en cuenta la compatibilidad entre plataformas e interpretación de dichos caracteres tanto en el traspaso de una plataforma a otra así como en la capacidad del lenguaje que se esté trabajando. Se aconseja ir siempre a la parte más restrictiva del proyecto.
<!-- [[wmd]] -->

View File

@ -0,0 +1,26 @@
```wmd-options
language = es
title_i18n = errors_manager_title_set_blocks
title_text = set_blocks - ErrorsManager
```
<!-- [[wmd]] -->
### set_blocks
[[@ [String] ErrorsManager.set_blocks(!String code, !Array.<Integer> blocks, Integer bit = 0, Integer length = 0)]]
El método **set_blocks** es un método objeto que nos permite realizar dos acciones:
* Establecer uno o más códigos de error en formato Integer sobre otro en formato String ya dado.
* Y también nos permite resetear Bits del código de error a 0.
Ambas funciones de establecer valor y resetear a cero son mezclables, es decir, cuando se establece un valor, éste se une mediante "OR" al código actual desde la posición que se le determine, por tanto, si lo que se quiere es substituir Bits lo que hay que hacer es pasar a cero los Bits que se crean que vayan a ser alterados.
> [!!] Es importante destacar que en lenguajes de tipados flexibles como JavaScript, esta función puede cubrir no sólo códigos de error en formato numérico entero sino también en String y Array, y es el motivo por el cual se puede encontrar este método como unificado en dichos entornos. Para este motivo tendríamos la siguiente estructura de método.
[[@ [String] ErrorsManager.set(!(String|Integer|Array<Integer>) code, !(String|Integer|Array<Integer>) error, Integer bit = 0, Integer length = 0)]]
> [!!] Para lenguajes rígidos como los SQL, C#, etc. Para poder integrar otro código de error String es necesario llamar al método "join" en vez de a éste, en los lenguajes flexibles puede hacerse uso de ambos.
<!-- [[wmd]] -->

View File

@ -0,0 +1,53 @@
```wmd-options
language = es
title_i18n = errors_manager_title_to_array
title_text = to_array - ErrorsManager
```
<!-- [[wmd]] -->
### to_array
[[@ [Array<Integer>] ErrorsManager.to_array(!Integer|String|Array<Integer> code, Integer length)]]
El método **to_array** es un método objeto que transforma un código de error cualquiera en un código de error de tipo Array con la opción de especificar bits de relleno con 0.
```py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from Assets.ErrorsManager import ErrorsManager
errors_manager:ErrorsManager = ErrorsManager()
print(errors_manager.to_array(105))
print(errors_manager.to_array("pB"))
print(errors_manager.to_array([41, 1]))
print(errors_manager.to_array(105, 20))
print(errors_manager.to_array("pB", 20))
print(errors_manager.to_array([41, 1], 20))
```
```js
"use strict";
/** @type {ErrorsManager} */
const errors_manager = new ErrorsManager();
console.log(errors_manager.to_array(105));
console.log(errors_manager.to_array("pB"));
console.log(errors_manager.to_array([41, 1]));
console.log(errors_manager.to_array(105, 20));
console.log(errors_manager.to_array("pB", 20));
console.log(errors_manager.to_array([41, 1], 20));
```
La respuesta en 3 primeros casos sería el Array \[41, 1], mientras que en los otros 3 sería \[41, 1, 0, 0].
> [!!] Si se especifica el valor "length", éste rellenará el Array con tantos 0 como requiera.
<!-- [[wmd]] -->

View File

@ -0,0 +1,45 @@
```wmd-options
language = es
title_i18n = errors_manager_title_to_array_binary
title_text = to_array_binary - ErrorsManager
```
<!-- [[wmd]] -->
### to_array_binary
[[@ [Array<String>] ErrorsManager.to_array_binary(!Integer|String|Array<Integer> code)]]
El método **to_array_binary** es un método objeto que transforma un código de error cualquiera en un Array de hexas en binario en formato String.
```py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from Assets.ErrorsManager import ErrorsManager
errors_manager:ErrorsManager = ErrorsManager()
print(errors_manager.to_array_binary(105))
print(errors_manager.to_array_binary("pB"))
print(errors_manager.to_array_binary([41, 1]))
```
```js
"use strict";
/** @type {ErrorsManager} */
const errors_manager = new ErrorsManager();
console.log(errors_manager.to_array_binary(105));
console.log(errors_manager.to_array_binary("pB"));
console.log(errors_manager.to_array_binary([41, 1]));
```
La respuesta en todos los casos sería el Array \["101001", "000001"].
> [!!] El valor devuelto por este método no es trabajable como código de error pues sólo existe a modo de comprobaciones.
<!-- [[wmd]] -->

View File

@ -0,0 +1,45 @@
```wmd-options
language = es
title_i18n = errors_manager_title_to_integer
title_text = to_integer - ErrorsManager
```
<!-- [[wmd]] -->
### to_integer
[[@ [Integer] ErrorsManager.to_integer(!Integer|String|Array<Integer> code)]]
El método **to_integer** es un método objeto que transforma un código de error cualquiera en un código de error de tipo Integer.
```py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from Assets.ErrorsManager import ErrorsManager
errors_manager:ErrorsManager = ErrorsManager()
print(errors_manager.to_integer(105))
print(errors_manager.to_integer("pB"))
print(errors_manager.to_integer([41, 1]))
```
```js
"use strict";
/** @type {ErrorsManager} */
const errors_manager = new ErrorsManager();
console.log(errors_manager.to_integer(105));
console.log(errors_manager.to_integer("pB"));
console.log(errors_manager.to_integer([41, 1]));
```
La respuesta en todos los casos sería el valor numérico entero 105.
> [!! IMPORTANTE] Si el código de error tiene más Bits de los que puede trabajar el lenguaje donde se encuentra la librería, éste detendrá el proceso con una Excepción.
<!-- [[wmd]] -->

View File

@ -0,0 +1,53 @@
```wmd-options
language = es
title_i18n = errors_manager_title_to_string
title_text = to_string - ErrorsManager
```
<!-- [[wmd]] -->
### to_string
[[@ [String] ErrorsManager.to_string(!Integer|String|Array<Integer> code, Integer length)]]
El método **to_string** es un método objeto que transforma un código de error cualquiera en un código de error de tipo String con la opción de especificar bits de relleno con el equivalente a 0 en el alfabeto seleccionado.
```py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from Assets.ErrorsManager import ErrorsManager
errors_manager:ErrorsManager = ErrorsManager()
print(errors_manager.to_string(105))
print(errors_manager.to_string("pB"))
print(errors_manager.to_string([41, 1]))
print(errors_manager.to_string(105, 20))
print(errors_manager.to_string("pB", 20))
print(errors_manager.to_string([41, 1], 20))
```
```js
"use strict";
/** @type {ErrorsManager} */
const errors_manager = new ErrorsManager();
console.log(errors_manager.to_string(105));
console.log(errors_manager.to_string("pB"));
console.log(errors_manager.to_string([41, 1]));
console.log(errors_manager.to_string(105, 20));
console.log(errors_manager.to_string("pB", 20));
console.log(errors_manager.to_string([41, 1], 20));
```
La respuesta en 3 primeros casos sería el String "pB", mientras que en los otros 3 sería "pBAA".
> [!!] Si se especifica el valor "length", éste rellenará el String con tantos caracteres equivalentes a 0 como requiera. En el caso de ser el alfabeto por defecto, es decir, un Base64, el caracter equivalente a 0 es el caracter "A".
<!-- [[wmd]] -->

View File

@ -0,0 +1,59 @@
```wmd-options
language = es
title_i18n = errors_manager_title_to_unknown
title_text = to_unknown - ErrorsManager
```
<!-- [[wmd]] -->
### to_unknown
[[@ [Any|null] ErrorsManager.to_unknown(?Any code)]]
El método **to_unknown** es un método objeto que sirve para ejecutar en caso de ser un tipado no conocido por la librería como código de error. Básicamente retorna el mismo valor que se le da.
```py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from Assets.ErrorsManager import ErrorsManager
errors_manager:ErrorsManager = ErrorsManager()
print(["Prueba 1", errors_manager.to_unknown(105)])
print(["Prueba 2", errors_manager.to_unknown("pB")])
print(["Prueba 3", errors_manager.to_unknown([41, 1])])
print(["Prueba 4", errors_manager.to_unknown(None)])
print(["Prueba 5", errors_manager.to_unknown(errors_manager)])
print(["Prueba 5", errors_manager.to_unknown(True)])
```
```js
"use strict";
/** @type {ErrorsManager} */
const errors_manager = new ErrorsManager();
console.log(["Prueba 1", errors_manager.to_unknown(105)]);
console.log(["Prueba 2", errors_manager.to_unknown("pB")]);
console.log(["Prueba 3", errors_manager.to_unknown([41, 1])]);
console.log(["Prueba 4", errors_manager.to_unknown(null)]);
console.log(["Prueba 5", errors_manager.to_unknown(errors_manager)]);
console.log(["Prueba 5", errors_manager.to_unknown(true)]);
```
Los resultados serían los siguientes:
[|
|= Prueba | Python | Javascript
| 1 || 105
| 2 || "pB"
| 3 || \[41, 1]
| 4 | None | null
| 5 || errors_manager\[ErrorsManager]
| 6 | True | true
|]
<!-- [[wmd]] -->

View File

@ -0,0 +1,96 @@
```wmd-options
language = es
title_i18n = errors_manager_title_type
title_text = type - ErrorsManager
```
<!-- [[wmd]] -->
### type
[[@ [String] ErrorsManager:type(!?Any value)]]
El método **type** es un método estático que retorna el tipado de una variable con respecto a si es:
* **[[!string]]**: Si es un texto.
* **[[!integer]]**: Si es un valor numérico entero.
* **[[!array]]**: Si es un Array, Vector, Lista, Tupla, etc. De valores numéricos enteros.
* **[[!unknown]]**: Si no es ninguno de los tipos anteriores.
> [!!] La librería sólo trabaja los tipados String, Integer y Array de enteros. Si es otro tipado, ésta lo tomará como desconocido y lo tratará como algo inesperado o un error, pero no hará saltar una Excepción.
```py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from Assets.ErrorsManager import ErrorsManager
errors_manager:ErrorsManager = ErrorsManager()
print(["Prueba 1", errors_manager.type("")])
print(["Prueba 2", errors_manager.type("Hola xD")])
print(["Prueba 3", errors_manager.type(None)])
print(["Prueba 4", errors_manager.type(5)])
print(["Prueba 5", errors_manager.type(-8)])
print(["Prueba 6", errors_manager.type(-104.56)])
print(["Prueba 7", errors_manager.type(6.007)])
print(["Prueba 8", errors_manager.type(.345)])
print(["Prueba 9", errors_manager.type(ErrorsManager)])
print(["Prueba 10", errors_manager.type(errors_manager)])
print(["Prueba 11", errors_manager.type(["Esto es un String"])])
print(["Prueba 12", errors_manager.type(['S', 't', 'r', 'i', 'n', 'g'])])
print(["Prueba 13", errors_manager.type(True)])
print(["Prueba 14", errors_manager.type(False)])
print(["Prueba 15", errors_manager.type((True,))])
print(["Prueba 16", errors_manager.type([2, 45, 18, 24])])
```
```js
"use strict";
/** @type {ErrorsManager} */
const errors_manager = new ErrorsManager();
console.log(["Prueba 1", errors_manager.type("")]);
console.log(["Prueba 2", errors_manager.type("Hola xD")]);
console.log(["Prueba 3", errors_manager.type(null)]);
console.log(["Prueba 4", errors_manager.type(5)]);
console.log(["Prueba 5", errors_manager.type(-8)]);
console.log(["Prueba 6", errors_manager.type(-104.56)]);
console.log(["Prueba 7", errors_manager.type(6.007)]);
console.log(["Prueba 8", errors_manager.type(.345)]);
console.log(["Prueba 9", errors_manager.type(ErrorsManager)]);
console.log(["Prueba 10", errors_manager.type(errors_manager)]);
console.log(["Prueba 11", errors_manager.type(["Esto es un String"])]);
console.log(["Prueba 12", errors_manager.type(['S', 't', 'r', 'i', 'n', 'g'])]);
console.log(["Prueba 13", errors_manager.type(true)]);
console.log(["Prueba 14", errors_manager.type(false)]);
console.log(["Prueba 15", errors_manager.type([true])]);
console.log(["Prueba 16", errors_manager.type([2, 45, 18, 24])]);
```
En los ejemplos anteriores sacaríamos los siguientes resultados:
[|
|= Prueba | Python | JavaScript
| 1 | [[!string]] | [[!string]]
| 2 | [[!string]] | [[!string]]
| 3 | [[!unknown]] | [[!unknown]]
| 4 | [[!integer]] | [[!integer]]
| 5 | [[!integer]] | [[!integer]]
| 6 | [[!unknown]] | [[!unknown]]
| 7 | [[!unknown]] | [[!unknown]]
| 8 | [[!unknown]] | [[!unknown]]
| 9 | [[!unknown]] | [[!unknown]]
| 10 | [[!unknown]] | [[!unknown]]
| 11 | [[!array]] | [[!array]]
| 12 | [[!array]] | [[!array]]
| 13 | [[!unknown]] | [[!unknown]]
| 14 | [[!unknown]] | [[!unknown]]
| 15 | [[!array]] | [[!array]]
| 16 | [[!array]] | [[!array]]
|]
<!-- [[wmd]] -->

View File

@ -0,0 +1,17 @@
```wmd-options
language = es
title_i18n = errors_manager_title_opinions
title_text = Opiniones y comentarios - ErrorsManager
```
<!-- [[wmd]] -->
## Opiniones y comentarios
Esta sección va dedicada a publicar las opiniones y comentarios de usuarios cercanos a los desarrolladores del proyecto para que halla una visión externa a éste, aprobechando la confianza en éstos tanto para lo bueno como para lo malo.
> [!@Srx00] Quería agradecer personalmente a todos aquellos que me han dado una opinión y/o comentario acerca de este proyecto. Lo valoro mucho pues sea como crítica para aprender como apoyo a continuar con este tipo de trabajos, me son realmente importantes. ¡Muchas gracias!
> [!@Srx00] Como opinión personal, es un proyecto raro, que le da mayor complejidad a la aplicación en desarrollo como cuando le metes cualquier librería que añade una nueva funcionalidad, sin embargo, es cierto que si lo vemos desde el punto de vista de la gestión de errores, creo, a nivel personal, por mi experiencia, que éste puede ser una herramienta fuerte para gestionar los errores tanto a nivel local como entre plataformas o diferentes entornos del lenguaje dentro de un mismo proyecto, sin embargo, creo de vital importancia destacar que si se puede omitir el uso de dichas funciones, por ejemplo, para aquellos errores que contengan menos de 28 verificaciones, ahorraría tanto coste de dificultad como coste de proceso. Al ser una herramienta compatible directamente con enteros, es una forma de darle eficiencia a tu proyecto y no rompería mucho la estructura de funcionamiento con esta librería en la medida de lo posible.
<!-- [[wmd]] -->

View File

@ -0,0 +1,48 @@
```wmd-options
language = es
title_i18n = errors_manager_title_projects
title_text = Proyectos - ErrorsManager
```
<!-- [[wmd]] -->
## Proyectos
Este proyecto es independiente a nivel de funcionamiento como librería, independientemente del lenguaje que se esté utilizando, sin embargo, a nivel de página Web, éste hace uso de los siguientes proyectos.
[["""
WMarkDown
*https://wmarkdown.k3y.pw/images/WMarkDown.png
*https://wmarkdown.k3y.pw/favicon.ico
https://wmarkdown.k3y.pw/
https://git.k3y.pw/Whalers/WMarkDown
AnP
*https://anp.k3y.pw/images/AnP.png
*https://anp.k3y.pw/images/AnP-512.png
*https://anp.k3y.pw/favicon.ico
https://anp.k3y.pw/
https://git.k3y.pw/AnP/AnP
CDN de KyMAN
*https://cdn.k3y.pw/images/CDN.png
*https://cdn.k3y.pw/images/CDN-512.png
*https://cdn.k3y.pw/favicon.ico
https://cdn.k3y.pw/
https://git.k3y.pw/KyMAN/CDN
"""]]
> [!#] Dicho proyecto hereda de otros proyectos a partir de los aquí presentados, por ejemplo, a partir del WMarkDown hereda del MathJAX, highlight.js y MermaidJS de JavaScript, entre otros. Si vais al proyecto WMarkDown podréis ver más información acerca de dichas dependencias.
Por otro lado, este proyecto es usado en proyectos tales como los siguientes:
[["""
AnP
*https://anp.k3y.pw/images/AnP.png
*https://anp.k3y.pw/images/AnP-512.png
*https://anp.k3y.pw/favicon.ico
https://anp.k3y.pw/
https://git.k3y.pw/AnP/AnP
"""]]
> [!#] Al ser un proyecto para uso tan crudo y básico, éste puede aparecer en proyectos de los cuales herede para funciones como la Web o servicio de servidor, entre otros.
<!-- [[wmd]] -->

168
Public/doc/es/targets.w.md Normal file
View File

@ -0,0 +1,168 @@
```wmd-options
language = es
title_i18n = errors_manager_title_targets
title_text = Objetivos - ErrorsManager
```
<!-- [[wmd]] -->
## Objetvos
Para ver el estado del proyecto con respecto a lo que sería el objetivo final, tenemos lo siguiente:
+ [-] Crear diseño y logo.
+ [X] Código de colores \(El mismo que AnP).
+ [X] Crear diseño \(El mismo que WMarkDown).
+ [ ] Crear logo.
+ [-] Montar la documentación.
+ [-] Documentación general.
+ [ ] Documentación de la librería.
- [X] Python.
+ [X] Función *set_alphabet*.
+ [X] Función *get_alphabet*.
+ [X] Función *process*.
+ [X] Función *bits*.
+ [X] Función *to_array*.
+ [X] Función *to_array_binary*.
+ [X] Función *to_integer*.
+ [X] Función *to_string*.
+ [X] Función *has*.
+ [X] Función *to_unknown*.
+ [X] Función *compact*.
+ [X] Función *[[!bitwise]]*.
+ [X] Función *set*.
+ [X] Función *join*.
+ [X] Función *set_blocks*.
+ [X] Función *slice*.
+ [X] Función *has_range*.
+ [X] Función *is_string*.
+ [X] Función *is_integer*.
+ [X] Función *is_array*.
+ [X] Función *type*.
- [ ] PHP.
+ [ ] Función *set_alphabet*.
+ [ ] Función *get_alphabet*.
+ [ ] Función *process*.
+ [ ] Función *bits*.
+ [ ] Función *to_array*.
+ [ ] Función *to_array_binary*.
+ [ ] Función *to_integer*.
+ [ ] Función *to_string*.
+ [ ] Función *has*.
+ [ ] Función *to_unknown*.
+ [ ] Función *compact*.
+ [ ] Función *[[!bitwise]]*.
+ [ ] Función *set*.
+ [ ] Función *join*.
+ [ ] Función *set_blocks*.
+ [ ] Función *slice*.
+ [ ] Función *has_range*.
+ [ ] Función *is_string*.
+ [ ] Función *is_integer*.
+ [ ] Función *is_array*.
+ [ ] Función *type*.
- [ ] C#.
+ [ ] Función *set_alphabet*.
+ [ ] Función *get_alphabet*.
+ [ ] Función *process*.
+ [ ] Función *bits*.
+ [ ] Función *to_array*.
+ [ ] Función *to_array_binary*.
+ [ ] Función *to_integer*.
+ [ ] Función *to_string*.
+ [ ] Función *has*.
+ [ ] Función *to_unknown*.
+ [ ] Función *compact*.
+ [ ] Función *[[!bitwise]]*.
+ [ ] Función *set*.
+ [ ] Función *join*.
+ [ ] Función *set_blocks*.
+ [ ] Función *slice*.
+ [ ] Función *has_range*.
+ [ ] Función *is_string*.
+ [ ] Función *is_integer*.
+ [ ] Función *is_array*.
+ [ ] Función *type*.
- [X] JavaScript/ECMAScript.
+ [X] Función *set_alphabet*.
+ [X] Función *get_alphabet*.
+ [X] Función *process*.
+ [X] Función *bits*.
+ [X] Función *to_array*.
+ [X] Función *to_array_binary*.
+ [X] Función *to_integer*.
+ [X] Función *to_string*.
+ [X] Función *has*.
+ [X] Función *to_unknown*.
+ [X] Función *compact*.
+ [X] Función *[[!bitwise]]*.
+ [X] Función *set*.
+ [X] Función *join*.
+ [X] Función *set_blocks*.
+ [X] Función *slice*.
+ [X] Función *has_range*.
+ [X] Función *is_string*.
+ [X] Función *is_integer*.
+ [X] Función *is_array*.
+ [X] Función *type*.
- [ ] MySQL/MariaDB.
+ [ ] Función *set_alphabet*.
+ [ ] Función *get_alphabet*.
+ [ ] Función *process*.
+ [ ] Función *bits*.
+ [ ] Función *to_array*.
+ [ ] Función *to_array_binary*.
+ [ ] Función *to_integer*.
+ [ ] Función *to_string*.
+ [ ] Función *has*.
+ [ ] Función *to_unknown*.
+ [ ] Función *compact*.
+ [ ] Función *[[!bitwise]]*.
+ [ ] Función *set*.
+ [ ] Función *join*.
+ [ ] Función *set_blocks*.
+ [ ] Función *slice*.
+ [ ] Función *has_range*.
- [ ] SQLServer.
+ [ ] Función *set_alphabet*.
+ [ ] Función *get_alphabet*.
+ [ ] Función *process*.
+ [ ] Función *bits*.
+ [ ] Función *to_array*.
+ [ ] Función *to_array_binary*.
+ [ ] Función *to_integer*.
+ [ ] Función *to_string*.
+ [ ] Función *has*.
+ [ ] Función *to_unknown*.
+ [ ] Función *compact*.
+ [ ] Función *[[!bitwise]]*.
+ [ ] Función *set*.
+ [ ] Función *join*.
+ [ ] Función *set_blocks*.
+ [ ] Función *slice*.
+ [ ] Función *has_range*.
- [ ] Rust.
+ [ ] Función *set_alphabet*.
+ [ ] Función *get_alphabet*.
+ [ ] Función *process*.
+ [ ] Función *bits*.
+ [ ] Función *to_array*.
+ [ ] Función *to_array_binary*.
+ [ ] Función *to_integer*.
+ [ ] Función *to_string*.
+ [ ] Función *has*.
+ [ ] Función *to_unknown*.
+ [ ] Función *compact*.
+ [ ] Función *[[!bitwise]]*.
+ [ ] Función *set*.
+ [ ] Función *join*.
+ [ ] Función *set_blocks*.
+ [ ] Función *slice*.
+ [ ] Función *has_range*.
+ [ ] Función *is_string*.
+ [ ] Función *is_integer*.
+ [ ] Función *is_array*.
+ [ ] Función *type*.
+ [ ] Subir y publicar el proyecto.
<!-- [[wmd]] -->

View File

@ -0,0 +1,489 @@
/**
* @param {string|Array.<string>} [alphabet]
* @returns {void}
* @access public
*/
const ErrorsManager = function(alphabet){
/** @type {ErrorsManager} */
const self = this;
/** @type {number} */
let error = 0;
// /** @type {RegExp|null} */
// let re_hexa_error = null;
/**
* @returns {void}
* @access public
*/
const constructor = () => {
self.set_alphabet(alphabet);
};
/**
* @param {!(string|Array.<string>)} new_alphabet
* @returns {number}
* @access public
*/
this.set_alphabet = new_alphabet => {
error = (
new_alphabet === undefined ? 0 :
new_alphabet === null ? 0 :
!ErrorsManager.prototype.is_string(new_alphabet) && !ErrorsManager.prototype.is_array(new_alphabet) ? 1 << 2 :
0) << 1;
if(!error){
if(new_alphabet){
/** @type {number} */
const original_length = new_alphabet.length,
/** @type {number} */
final_length = (new_alphabet = (new_alphabet instanceof Array ? new_alphabet : new_alphabet.split("")).filter((character, i) => (
ErrorsManager.prototype.is_string(character) && character.length == 1 && new_alphabet.indexOf(character) == i
))).length;
error |= (
original_length != final_length ? 1 << 0 :
final_length < 64 ? 1 << 1 :
0) << 5;
};
};
alphabet = error || !new_alphabet ? (
alphabet && alphabet.length ? alphabet :
ErrorsManager.prototype.BASE64) : new_alphabet;
// re_hexa_error = new RegExp("[^" + alphabet[0] + "]");
return error;
};
/**
* @param {!(string|number|Array.<number>)} code
* @param {!number} [length = 0]
* @returns {Array.<number>}
* @access public
*/
this.to_array = (code, length = 0) => {
/** @type {Array.<number>} */
let array = [];
if(ErrorsManager.prototype.is_string(code))
array = code.split("").map(hexa => alphabet.indexOf(hexa));
else if(ErrorsManager.prototype.is_integer(code)){
while(code){
array.push(code & 0x3F);
code >>>= 6;
};
}else if(ErrorsManager.prototype.is_array(code))
array = [].concat(code);
while(array.length < length)
array.push(0);
return array && array.length ? array : [0];
};
/**
* @param {!(number|string|Array.<number>)} error
* @param {!Array.<string|null>} messages
* @returns {Array.<string>}
* @access public
*/
this.process = (error, messages) => {
/** @type {Array.<string>} */
const response = [],
/** @type {number} */
m = messages.length,
/** @type {Array.<number>} */
array_error = self.to_array(error),
/** @type {number} */
l = array_error.length;
for(let i = 0; i < l; i ++)
for(let j = 0; j < 6; j ++)
if(array_error[i] & (1 << j)){
/** @type {number} */
const k = j + i * 6;
response.push([k, k < m && messages[k] ? messages[k] : "error_message_" + k]);
};
return response;
};
/**
* @returns {Array.<string>}
* @access public
*/
this.get_alphabet = () => alphabet.join("");
/**
* @param {!(string|number|Array.<number>)} code
* @returns {number}
* @access public
*/
this.bits = code => {
if(ErrorsManager.prototype.is_integer(code))
return code ? Math.log2(code) : 1;
ErrorsManager.prototype.is_string(code) && (code = self.to_array(code));
if(ErrorsManager.prototype.is_array(code))
return !(code = self.compact(code)).length || !code[code.length - 1] ? 1 : (code.length - 1) * 6 + (Math.log2(code[code.length - 1]) + 1 >> 0);
return null;
};
/**
* @param {!(string|number|Array.<number>)} code
* @returns {Array.<string>}
* @access public
*/
this.to_array_binary = code => (code = self.to_array(code)).map(hexa => ("000000" + hexa.toString(2)).slice(-6));
/**
* @param {!(string|number|Array.<number>)} code
* @returns {number}
* @access public
*/
this.to_integer = code => {
if(ErrorsManager.prototype.is_integer(code))
return code;
if(ErrorsManager.prototype.is_array(code))
return code.length ? code.length > 1 ? code.reduce((total, hexa, i) => total | (hexa << i * 6)) : code[0] : 0;
if(!ErrorsManager.prototype.is_string(code))
return 0;
return code ? code.length > 1 ? code.split("").reduce((total, hexa, i) => (i > 1 ? total : alphabet.indexOf(total)) | (alphabet.indexOf(hexa) << i * 6)) : alphabet.indexOf(code) : 0;
};
/**
* @param {!(string|number|Array.<number>)} code
* @param {!number} [length = 0]
* @returns {string}
* @access public
*/
this.to_string = (code, length = 0) => {
/** @type {string} */
let string = "";
if(ErrorsManager.prototype.is_string(code))
string = code;
else{
if(ErrorsManager.prototype.is_integer(code)){
while(code){
string += alphabet[code & 0x3F];
code >>>= 6;
};
}else if(ErrorsManager.prototype.is_array(code))
string = code.length ? code.length > 1 ? code.reduce((total, hexa, i) => (i > 1 ? total : alphabet[total]) + alphabet[hexa]) : alphabet[code[0]] : alphabet[0];
};
while(string.length < length)
string += alphabet[0];
return string || alphabet[0];
};
/**
* @param {!(string|number|Array.<number>)} code
* @param {!(number|Array.<number>)} [bits]
* @returns {boolean|null}
* @access public
*/
this.has = (code, bits) => {
if(!ErrorsManager.prototype.is_integer(bits) && !ErrorsManager.prototype.is_array(bits))
return (
ErrorsManager.prototype.is_string(code) ? code.split("").some(hexa => hexa != alphabet[0]) :
ErrorsManager.prototype.is_integer(code) ? !!code :
ErrorsManager.prototype.is_array(code) ? code.some(hexa => !!hexa) :
null);
/** @type {Array.<number>} */
const error = self.to_array(code),
/** @type {number} */
l = error.length * 6;
return l ? (
AnP.prototype.is_array(bits) ? bits : [bits]
).some(bit => bit <= l && error[bit / 6 >> 0] & (1 << bit % 6)) : false;
};
/**
* @param {?any} code
* @returns {any|null}
* @access public
*/
this.to_unknown = code => code;
/**
* @param {!(string|number|Array.<number>)} code
* @returns {string|number|Array.<number>}
* @access public
*/
this.compact = code => {
if(ErrorsManager.prototype.is_string(code)){
while(code && code[code.length - 1] == alphabet[0])
code = code.substr(0, code.length - 1);
return code || alphabet[0];
};
if(ErrorsManager.prototype.is_array(code)){
code = [].concat(code);
while(code.length && !code[code.length - 1])
code.pop();
return code.length ? code : [0];
};
if(ErrorsManager.prototype.is_integer(code))
return code;
return 0;
};
/**
* @param {!(string|number|Array.<number>)} code
* @param {!number} bits
* @returns {string|number|Array.<number>}
* @access public
*/
this.bitwise = (code, bits) => {
if(!bits || !self.has(code))
return code;
/** @type {boolean} */
const reverse = bits < 0,
/** @type {number} */
start = (reverse ? bits *= -1 : bits) / 6 >> 0,
/** @type {number} */
rest = bits % 6,
/** @type {string} */
type_method = "to_" + ErrorsManager.prototype.type(code);
if(reverse){
code = self.to_string(code).substring(start);
if(rest){
if(code){
/** @type {number} */
const l = (code = self.to_array(code)).length - 1,
/** @type {number} */
r = 6 - rest,
/** @type {number} */
block = ~-(1 << rest);
for(let i = 0; i < l; i ++)
code[i] = (code[i] >> rest) | ((code[i + 1] & block) << r);
code[l] >>= rest;
}else
code = [0];
};
}else{
code = self.to_array(code);
if(rest){
/** @type {Array.<number>} */
const block = [~-(1 << (r = 6 - rest)), ~-(1 << rest) << r],
/** @type {number} */
l = code.length - 1,
/** @type {number} */
last = (code[l] & block[1]) >> r;
last && (code[l + 1] = last);
for(let i = l; i > 0; i --)
code[i] = ((code[i] & block[0]) << rest) | (code[i - 1] >> r);
code[0] = (code[0] & block[0]) << rest;
};
for(let i = 0; i < start; i ++)
code.unshift(0);
};
return self[type_method](code);
};
/**
* @param {!(string|number|Array.<number>)} code
* @param {!(string|number|Array.<number>)} error
* @param {!number} [bit = 0]
* @param {!number} [length = 0]
* @returns {string}
* @access public
*/
this.set = (code, error, bit = 0, length = 0) => {
code = self.to_array(code);
error = self.to_array(error);
bit && (error = self.bitwise(error, bit));
/** @type {number} */
let i = bit / 6 >> 0;
if(length){
/** @type {Array.<number>} */
const ampersand = [],
/** @type {number} */
start = bit % 6,
/** @type {number} */
m = (length + start) / 6 >> 0,
/** @type {number} */
end = (start + length) % 6;
for(let j = 0; j < m; j ++)
ampersand.push(0);
ampersand[0] |= ~-(1 << start);
end && ampersand.push(~-(1 << (6 - end)) << end);
ampersand.forEach((hexa, j) => code[j + i] &= hexa);
};
if(has(error)){
/** @type {number} */
const l = error.length;
while(code.length <= i)
code.push(0);
for(; i < l; i ++)
code[i] = (code[i] || 0) | error[i];
};
return self.compact(self.to_string(code));
};
/**
* @param {!(string|number|Array.<number>)} code
* @param {!(string|number|Array.<number>)} error
* @param {!number} [bit = 0]
* @param {!number} [length = 0]
* @returns {string}
* @access public
*/
this.join = (code, error, bit = 0, length = 0) => self.set(code, error, bit, length);
/**
* @param {!(string|number|Array.<number>)} code
* @param {!Array.<string|number|Array.<number>>} blocks
* @param {!number} [bit = 0]
* @param {!number} [length = 0]
* @returns {string}
* @access public
*/
this.set_blocks = (code, blocks, bit = 0, length = 0) => {
/** @type {number} */
const l = blocks.length;
length && (code = self.set(code, 0, bit, length));
for(let i = 0; i < l; i ++)
blocks[i] && (code = self.set(code, blocks[i], bit));
return code || alphabet[0];
};
/**
* @param {!(string|number|Array.<number>)} code
* @param {!number} _from
* @param {!number} [_to = 0]
* @returns {string|number|Array.<number>|null}
* @access public
*/
this.slice = (code, _from, _to = 0) => {
if(!self.has(code))
return code;
/** @type {number} */
const bits = self.bits(code);
/** @type {number} */
let rest;
_from < 0 && (_from = bits + _from);
_to = (
_to > bits ? bits :
_to < 0 ? bits - _to :
_to) - _from;
rest = _to % 6;
code = self.bitwise(code, -_from);
return (
ErrorsManager.prototype.is_string(code) ? code.slice(0, _to / 6 >> 0) + (rest ? alphabet[alphabet.indexOf(code.slice(-1)) & ~-(1 << rest)] : "") :
ErrorsManager.prototype.is_array(code) ? code.slice(0, _to / 6 >> 0).concat(rest ? [code[code.length - 1] & ~-(1 << rest)] : []) :
ErrorsManager.prototype.is_integer(code) ? code & ~-(1 << _to) :
null);
};
/**
* @param {!(string|number|Array.<number>)} code
* @param {!number} _from
* @param {!number} [_to = 0]
* @returns {boolean}
* @access public
*/
this.has_range = (code, _from, _to = 0) => self.has(self.slice(code, _from, _to));
constructor();
};
/** @type {Array.<string>} */
ErrorsManager.prototype.BASE64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".split("");
/**
* @param {?any} value
* @returns {boolean}
* @access public
* @static
*/
ErrorsManager.prototype.is_string = value => typeof value == "string";
/**
* @param {?any} value
* @returns {boolean}
* @access public
* @static
*/
ErrorsManager.prototype.is_integer = value => typeof value == "number" && value == value >> 0;
/**
* @param {?any} value
* @returns {boolean}
* @access public
* @static
*/
ErrorsManager.prototype.is_array = value => typeof value == "object" && value instanceof Array;
/**
* @param {!(string|number|Array.<number>)} code
* @returns {string}
* @access public
* @static
*/
ErrorsManager.prototype.type = code => {
/** @type {Array.<string>} */
const types = ["string", "integer", "array"];
for(let i = 0; i < 3; i ++)
if(ErrorsManager.prototype["is_" + types[i]](code))
return types[i];
return "unknown";
};

BIN
Public/favicon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.8 KiB

29
Public/index.w.md Normal file
View File

@ -0,0 +1,29 @@
```wmd-options
language = es
title_i18n = errors_manager_title_documentation
title_text = Documentación - ErrorsManager
```
<!-- [[wmd]] -->
[[include doc/es/description.w.md]]
[[include doc/es/projects.w.md]]
[[include doc/es/design.w.md]]
[[include doc/es/integration.w.md]]
[[include doc/es/manual.w.md]]
[[include doc/es/faq.w.md]]
[[include doc/es/bugs.w.md]]
[[include doc/es/targets.w.md]]
[[include doc/es/opinions.w.md]]
[[include doc/es/donates.w.md]]
<!-- [[wmd]] -->

View File

@ -0,0 +1,154 @@
.errors-manager {
position: relative;
top: 0em;
left: 0em;
width: 100%;
height: 100%;
overflow: hidden;
background-color: #EFEFEF;
color: #222; }
.errors-manager, .errors-manager input, .errors-manager button, .errors-manager select {
font-family: "Roboto"; }
.errors-manager pre, .errors-manager textarea,
.errors-manager .wmd-code-block,
.errors-manager .wmd-code-block ol > li::marker,
.errors-manager .wmd-code-doc > .description {
font-family: "Roboto Mono"; }
.errors-manager [data-icon]::before {
font-family: "FA6FR"; }
.errors-manager input, .errors-manager button, .errors-manager select, .errors-manager textarea {
font-size: 1em; }
.errors-manager [data-visible=false], .errors-manager [data-hidden=true] {
display: none; }
.errors-manager a[href] {
text-decoration: none;
word-break: break-word; }
.errors-manager a[href], .errors-manager [onclick], .errors-manager [onmouseover], .errors-manager [onmousedown], .errors-manager button, .errors-manager [type=button], .errors-manager [type=reset], .errors-manager [type=submit] {
cursor: pointer;
transition-duration: 1s; }
.errors-manager a[href]:hover, .errors-manager [onclick]:hover, .errors-manager [onmouseover]:hover, .errors-manager [onmousedown]:hover, .errors-manager button:hover, .errors-manager [type=button]:hover, .errors-manager [type=reset]:hover, .errors-manager [type=submit]:hover {
transition-duration: 0.2s; }
.errors-manager a[href], .errors-manager [onclick], .errors-manager [onmouseover], .errors-manager [onmousedown], .errors-manager button, .errors-manager [type=button], .errors-manager [type=reset], .errors-manager [type=submit] {
color: #812;
transition-property: color; }
.errors-manager a[href]:hover, .errors-manager [onclick]:hover, .errors-manager [onmouseover]:hover, .errors-manager [onmousedown]:hover, .errors-manager button:hover, .errors-manager [type=button]:hover, .errors-manager [type=reset]:hover, .errors-manager [type=submit]:hover {
color: #278; }
.errors-manager [onmouseover], .errors-manager [onmousedown] {
color: #551a22;
transition-property: color; }
.errors-manager [onmouseover]:hover, .errors-manager [onmousedown]:hover {
color: #224d55; }
.errors-manager a[href], .errors-manager [onclick] {
transition-property: color; }
.errors-manager button, .errors-manager [type=button], .errors-manager [type=reset], .errors-manager [type=submit] {
border-color: 0.1em solid #812;
box-shadow: 0em 0em 0.4em #812;
transition-property: color,border-color,box-shadow; }
.errors-manager button:hover, .errors-manager [type=button]:hover, .errors-manager [type=reset]:hover, .errors-manager [type=submit]:hover {
border-color: 0.1em solid #278;
box-shadow: 0em 0em 0.4em #278; }
.errors-manager .wmd-dictionary-item {
color: #551a22; }
.errors-manager .wmd-dictionary-item:hover {
color: #224d55; }
.errors-manager h2 {
font-size: 2.6em; }
.errors-manager h3 {
font-size: 2.2em; }
.errors-manager h4 {
font-size: 1.8em; }
.errors-manager h5 {
font-size: 1.4em; }
.errors-manager h6 {
font-size: 1em; }
.errors-manager ul, .errors-manager ol {
padding: 0em 2em; }
.errors-manager header, .errors-manager main, .errors-manager footer {
position: absolute;
left: 0em;
width: 100%; }
.errors-manager header, .errors-manager footer {
overflow: hidden;
display: flex;
flex-direction: row;
box-shadow: 0em 0em 0.125em #EFEFEF, 0em 0em 0.25em #EFEFEF, 0em 0em 0.5em #EFEFEF, 0em 0em 1em #EFEFEF, 0em 0em 2em #EFEFEF; }
.errors-manager header > *, .errors-manager footer > * {
flex: auto;
align-self: center; }
.errors-manager header {
top: 0em;
height: 4em;
z-index: 20; }
.errors-manager header h1 {
margin: .2em 1em;
padding: 0em;
font-size: 1em;
text-wrap: nowrap; }
.errors-manager header h1 .image {
height: 3.6em; }
.errors-manager header h1 img {
width: auto;
height: 3.6em; }
.errors-manager header h1 img + span {
display: none; }
.errors-manager header h1 span + span {
font-size: 3.4em;
height: 0.9444444444em; }
.errors-manager header h1 a > span {
display: inline-block;
vertical-align: top; }
.errors-manager main {
top: 4em;
bottom: 2.5em;
padding: 1% 2%;
z-index: 10;
overflow: auto;
box-sizing: border-box; }
.errors-manager footer {
bottom: 0em;
height: 2.5em;
z-index: 30; }
.errors-manager .main-menu {
width: 25em;
text-align: center; }
.errors-manager .main-menu ul {
list-style-type: none;
margin: 0em;
padding: 0em; }
.errors-manager .main-menu li {
display: inline-block;
margin: 0em .6em; }
.errors-manager .licenses {
display: flex;
flex-direction: row;
justify-content: center;
position: absolute;
left: 0em;
bottom: 0em;
width: 100%;
text-align: center;
padding: .1em .2em;
font-weight: 900;
font-size: .85em;
box-sizing: border-box; }
.errors-manager .license {
display: flex;
flex-direction: row;
align-self: center;
margin: 0em .2em;
text-align: center;
box-sizing: border-box; }
.errors-manager .license span {
flex: auto;
align-self: center; }
.errors-manager .license > * {
vertical-align: middle; }
.errors-manager .license img {
width: auto;
height: 2.5em;
margin: .2em .2em; }
.errors-manager h1 .image + span {
font-size: 3.1em; }
/*# sourceMappingURL=ErrorsManager.css.map */

View File

@ -0,0 +1,7 @@
{
"version": 3,
"mappings": "AAKA,eAAe;ECuBX,QAAQ,EAAG,QAAQ;EACnB,GAAG,EAAG,GAAG;EACT,IAAI,EAAG,GAAG;EACV,KAAK,EAAG,IAAI;EACZ,MAAM,EAAG,IAAI;EACb,QAAQ,EAAG,MAAM;EA4Hb,gBAAgB,ECzJV,OAAO;ED0Jb,KAAK,EC3JC,IAAI;EDgCd,sFAAqB;IAAC,WAAW,ECtBtB,QAAQ;EDuBnB;;;8CAG0B;IAAC,WAAW,ECxB7B,aAAa;EDyBtB,mCAAmB;IAAC,WAAW,ECvBtB,OAAO;EDwBhB,+FAA4B;IAAC,SAAS,EAAG,GAAG;EAE5C,wEAAuC;IAAC,OAAO,EAAG,IAAI;EAEtD,uBAAO;IACH,eAAe,EAAG,IAAI;IACtB,UAAU,EAAG,UAAU;EAE3B,oOAA6F;IACzF,MAAM,EAAG,OAAO;IAChB,mBAAmB,ECpBT,EAAE;IDqBZ,oRAAO;MAAC,mBAAmB,ECtBlB,IAAG;EDwBhB,oOAA6F;IACzF,KAAK,EDtDI,IAAI;ICuDb,mBAAmB,EAAG,KAAK;IAC3B,oRAAO;MAAC,KAAK,EDvDF,IAAI;ECyDnB,4DAA2B;IACvB,KAAK,EAAG,OAAqC;IAC7C,mBAAmB,EAAG,KAAK;IAC3B,wEAAO;MAAC,KAAK,EAAG,OAAuC;EAO3D,kDAAiB;IAAC,mBAAmB,EAAG,KAAK;EAC7C,kHAA+C;IAC3C,YAAY,EAAG,gBAAyB;IACxC,UAAU,EAAG,kBAA2B;IACxC,mBAAmB,EAAG,6BAA6B;IACnD,0IAAO;MACH,YAAY,EAAG,gBAA2B;MAC1C,UAAU,EAAG,kBAA6B;EAIlD,oCAAoB;IAChB,KAAK,EAAG,OAAqC;IAC7C,0CAAO;MAAC,KAAK,EAAG,OAAuC;EAIvD,kBAAM;IAAC,SAAS,EAAG,KAAmB;EAAtC,kBAAM;IAAC,SAAS,EAAG,KAAmB;EAAtC,kBAAM;IAAC,SAAS,EAAG,KAAmB;EAAtC,kBAAM;IAAC,SAAS,EAAG,KAAmB;EAAtC,kBAAM;IAAC,SAAS,EAAG,GAAmB;EAG1C,sCAAK;IACD,OAAO,EAAG,OAAO;EAGrB,oEAAkB;IACd,QAAQ,EAAG,QAAQ;IACnB,IAAI,EAAG,GAAG;IACV,KAAK,EAAG,IAAI;EAEhB,8CAAa;IACT,QAAQ,EAAG,MAAM;IACjB,OAAO,EAAG,IAAI;IACd,cAAc,EAAG,GAAG;IAxFxB,UAAU,EACN,gHAIuB;IAqFvB,sDAAG;MACC,IAAI,EAAG,IAAI;MACX,UAAU,EAAG,MAAM;EAG3B,sBAAM;IACF,GAAG,EAAG,GAAG;IACT,MAAM,EC1FG,GAAG;ID2FZ,OAAO,EAAG,EAAE;IACZ,yBAAE;MACE,MAAM,EAAG,QAAQ;MACjB,OAAO,EAAG,GAAG;MACb,SAAS,EAAG,GAAG;MACf,SAAS,EAAG,MAAM;MAClB,gCAAM;QAAC,MAAM,EAAG,KAAyB;MACzC,6BAAG;QACC,KAAK,EAAG,IAAI;QACZ,MAAM,EAAG,KAAyB;QAClC,oCAAM;UAAC,OAAO,EAAG,IAAI;MAEzB,qCAAS;QACL,SAAS,EAAG,KAAyB;QACrC,MAAM,EAAG,cAAiE;MAE9E,kCAAM;QACF,OAAO,EAAG,YAAY;QACtB,cAAc,EAAG,GAAG;EAIhC,oBAAI;IACA,GAAG,EClHM,GAAG;IDmHZ,MAAM,EClHG,KAAK;IDmHd,OAAO,EAAG,KAAK;IACf,OAAO,EAAG,EAAE;IACZ,QAAQ,EAAG,IAAI;IACf,UAAU,EAAG,UAAU;EAE3B,sBAAM;IACF,MAAM,EAAG,GAAG;IACZ,MAAM,EC1HG,KAAK;ID2Hd,OAAO,EAAG,EAAE;EAiBhB,0BAAU;IACN,KAAK,EAAG,IAAI;IACZ,UAAU,EAAG,MAAM;IACnB,6BAAE;MACE,eAAe,EAAG,IAAI;MACtB,MAAM,EAAG,GAAG;MACZ,OAAO,EAAG,GAAG;IAEjB,6BAAE;MACE,OAAO,EAAG,YAAY;MACtB,MAAM,EAAG,QAAQ;EAIzB,yBAAS;IACL,OAAO,EAAG,IAAI;IACd,cAAc,EAAG,GAAG;IACpB,eAAe,EAAG,MAAM;IACxB,QAAQ,EAAG,QAAQ;IACnB,IAAI,EAAG,GAAG;IACV,MAAM,EAAG,GAAG;IACZ,KAAK,EAAG,IAAI;IACZ,UAAU,EAAG,MAAM;IACnB,OAAO,EAAG,SAAS;IACnB,WAAW,EAAG,GAAG;IACjB,SAAS,EAAG,KAAK;IACjB,UAAU,EAAG,UAAU;EAG3B,wBAAQ;IACJ,OAAO,EAAG,IAAI;IACd,cAAc,EAAG,GAAG;IACpB,UAAU,EAAG,MAAM;IACnB,MAAM,EAAG,QAAQ;IACjB,UAAU,EAAG,MAAM;IACnB,UAAU,EAAG,UAAU;IACvB,6BAAI;MACA,IAAI,EAAG,IAAI;MACX,UAAU,EAAG,MAAM;IAEvB,4BAAG;MAAC,cAAc,EAAG,MAAM;IAC3B,4BAAG;MACC,KAAK,EAAG,IAAI;MACZ,MAAM,EAAG,KAAK;MACd,MAAM,EAAG,SAAS;;ADpM9B,gCAA8B;EAAC,SAAS,EAAG,KAAK",
"sources": ["ErrorsManager.scss","../../../AnP/Public/scss/AnP.common.scss","../../../AnP/Public/scss/AnP.settings.scss"],
"names": [],
"file": "ErrorsManager.css"
}

View File

@ -0,0 +1,10 @@
@import "../../../AnP/Public/scss/AnP.settings.scss";
$color-primary : #812;
$color-secondary : #278;
@import "../../../AnP/Public/scss/AnP.common.scss";
.errors-manager{
@include main_web;
}
.errors-manager h1 .image+span{font-size : 3.1em;}

64
Public/test.html Normal file
View File

@ -0,0 +1,64 @@
<script src="ecma/ErrorsManager.ecma.js"></script>
<script>
errors_manager = new ErrorsManager();
console.log(errors_manager.to_string(105));
console.log(errors_manager.to_array(105));
console.log(errors_manager.to_array_binary(105));
console.log(errors_manager.process(105, "0123456789abcdef".split("").map((_, i) => "error_message_" + i)));
console.log(errors_manager.bits(105));
console.log(errors_manager.bits("pB"));
console.log(errors_manager.bits([41, 1]));
options = [-10, -5, -3, -1, 0, 1, 3, 5, 10];
filler = "";
results = [];
while(filler.length < 30)
filler += " ";
format = (value, characters) => " " + (
JSON.stringify(value).replace(/,/g, ", ") + filler
).slice(0, characters) + " ";
[105, "pB", [41, 1]].forEach((value, i) => options.forEach(bits => {
const new_value = errors_manager.bitwise(value, bits);
results.push([
format(value, 7),
format(errors_manager.to_array_binary(value), 20),
format(bits, 4),
format(new_value, 12),
format(errors_manager.to_array_binary(new_value), 30)
]);
// console.log(results[results.length - 1]);
}));
console.log(results);
// console.log(results.map(result => result.join("|")).join("\n"));
// if ('speechSynthesis' in window) {
// console.log("CARGANDO...");
// window.speechSynthesis.onvoiceschanged = () => {
// console.log("CARGADO");
// const voices = window.speechSynthesis.getVoices();
// console.log(voices);
// const selectedVoice = voices.find(voice => voice.name === 'Google español'); // Ejemplo de selección de voz
// // Crear un objeto de síntesis de voz
// const utterance = new SpeechSynthesisUtterance('Hola, mundo!');
// utterance.voice = selectedVoice;
// // Iniciar la síntesis de voz
// window.speechSynthesis.speak(utterance);
// };
// } else {
// console.error('La API de SpeechSynthesis no es compatible con este navegador.');
// };
</script>

62
Public/test2.html Normal file
View File

@ -0,0 +1,62 @@
<!DOCTYPE html>
<html>
<head>
<title>Prueba de SpeechSynthesis</title>
</head>
<body>
<button onclick="hablar()">Hacer hablar</button>
<script>
function iterar_voces(text, voices, i){
if(i >= voices.length)
return;
const utterance = new SpeechSynthesisUtterance(text);
utterance.voice = voices[i];
utterance.onend = () => iterar_voces(text, voices, i + 1);
console.log([voices[i], i]);
speechSynthesis.speak(utterance);
};
function hablar(){
// speechSynthesis.cancel();
const voices = speechSynthesis.getVoices().filter(voice => voice.lang == "es");
console.log(voices);
iterar_voces('¡Hola, mundo! Esto es una prueba. ¿Qué tal funciona?', voices, 0);
// voices.forEach((voice, i) => {
// iterar_voces('¡Hola, mundo! Esto es una prueba. ¿Qué tal funciona?');
// speechSynthesis.speak(utterance);
// });
// utterance.voice = voices[4];
// speechSynthesis.speak(utterance);
// speechSynthesis.
// window.speechSynthesis.onvoiceschanged = () => {
// const voices = window.speechSynthesis.getVoices();
// // Verifica si se han cargado voces
// if (voices.length === 0) {
// console.error('No se encontraron voces.');
// return;
// }
// // Selecciona la primera voz disponible (puedes personalizar esto)
// const selectedVoice = voices[0];
// const utterance = new SpeechSynthesisUtterance('Hola, mundo!');
// utterance.voice = selectedVoice;
// window.speechSynthesis.speak(utterance);
// };
};
</script>
</body>
</html>

View File

@ -0,0 +1,15 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from Abstracts.Applications import ApplicationsAbstract
from Abstracts.AnPMap import AnP, Optional, Any
from os.path import abspath as path_absolute
from os.path import dirname as directory_name
class ErrorsManager(ApplicationsAbstract):
def __init__(self, anp:AnP|None, inputs:Optional[dict[str, Any|None]|tuple|list] = None) -> None:
super().__init__(anp, "errors_manager", anp.path.get_parent(path_absolute(directory_name(__file__))), {
**anp.get_dictionary(inputs),
"errors_manager_default_settings_files" : "/JSON/ErrorsManager.py.settings.json"
})

397
Python/ErrorsManager.py Normal file
View File

@ -0,0 +1,397 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from typing import Any, Optional
from re import Pattern as REPattern
from re import compile as RECompile
from math import log2
class ErrorsManager:
BASE64:list[str] = [*"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="]
def __init__(self, alphabet:Optional[str|list[str]|tuple[str]] = None) -> None:
self.__error:int = 0
# self.__re_hexa_error:REPattern|None = None
self.__alphabet:list[str] = []
self.set_alphabet(alphabet)
@staticmethod
def is_string(value:Any|None) -> bool:
return isinstance(value, str)
@staticmethod
def is_array(value:Any|None) -> bool:
return isinstance(value, (list, tuple))
@staticmethod
def is_integer(value:Any|None) -> bool:
return isinstance(value, int)
def set_alphabet(self, alphabet:Optional[str] = None) -> int:
self.__error = (
0 if alphabet == None else
1 << 2 if not ErrorsManager.is_array(alphabet) and not ErrorsManager.is_string(alphabet) else
0) << 1
if not self.__error:
if alphabet:
original_length:int = len(self.__alphabet)
final_length:int = 0
character:str
i:int
alphabet = (
alphabet if isinstance(alphabet, list) else
list(alphabet) if isinstance(alphabet, tuple) else
[*alphabet])
alphabet = [character for i, character in alphabet if isinstance(character, str) and len(character) == 1 and alphabet.index(character) == i]
final_length = len(alphabet)
self.__error |= (
1 << 0 if original_length != final_length else
1 << 1 if final_length < 64 else
0) << 5
self.__alphabet = (
self.__alphabet if self.__alphabet and len(self.__alphabet) else
ErrorsManager.BASE64) if self.__error or not alphabet else alphabet
# self.__re_hexa_error = RECompile(r'[^' + alphabet[0] + ']')
return self.__error
def to_array(self,
code:str|int|list[int]|tuple[int],
length:Optional[int] = 1
) -> list[int]:
array:list[int] = []
if ErrorsManager.is_string(code):
hexa:str
for hexa in code:
array += [self.__alphabet.index(hexa)]
elif ErrorsManager.is_integer(code):
while code:
array += [code & 0x3F]
code >>= 6
elif ErrorsManager.is_array(code):
hexa:int
for hexa in code:
array += [hexa]
while len(array) < length:
array += [0]
return array
def process(self,
error:int|str|list[int]|tuple[int],
messages:list[str]|tuple[str]
) -> list[str]:
response:list[str] = []
m:int = len(messages)
i:int
hexa:int
for i, hexa in enumerate(self.to_array(error)):
j:int
for j in range(6):
if hexa & (1 << j):
k:int = j + i * 6
response += [[k, messages[k] if k < m and messages[k] else "error_message_" + str(k)]]
return response
def get_alphabet(self) -> str:
return "".join(self.__alphabet)
def bits(self, code:str|int|list[int]|tuple[int]) -> int|None:
if ErrorsManager.is_integer(code):
return 1 if not code else int(log2(code) + 1)
if ErrorsManager.is_string(code):
code = self.to_array(code)
if ErrorsManager.is_array(code):
code = self.compact(code)
l:int = len(code)
return 1 if not l or not code[-1] else (l - 1) * 6 + int(log2(code[-1]) + 1)
return None
def to_array_binary(self, code:str|int|list[int]|tuple[int]) -> list[str]:
hexa:int
return [("000000" + "{0:b}".format(hexa))[-6:] for hexa in self.to_array(code)]
def to_integer(self, code:str|int|list[int]|tuple[int]) -> int:
if ErrorsManager.is_integer(code):
return code
if ErrorsManager.is_array(code):
hexa:int
i:int
return sum([hexa << i * 6 for i, hexa in enumerate(code)])
if ErrorsManager.is_string(code):
hexa:str
i:int
return sum([self.__alphabet.index(hexa) << i * 6 for i, hexa in enumerate(code)])
return 0
def to_string(self,
code:str|int|list[int]|tuple[int],
length:Optional[int] = 1
) -> str:
string:str = ""
if ErrorsManager.is_string(code):
string += code
elif ErrorsManager.is_integer(code):
while code:
string += self.__alphabet[code & 0x3F]
code >>= 6
elif ErrorsManager.is_array(code):
hexa:str
string = "".join([self.__alphabet[hexa] for hexa in code])
while len(string) < length:
string += self.__alphabet[0]
return string or self.__alphabet[0]
def has(self,
code:int|str|tuple[int]|list[int],
bits:Optional[int|list[int]|tuple[int]] = None
) -> bool:
if not ErrorsManager.is_integer(bits) and not ErrorsManager.is_array(bits):
if ErrorsManager.is_string(code):
hexa:str
for hexa in code:
if self.__alphabet.index(hexa):
return True
return False
if ErrorsManager.is_integer(code):
return not not code
if ErrorsManager.is_array(code):
hexa:int
for hexa in code:
if hexa:
return True
return False
error:list[int] = self.to_array(code)
bit:int
if ErrorsManager.is_integer(bits):
bits = (bits,)
for bit in bits[:len(error) - 1]:
if error[bit]:
return True
return False
def to_unknown(self, code:Any|None) -> Any|None:
return code
def compact(self, code:int|str|list[int]|tuple[int]) -> int|str|list[int]:
if ErrorsManager.is_string(code):
while code and code[-1] == self.__alphabet[0]:
code = code[:-1]
return code or self.__alphabet[0]
if ErrorsManager.is_array(code):
code = list(code)
while len(code) and not code[-1]:
code = code[:-1]
return code if len(code) else [0]
if ErrorsManager.is_integer(code):
return code
return 0
@classmethod
def type(self, code:int|str|tuple[int]|list[int]):
return (
"string" if self.is_string(code) else
"integer" if self.is_integer(code) else
"array" if self.is_array(code) else
"unknown")
def bitwise(self,
code:int|str|tuple[int]|list[int],
bits:int
) -> str|int|list[int]:
if not bits or not self.has(code):
return code
reverse:bool = bits < 0
if reverse:
bits *= -1
start:int = int(bits / 6)
rest:int = bits % 6
type_method:str = "to_" + ErrorsManager.type(code)
i:int
test:bool = bits == 35
code = self.to_array(code)
if reverse:
code = code[start:]
if rest:
if code:
r:int = 6 - rest
block:int = ~-(1 << rest)
hexa:int
code = [(hexa >> rest) | ((code[i + 1] & block) << r) for i, hexa in enumerate(code[:-1])] + [code[-1] >> rest]
else:
code = [0]
else:
test and print(["start", start, rest])
if rest:
r:int = 6 - rest
mask:int = ~-(1 << 6)
code = [(code[0] << rest) & mask] + [((hexa << rest) & mask) | (code[i - 1] >> r) for i, hexa in enumerate(code[1:])] + [code[-1] >> r]
test and print(code)
for i in range(start):
code = [0] + code
return getattr(self, type_method)(code)
def set(self,
code:int|str|list[int]|tuple[int],
error:int|str|list[int]|tuple[int],
bit:Optional[int] = 0,
length:Optional[int] = 0
) -> str:
code = self.to_array(code)
error = self.to_array(error)
if bit:
error = self.bitwise(error, bit)
i:int = int(bit / 6)
if length:
start:int = bit % 6
j:int
hexa:int
end:int = (start + length) % 6
for j, hexa in enumerate([~-(1 << start)] + [0 for j in range(int((length + start) / 6) - 1)] + ([~-(1 << (6 - end)) << end] if end else [])):
code[j + i] &= hexa
if self.has(error):
l:int = len(error)
while len(code) < i:
code += [0]
m:int = len(code)
while i < l:
if i >= m:
code += [0]
code[i] = (code[i] or 0) | error[i]
i += 1
return self.compact(self.to_string(code))
def join(self,
code:int|str|list[int]|tuple[int],
error:int|str|list[int]|tuple[int],
bit:Optional[int] = 0,
length:Optional[int] = 0
) -> str:
return self.set(code, error, bit, length)
def set_blocks(self,
code:str|int|tuple[int]|list[int],
blocks:list[str|int|tuple[int]|list[int]]|tuple[str|int|tuple[int]|list[int]],
bit:Optional[int] = 0,
length:Optional[int] = 0
) -> str:
block:int
i:int
if length:
code = self.set(code, 0, bit, length)
for i, block in blocks:
if block:
code = self.set(code, block, i + bit)
return code or self.__alphabet[0]
def slice(self,
code:str|int|list[int]|tuple[int],
_from:int,
_to:Optional[int] = 0
) -> str|int|list[int]|None:
if self.has(code):
return code
bits:int = self.bits(code)
rest:int
if _from < 0:
_from = bits + _from
_to = (
bits if _to > bits else
bits - _to if _to < 0 else
_to) - _from
rest = _to %6
code = self.bitwise(code, -_from)
return (
code[:int(_to / 6)] + (self.__alphabet[self.__alphabet.index(code[-1]) & ~-(1 << rest)] if rest else "") if ErrorsManager.is_string(code) else
code[:int(_to / 6)] + ([code[-1] & ~-(1 << rest)] if rest else []) if ErrorsManager.is_array(code) else
code & ~-(1 << _to) if ErrorsManager.is_integer(code) else
None)
def has_range(self, code:int|str|list[int]|tuple[int], _from:int, _to:Optional[int] = 0) -> bool:
return self.has(self.slice(code, _from, _to))

65
Python/tests.py Normal file
View File

@ -0,0 +1,65 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from ErrorsManager import ErrorsManager
from json import dumps as json_encode
errors_manager:ErrorsManager = ErrorsManager()
print(errors_manager.to_string(105))
print(errors_manager.to_array(105))
print(errors_manager.to_array_binary(105))
print(errors_manager.process(105, ["error_message_" + str(i) for i, _ in enumerate("0123456789abcdef")]))
print(errors_manager.bits(105))
print(errors_manager.bits("pB"))
print(errors_manager.bits([41, 1]))
options = [-10, -5, -3, -1, 0, 1, 3, 5, 10]
filler = ""
results = []
while len(filler) < 30:
filler += " "
def format(value, characters):
return " " + (
json_encode(value).replace(",", ", ") + filler
)[:characters]
for i, value in enumerate([105, "pB", [41, 1]]):
for bits in options:
new_value = errors_manager.bitwise(value, bits)
example = [
format(value, 7),
format(errors_manager.to_array_binary(value), 20),
format(bits, 4),
format(new_value, 12),
format(errors_manager.to_array_binary(new_value), 30)
]
results += [example]
print(example)
print("")
# [105, "pB", [41, 1]].forEach((value, i) => options.forEach(bits => {
# const new_value = errors_manager.bitwise(value, bits)
# results.push([
# format(value, 7),
# format(errors_manager.to_array_binary(value), 20),
# format(bits, 4),
# format(new_value, 12),
# format(errors_manager.to_array_binary(new_value), 30)
# ])
# // print(results[results.length - 1])
# }))
# -- print(results)
# // print(results.map(result => result.join("|")).join("\n"))

3
Tools/sass.sh Executable file
View File

@ -0,0 +1,3 @@
#!/bin/bash
directory=`dirname $(readlink -f "$0")`
sass $directory/../Public/scss/ErrorsManager.scss ../Public/scss/ErrorsManager.css;

3
Tools/test.py.sh Executable file
View File

@ -0,0 +1,3 @@
#!/bin/bash
directory=`dirname $(readlink -f "$0")`
python3 $directory/../Python/tests.py

Some files were not shown because too many files have changed in this diff Show More