From 50af2ad9c55ba243ea4d9dc5e2f2f57ffbaee938 Mon Sep 17 00:00:00 2001 From: KyMAN <0kyman0@gmail.com> Date: Fri, 11 Oct 2024 13:42:28 +0200 Subject: [PATCH] feat: ECMA and Python Script file with documentation done. --- .gitignore | 6 + Artbook/ErrorsManager.logo.svg | 73 +++ Artbook/ErrorsManager.logo.xcf | Bin 0 -> 62915 bytes HTML/ErrorsManager.base.html | 125 +++++ JSON/ErrorsManager.py.routes.json | 3 + JSON/ErrorsManager.py.settings.json | 42 ++ .../ErrorsManager.py.i18n.alarabiyah.json | 6 + .../ErrorsManager.py.i18n.azerbaycanca.json | 6 + JSON/I18N/ErrorsManager.py.i18n.blanga.json | 6 + JSON/I18N/ErrorsManager.py.i18n.bokmal.json | 6 + .../I18N/ErrorsManager.py.i18n.bulgarski.json | 6 + JSON/I18N/ErrorsManager.py.i18n.catala.json | 6 + JSON/I18N/ErrorsManager.py.i18n.cestina.json | 6 + JSON/I18N/ErrorsManager.py.i18n.dansk.json | 6 + JSON/I18N/ErrorsManager.py.i18n.deutsch.json | 6 + JSON/I18N/ErrorsManager.py.i18n.eesti.json | 6 + JSON/I18N/ErrorsManager.py.i18n.ellinika.json | 6 + JSON/I18N/ErrorsManager.py.i18n.english.json | 6 + JSON/I18N/ErrorsManager.py.i18n.espanol.json | 5 + .../I18N/ErrorsManager.py.i18n.esperanto.json | 6 + JSON/I18N/ErrorsManager.py.i18n.farsi.json | 6 + JSON/I18N/ErrorsManager.py.i18n.francais.json | 6 + JSON/I18N/ErrorsManager.py.i18n.gaeilge.json | 6 + JSON/I18N/ErrorsManager.py.i18n.hangugeo.json | 6 + JSON/I18N/ErrorsManager.py.i18n.hanyu.json | 6 + JSON/I18N/ErrorsManager.py.i18n.hindi.json | 6 + .../I18N/ErrorsManager.py.i18n.indonesia.json | 6 + JSON/I18N/ErrorsManager.py.i18n.italiano.json | 6 + JSON/I18N/ErrorsManager.py.i18n.ivrit.json | 6 + JSON/I18N/ErrorsManager.py.i18n.latviski.json | 6 + .../ErrorsManager.py.i18n.lietuviskai.json | 6 + JSON/I18N/ErrorsManager.py.i18n.magyar.json | 6 + JSON/I18N/ErrorsManager.py.i18n.malayu.json | 6 + .../ErrorsManager.py.i18n.nederlands.json | 6 + JSON/I18N/ErrorsManager.py.i18n.nihongo.json | 6 + JSON/I18N/ErrorsManager.py.i18n.polski.json | 6 + .../I18N/ErrorsManager.py.i18n.portugues.json | 6 + .../I18N/ErrorsManager.py.i18n.romaneste.json | 6 + JSON/I18N/ErrorsManager.py.i18n.russkiy.json | 6 + JSON/I18N/ErrorsManager.py.i18n.shqip.json | 6 + .../ErrorsManager.py.i18n.slovencina.json | 6 + .../ErrorsManager.py.i18n.slovenscina.json | 6 + JSON/I18N/ErrorsManager.py.i18n.suomi.json | 6 + JSON/I18N/ErrorsManager.py.i18n.svenska.json | 6 + JSON/I18N/ErrorsManager.py.i18n.tagalog.json | 6 + JSON/I18N/ErrorsManager.py.i18n.thai.json | 6 + JSON/I18N/ErrorsManager.py.i18n.turkce.json | 6 + .../I18N/ErrorsManager.py.i18n.ukrainska.json | 6 + JSON/I18N/ErrorsManager.py.i18n.urdu.json | 6 + JSON/I18N/ErrorsManager.py.i18n.zhongwen.json | 6 + Public/doc/es/bugs.w.md | 13 + Public/doc/es/description.w.md | 26 + Public/doc/es/design.w.md | 49 ++ Public/doc/es/donates.w.md | 55 ++ Public/doc/es/faq.w.md | 21 + Public/doc/es/integration.w.md | 140 +++++ Public/doc/es/manual.w.md | 55 ++ Public/doc/es/manual/basis.w.md | 54 ++ Public/doc/es/manual/bits.w.md | 45 ++ Public/doc/es/manual/bitwise.w.md | 105 ++++ Public/doc/es/manual/compact.w.md | 78 +++ Public/doc/es/manual/get_alphabet.w.md | 42 ++ Public/doc/es/manual/has.w.md | 118 +++++ Public/doc/es/manual/has_range.w.md | 85 +++ Public/doc/es/manual/is_array.w.md | 89 ++++ Public/doc/es/manual/is_integer.w.md | 89 ++++ Public/doc/es/manual/is_string.w.md | 89 ++++ Public/doc/es/manual/join.w.md | 26 + Public/doc/es/manual/process.w.md | 85 +++ Public/doc/es/manual/set.w.md | 26 + Public/doc/es/manual/set_alphabet.w.md | 54 ++ Public/doc/es/manual/set_blocks.w.md | 26 + Public/doc/es/manual/to_array.w.md | 53 ++ Public/doc/es/manual/to_array_binary.w.md | 45 ++ Public/doc/es/manual/to_integer.w.md | 45 ++ Public/doc/es/manual/to_string.w.md | 53 ++ Public/doc/es/manual/to_unknown.w.md | 59 +++ Public/doc/es/manual/type.w.md | 96 ++++ Public/doc/es/opinions.w.md | 17 + Public/doc/es/projects.w.md | 48 ++ Public/doc/es/targets.w.md | 168 ++++++ Public/ecma/ErrorsManager.ecma.js | 489 ++++++++++++++++++ Public/favicon.ico | Bin 0 -> 4286 bytes Public/images/ErrorsManager-180.png | Bin 0 -> 22048 bytes Public/images/ErrorsManager-192.png | Bin 0 -> 19871 bytes Public/images/ErrorsManager-270.png | Bin 0 -> 21668 bytes Public/images/ErrorsManager-32.png | Bin 0 -> 2323 bytes Public/images/ErrorsManager-512.png | Bin 0 -> 9013 bytes Public/images/ErrorsManager.png | Bin 0 -> 9013 bytes Public/index.w.md | 29 ++ Public/scss/ErrorsManager.css | 154 ++++++ Public/scss/ErrorsManager.css.map | 7 + Public/scss/ErrorsManager.scss | 10 + Public/test.html | 64 +++ Public/test2.html | 62 +++ Python/Application/ErrorsManager.py | 15 + Python/ErrorsManager.py | 397 ++++++++++++++ Python/tests.py | 65 +++ Tools/sass.sh | 3 + Tools/test.py.sh | 3 + version | 1 + 101 files changed, 3765 insertions(+) create mode 100644 .gitignore create mode 100644 Artbook/ErrorsManager.logo.svg create mode 100644 Artbook/ErrorsManager.logo.xcf create mode 100644 HTML/ErrorsManager.base.html create mode 100644 JSON/ErrorsManager.py.routes.json create mode 100644 JSON/ErrorsManager.py.settings.json create mode 100644 JSON/I18N/ErrorsManager.py.i18n.alarabiyah.json create mode 100644 JSON/I18N/ErrorsManager.py.i18n.azerbaycanca.json create mode 100644 JSON/I18N/ErrorsManager.py.i18n.blanga.json create mode 100644 JSON/I18N/ErrorsManager.py.i18n.bokmal.json create mode 100644 JSON/I18N/ErrorsManager.py.i18n.bulgarski.json create mode 100644 JSON/I18N/ErrorsManager.py.i18n.catala.json create mode 100644 JSON/I18N/ErrorsManager.py.i18n.cestina.json create mode 100644 JSON/I18N/ErrorsManager.py.i18n.dansk.json create mode 100644 JSON/I18N/ErrorsManager.py.i18n.deutsch.json create mode 100644 JSON/I18N/ErrorsManager.py.i18n.eesti.json create mode 100644 JSON/I18N/ErrorsManager.py.i18n.ellinika.json create mode 100644 JSON/I18N/ErrorsManager.py.i18n.english.json create mode 100644 JSON/I18N/ErrorsManager.py.i18n.espanol.json create mode 100644 JSON/I18N/ErrorsManager.py.i18n.esperanto.json create mode 100644 JSON/I18N/ErrorsManager.py.i18n.farsi.json create mode 100644 JSON/I18N/ErrorsManager.py.i18n.francais.json create mode 100644 JSON/I18N/ErrorsManager.py.i18n.gaeilge.json create mode 100644 JSON/I18N/ErrorsManager.py.i18n.hangugeo.json create mode 100644 JSON/I18N/ErrorsManager.py.i18n.hanyu.json create mode 100644 JSON/I18N/ErrorsManager.py.i18n.hindi.json create mode 100644 JSON/I18N/ErrorsManager.py.i18n.indonesia.json create mode 100644 JSON/I18N/ErrorsManager.py.i18n.italiano.json create mode 100644 JSON/I18N/ErrorsManager.py.i18n.ivrit.json create mode 100644 JSON/I18N/ErrorsManager.py.i18n.latviski.json create mode 100644 JSON/I18N/ErrorsManager.py.i18n.lietuviskai.json create mode 100644 JSON/I18N/ErrorsManager.py.i18n.magyar.json create mode 100644 JSON/I18N/ErrorsManager.py.i18n.malayu.json create mode 100644 JSON/I18N/ErrorsManager.py.i18n.nederlands.json create mode 100644 JSON/I18N/ErrorsManager.py.i18n.nihongo.json create mode 100644 JSON/I18N/ErrorsManager.py.i18n.polski.json create mode 100644 JSON/I18N/ErrorsManager.py.i18n.portugues.json create mode 100644 JSON/I18N/ErrorsManager.py.i18n.romaneste.json create mode 100644 JSON/I18N/ErrorsManager.py.i18n.russkiy.json create mode 100644 JSON/I18N/ErrorsManager.py.i18n.shqip.json create mode 100644 JSON/I18N/ErrorsManager.py.i18n.slovencina.json create mode 100644 JSON/I18N/ErrorsManager.py.i18n.slovenscina.json create mode 100644 JSON/I18N/ErrorsManager.py.i18n.suomi.json create mode 100644 JSON/I18N/ErrorsManager.py.i18n.svenska.json create mode 100644 JSON/I18N/ErrorsManager.py.i18n.tagalog.json create mode 100644 JSON/I18N/ErrorsManager.py.i18n.thai.json create mode 100644 JSON/I18N/ErrorsManager.py.i18n.turkce.json create mode 100644 JSON/I18N/ErrorsManager.py.i18n.ukrainska.json create mode 100644 JSON/I18N/ErrorsManager.py.i18n.urdu.json create mode 100644 JSON/I18N/ErrorsManager.py.i18n.zhongwen.json create mode 100644 Public/doc/es/bugs.w.md create mode 100644 Public/doc/es/description.w.md create mode 100644 Public/doc/es/design.w.md create mode 100644 Public/doc/es/donates.w.md create mode 100644 Public/doc/es/faq.w.md create mode 100644 Public/doc/es/integration.w.md create mode 100644 Public/doc/es/manual.w.md create mode 100644 Public/doc/es/manual/basis.w.md create mode 100644 Public/doc/es/manual/bits.w.md create mode 100644 Public/doc/es/manual/bitwise.w.md create mode 100644 Public/doc/es/manual/compact.w.md create mode 100644 Public/doc/es/manual/get_alphabet.w.md create mode 100644 Public/doc/es/manual/has.w.md create mode 100644 Public/doc/es/manual/has_range.w.md create mode 100644 Public/doc/es/manual/is_array.w.md create mode 100644 Public/doc/es/manual/is_integer.w.md create mode 100644 Public/doc/es/manual/is_string.w.md create mode 100644 Public/doc/es/manual/join.w.md create mode 100644 Public/doc/es/manual/process.w.md create mode 100644 Public/doc/es/manual/set.w.md create mode 100644 Public/doc/es/manual/set_alphabet.w.md create mode 100644 Public/doc/es/manual/set_blocks.w.md create mode 100644 Public/doc/es/manual/to_array.w.md create mode 100644 Public/doc/es/manual/to_array_binary.w.md create mode 100644 Public/doc/es/manual/to_integer.w.md create mode 100644 Public/doc/es/manual/to_string.w.md create mode 100644 Public/doc/es/manual/to_unknown.w.md create mode 100644 Public/doc/es/manual/type.w.md create mode 100644 Public/doc/es/opinions.w.md create mode 100644 Public/doc/es/projects.w.md create mode 100644 Public/doc/es/targets.w.md create mode 100644 Public/ecma/ErrorsManager.ecma.js create mode 100644 Public/favicon.ico create mode 100644 Public/images/ErrorsManager-180.png create mode 100644 Public/images/ErrorsManager-192.png create mode 100644 Public/images/ErrorsManager-270.png create mode 100644 Public/images/ErrorsManager-32.png create mode 100644 Public/images/ErrorsManager-512.png create mode 100644 Public/images/ErrorsManager.png create mode 100644 Public/index.w.md create mode 100644 Public/scss/ErrorsManager.css create mode 100644 Public/scss/ErrorsManager.css.map create mode 100644 Public/scss/ErrorsManager.scss create mode 100644 Public/test.html create mode 100644 Public/test2.html create mode 100644 Python/Application/ErrorsManager.py create mode 100644 Python/ErrorsManager.py create mode 100644 Python/tests.py create mode 100755 Tools/sass.sh create mode 100755 Tools/test.py.sh create mode 100644 version diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f3e6490 --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +*.apache2.conf +*[Ss]ecrets?* +/Python/Abstracts/AnPMap.py +/Python/Abstracts/Applications.py +.sass-cache +__pycache__ \ No newline at end of file diff --git a/Artbook/ErrorsManager.logo.svg b/Artbook/ErrorsManager.logo.svg new file mode 100644 index 0000000..808b64f --- /dev/null +++ b/Artbook/ErrorsManager.logo.svg @@ -0,0 +1,73 @@ + + + + + + + + + + + + diff --git a/Artbook/ErrorsManager.logo.xcf b/Artbook/ErrorsManager.logo.xcf new file mode 100644 index 0000000000000000000000000000000000000000..68585f4185f2754197a198d4c931de99703e3964 GIT binary patch literal 62915 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 + + + {title_text} + + + + + + + + + + + + + + + + + + + + + + + + +
+

+ + + + + + {{errors_manager}} + +

+ +
+
{contents}
+ + + \ No newline at end of file diff --git a/JSON/ErrorsManager.py.routes.json b/JSON/ErrorsManager.py.routes.json new file mode 100644 index 0000000..ba1ce00 --- /dev/null +++ b/JSON/ErrorsManager.py.routes.json @@ -0,0 +1,3 @@ +[ + "get:/ /ErrorsManager/Public" +] \ No newline at end of file diff --git a/JSON/ErrorsManager.py.settings.json b/JSON/ErrorsManager.py.settings.json new file mode 100644 index 0000000..953beed --- /dev/null +++ b/JSON/ErrorsManager.py.settings.json @@ -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" + } +} \ No newline at end of file diff --git a/JSON/I18N/ErrorsManager.py.i18n.alarabiyah.json b/JSON/I18N/ErrorsManager.py.i18n.alarabiyah.json new file mode 100644 index 0000000..879ee28 --- /dev/null +++ b/JSON/I18N/ErrorsManager.py.i18n.alarabiyah.json @@ -0,0 +1,6 @@ +{ + "alarabiyah" : { + + "errors_manager" : "سوء التصرف" + } +} \ No newline at end of file diff --git a/JSON/I18N/ErrorsManager.py.i18n.azerbaycanca.json b/JSON/I18N/ErrorsManager.py.i18n.azerbaycanca.json new file mode 100644 index 0000000..71cf7ce --- /dev/null +++ b/JSON/I18N/ErrorsManager.py.i18n.azerbaycanca.json @@ -0,0 +1,6 @@ +{ + "azerbaycanca" : { + + "errors_manager" : "Qalereya" + } +} \ No newline at end of file diff --git a/JSON/I18N/ErrorsManager.py.i18n.blanga.json b/JSON/I18N/ErrorsManager.py.i18n.blanga.json new file mode 100644 index 0000000..1b398b2 --- /dev/null +++ b/JSON/I18N/ErrorsManager.py.i18n.blanga.json @@ -0,0 +1,6 @@ +{ + "blanga" : { + + "errors_manager" : "ভুল বোঝাবুঝি" + } +} \ No newline at end of file diff --git a/JSON/I18N/ErrorsManager.py.i18n.bokmal.json b/JSON/I18N/ErrorsManager.py.i18n.bokmal.json new file mode 100644 index 0000000..3cf188e --- /dev/null +++ b/JSON/I18N/ErrorsManager.py.i18n.bokmal.json @@ -0,0 +1,6 @@ +{ + "bokmal" : { + + "errors_manager" : "MistakesManager" + } +} \ No newline at end of file diff --git a/JSON/I18N/ErrorsManager.py.i18n.bulgarski.json b/JSON/I18N/ErrorsManager.py.i18n.bulgarski.json new file mode 100644 index 0000000..755d459 --- /dev/null +++ b/JSON/I18N/ErrorsManager.py.i18n.bulgarski.json @@ -0,0 +1,6 @@ +{ + "bulgarski" : { + + "errors_manager" : "Грешки Manager" + } +} \ No newline at end of file diff --git a/JSON/I18N/ErrorsManager.py.i18n.catala.json b/JSON/I18N/ErrorsManager.py.i18n.catala.json new file mode 100644 index 0000000..8a0378f --- /dev/null +++ b/JSON/I18N/ErrorsManager.py.i18n.catala.json @@ -0,0 +1,6 @@ +{ + "catala" : { + + "errors_manager" : "ErrorsManager" + } +} \ No newline at end of file diff --git a/JSON/I18N/ErrorsManager.py.i18n.cestina.json b/JSON/I18N/ErrorsManager.py.i18n.cestina.json new file mode 100644 index 0000000..38687dd --- /dev/null +++ b/JSON/I18N/ErrorsManager.py.i18n.cestina.json @@ -0,0 +1,6 @@ +{ + "cestina" : { + + "errors_manager" : "ChybyManager" + } +} \ No newline at end of file diff --git a/JSON/I18N/ErrorsManager.py.i18n.dansk.json b/JSON/I18N/ErrorsManager.py.i18n.dansk.json new file mode 100644 index 0000000..cc9a353 --- /dev/null +++ b/JSON/I18N/ErrorsManager.py.i18n.dansk.json @@ -0,0 +1,6 @@ +{ + "dansk" : { + + "errors_manager" : "MistakesManager" + } +} \ No newline at end of file diff --git a/JSON/I18N/ErrorsManager.py.i18n.deutsch.json b/JSON/I18N/ErrorsManager.py.i18n.deutsch.json new file mode 100644 index 0000000..fe60932 --- /dev/null +++ b/JSON/I18N/ErrorsManager.py.i18n.deutsch.json @@ -0,0 +1,6 @@ +{ + "deutsch" : { + + "errors_manager" : "Fehlermanager" + } +} \ No newline at end of file diff --git a/JSON/I18N/ErrorsManager.py.i18n.eesti.json b/JSON/I18N/ErrorsManager.py.i18n.eesti.json new file mode 100644 index 0000000..a590f76 --- /dev/null +++ b/JSON/I18N/ErrorsManager.py.i18n.eesti.json @@ -0,0 +1,6 @@ +{ + "eesti" : { + + "errors_manager" : "VeadManager" + } +} \ No newline at end of file diff --git a/JSON/I18N/ErrorsManager.py.i18n.ellinika.json b/JSON/I18N/ErrorsManager.py.i18n.ellinika.json new file mode 100644 index 0000000..24509c9 --- /dev/null +++ b/JSON/I18N/ErrorsManager.py.i18n.ellinika.json @@ -0,0 +1,6 @@ +{ + "ellinika" : { + + "errors_manager" : "Διαχειριστής λαθών" + } +} \ No newline at end of file diff --git a/JSON/I18N/ErrorsManager.py.i18n.english.json b/JSON/I18N/ErrorsManager.py.i18n.english.json new file mode 100644 index 0000000..6fe97b9 --- /dev/null +++ b/JSON/I18N/ErrorsManager.py.i18n.english.json @@ -0,0 +1,6 @@ +{ + "english" : { + + "errors_manager" : "MistakesManager" + } +} \ No newline at end of file diff --git a/JSON/I18N/ErrorsManager.py.i18n.espanol.json b/JSON/I18N/ErrorsManager.py.i18n.espanol.json new file mode 100644 index 0000000..4fbe5bf --- /dev/null +++ b/JSON/I18N/ErrorsManager.py.i18n.espanol.json @@ -0,0 +1,5 @@ +{ + "espanol" : { + "errors_manager" : "ErrorsManager" + } +} \ No newline at end of file diff --git a/JSON/I18N/ErrorsManager.py.i18n.esperanto.json b/JSON/I18N/ErrorsManager.py.i18n.esperanto.json new file mode 100644 index 0000000..8928345 --- /dev/null +++ b/JSON/I18N/ErrorsManager.py.i18n.esperanto.json @@ -0,0 +1,6 @@ +{ + "esperanto" : { + + "errors_manager" : "Eraroj" + } +} \ No newline at end of file diff --git a/JSON/I18N/ErrorsManager.py.i18n.farsi.json b/JSON/I18N/ErrorsManager.py.i18n.farsi.json new file mode 100644 index 0000000..81a80a8 --- /dev/null +++ b/JSON/I18N/ErrorsManager.py.i18n.farsi.json @@ -0,0 +1,6 @@ +{ + "farsi" : { + + "errors_manager" : "اشتباهات مدیر" + } +} \ No newline at end of file diff --git a/JSON/I18N/ErrorsManager.py.i18n.francais.json b/JSON/I18N/ErrorsManager.py.i18n.francais.json new file mode 100644 index 0000000..4efa623 --- /dev/null +++ b/JSON/I18N/ErrorsManager.py.i18n.francais.json @@ -0,0 +1,6 @@ +{ + "francais" : { + + "errors_manager" : "Gestionnaire des erreurs" + } +} \ No newline at end of file diff --git a/JSON/I18N/ErrorsManager.py.i18n.gaeilge.json b/JSON/I18N/ErrorsManager.py.i18n.gaeilge.json new file mode 100644 index 0000000..1dd07b6 --- /dev/null +++ b/JSON/I18N/ErrorsManager.py.i18n.gaeilge.json @@ -0,0 +1,6 @@ +{ + "gaeilge" : { + + "errors_manager" : "MistakesManager" + } +} \ No newline at end of file diff --git a/JSON/I18N/ErrorsManager.py.i18n.hangugeo.json b/JSON/I18N/ErrorsManager.py.i18n.hangugeo.json new file mode 100644 index 0000000..e19f4fa --- /dev/null +++ b/JSON/I18N/ErrorsManager.py.i18n.hangugeo.json @@ -0,0 +1,6 @@ +{ + "hangugeo" : { + + "errors_manager" : "Mistakes 관리자" + } +} \ No newline at end of file diff --git a/JSON/I18N/ErrorsManager.py.i18n.hanyu.json b/JSON/I18N/ErrorsManager.py.i18n.hanyu.json new file mode 100644 index 0000000..b8c0032 --- /dev/null +++ b/JSON/I18N/ErrorsManager.py.i18n.hanyu.json @@ -0,0 +1,6 @@ +{ + "hanyu" : { + + "errors_manager" : "錯誤管理者" + } +} \ No newline at end of file diff --git a/JSON/I18N/ErrorsManager.py.i18n.hindi.json b/JSON/I18N/ErrorsManager.py.i18n.hindi.json new file mode 100644 index 0000000..e63721a --- /dev/null +++ b/JSON/I18N/ErrorsManager.py.i18n.hindi.json @@ -0,0 +1,6 @@ +{ + "hindi" : { + + "errors_manager" : "MistakesManager" + } +} \ No newline at end of file diff --git a/JSON/I18N/ErrorsManager.py.i18n.indonesia.json b/JSON/I18N/ErrorsManager.py.i18n.indonesia.json new file mode 100644 index 0000000..0b3a4bd --- /dev/null +++ b/JSON/I18N/ErrorsManager.py.i18n.indonesia.json @@ -0,0 +1,6 @@ +{ + "indonesia" : { + + "errors_manager" : "Login" + } +} \ No newline at end of file diff --git a/JSON/I18N/ErrorsManager.py.i18n.italiano.json b/JSON/I18N/ErrorsManager.py.i18n.italiano.json new file mode 100644 index 0000000..d1c60a7 --- /dev/null +++ b/JSON/I18N/ErrorsManager.py.i18n.italiano.json @@ -0,0 +1,6 @@ +{ + "italiano" : { + + "errors_manager" : "MistakesManager" + } +} \ No newline at end of file diff --git a/JSON/I18N/ErrorsManager.py.i18n.ivrit.json b/JSON/I18N/ErrorsManager.py.i18n.ivrit.json new file mode 100644 index 0000000..b0e8e1e --- /dev/null +++ b/JSON/I18N/ErrorsManager.py.i18n.ivrit.json @@ -0,0 +1,6 @@ +{ + "ivrit" : { + + "errors_manager" : "טעויות" + } +} \ No newline at end of file diff --git a/JSON/I18N/ErrorsManager.py.i18n.latviski.json b/JSON/I18N/ErrorsManager.py.i18n.latviski.json new file mode 100644 index 0000000..c4d01c6 --- /dev/null +++ b/JSON/I18N/ErrorsManager.py.i18n.latviski.json @@ -0,0 +1,6 @@ +{ + "latviski" : { + + "errors_manager" : "KļūdasManager" + } +} \ No newline at end of file diff --git a/JSON/I18N/ErrorsManager.py.i18n.lietuviskai.json b/JSON/I18N/ErrorsManager.py.i18n.lietuviskai.json new file mode 100644 index 0000000..757b7e8 --- /dev/null +++ b/JSON/I18N/ErrorsManager.py.i18n.lietuviskai.json @@ -0,0 +1,6 @@ +{ + "lietuviskai" : { + + "errors_manager" : "Comment" + } +} \ No newline at end of file diff --git a/JSON/I18N/ErrorsManager.py.i18n.magyar.json b/JSON/I18N/ErrorsManager.py.i18n.magyar.json new file mode 100644 index 0000000..7d44570 --- /dev/null +++ b/JSON/I18N/ErrorsManager.py.i18n.magyar.json @@ -0,0 +1,6 @@ +{ + "magyar" : { + + "errors_manager" : "MistakesManager" + } +} \ No newline at end of file diff --git a/JSON/I18N/ErrorsManager.py.i18n.malayu.json b/JSON/I18N/ErrorsManager.py.i18n.malayu.json new file mode 100644 index 0000000..bfd3337 --- /dev/null +++ b/JSON/I18N/ErrorsManager.py.i18n.malayu.json @@ -0,0 +1,6 @@ +{ + "malayu" : { + + "errors_manager" : "Kesalahan Kesalahan Pengurus" + } +} \ No newline at end of file diff --git a/JSON/I18N/ErrorsManager.py.i18n.nederlands.json b/JSON/I18N/ErrorsManager.py.i18n.nederlands.json new file mode 100644 index 0000000..5bd45f9 --- /dev/null +++ b/JSON/I18N/ErrorsManager.py.i18n.nederlands.json @@ -0,0 +1,6 @@ +{ + "nederlands" : { + + "errors_manager" : "Foutenbeheer" + } +} \ No newline at end of file diff --git a/JSON/I18N/ErrorsManager.py.i18n.nihongo.json b/JSON/I18N/ErrorsManager.py.i18n.nihongo.json new file mode 100644 index 0000000..81cfae1 --- /dev/null +++ b/JSON/I18N/ErrorsManager.py.i18n.nihongo.json @@ -0,0 +1,6 @@ +{ + "nihongo" : { + + "errors_manager" : "ミステークマネージャー" + } +} \ No newline at end of file diff --git a/JSON/I18N/ErrorsManager.py.i18n.polski.json b/JSON/I18N/ErrorsManager.py.i18n.polski.json new file mode 100644 index 0000000..6dd87f9 --- /dev/null +++ b/JSON/I18N/ErrorsManager.py.i18n.polski.json @@ -0,0 +1,6 @@ +{ + "polski" : { + + "errors_manager" : "Błąd menedżer" + } +} \ No newline at end of file diff --git a/JSON/I18N/ErrorsManager.py.i18n.portugues.json b/JSON/I18N/ErrorsManager.py.i18n.portugues.json new file mode 100644 index 0000000..651900f --- /dev/null +++ b/JSON/I18N/ErrorsManager.py.i18n.portugues.json @@ -0,0 +1,6 @@ +{ + "portugues" : { + + "errors_manager" : "ErrosManager" + } +} \ No newline at end of file diff --git a/JSON/I18N/ErrorsManager.py.i18n.romaneste.json b/JSON/I18N/ErrorsManager.py.i18n.romaneste.json new file mode 100644 index 0000000..8eaacaf --- /dev/null +++ b/JSON/I18N/ErrorsManager.py.i18n.romaneste.json @@ -0,0 +1,6 @@ +{ + "romaneste" : { + + "errors_manager" : "GreşeliManager" + } +} \ No newline at end of file diff --git a/JSON/I18N/ErrorsManager.py.i18n.russkiy.json b/JSON/I18N/ErrorsManager.py.i18n.russkiy.json new file mode 100644 index 0000000..c5aa0d3 --- /dev/null +++ b/JSON/I18N/ErrorsManager.py.i18n.russkiy.json @@ -0,0 +1,6 @@ +{ + "russkiy" : { + + "errors_manager" : "Ошибки менеджера" + } +} \ No newline at end of file diff --git a/JSON/I18N/ErrorsManager.py.i18n.shqip.json b/JSON/I18N/ErrorsManager.py.i18n.shqip.json new file mode 100644 index 0000000..804b5ed --- /dev/null +++ b/JSON/I18N/ErrorsManager.py.i18n.shqip.json @@ -0,0 +1,6 @@ +{ + "shqip" : { + + "errors_manager" : "Gabimet Manager" + } +} \ No newline at end of file diff --git a/JSON/I18N/ErrorsManager.py.i18n.slovencina.json b/JSON/I18N/ErrorsManager.py.i18n.slovencina.json new file mode 100644 index 0000000..36030bb --- /dev/null +++ b/JSON/I18N/ErrorsManager.py.i18n.slovencina.json @@ -0,0 +1,6 @@ +{ + "slovencina" : { + + "errors_manager" : "ChybyManager" + } +} \ No newline at end of file diff --git a/JSON/I18N/ErrorsManager.py.i18n.slovenscina.json b/JSON/I18N/ErrorsManager.py.i18n.slovenscina.json new file mode 100644 index 0000000..444749b --- /dev/null +++ b/JSON/I18N/ErrorsManager.py.i18n.slovenscina.json @@ -0,0 +1,6 @@ +{ + "slovenscina" : { + + "errors_manager" : "NapakeManager" + } +} \ No newline at end of file diff --git a/JSON/I18N/ErrorsManager.py.i18n.suomi.json b/JSON/I18N/ErrorsManager.py.i18n.suomi.json new file mode 100644 index 0000000..424f127 --- /dev/null +++ b/JSON/I18N/ErrorsManager.py.i18n.suomi.json @@ -0,0 +1,6 @@ +{ + "suomi" : { + + "errors_manager" : "Virheet" + } +} \ No newline at end of file diff --git a/JSON/I18N/ErrorsManager.py.i18n.svenska.json b/JSON/I18N/ErrorsManager.py.i18n.svenska.json new file mode 100644 index 0000000..4542a2c --- /dev/null +++ b/JSON/I18N/ErrorsManager.py.i18n.svenska.json @@ -0,0 +1,6 @@ +{ + "svenska" : { + + "errors_manager" : "MisstagManager" + } +} \ No newline at end of file diff --git a/JSON/I18N/ErrorsManager.py.i18n.tagalog.json b/JSON/I18N/ErrorsManager.py.i18n.tagalog.json new file mode 100644 index 0000000..e1af837 --- /dev/null +++ b/JSON/I18N/ErrorsManager.py.i18n.tagalog.json @@ -0,0 +1,6 @@ +{ + "tagalog" : { + + "errors_manager" : "Nagkakamali" + } +} \ No newline at end of file diff --git a/JSON/I18N/ErrorsManager.py.i18n.thai.json b/JSON/I18N/ErrorsManager.py.i18n.thai.json new file mode 100644 index 0000000..0ba6504 --- /dev/null +++ b/JSON/I18N/ErrorsManager.py.i18n.thai.json @@ -0,0 +1,6 @@ +{ + "thai" : { + + "errors_manager" : "ตัวจัดการข้อผิดพลาด" + } +} \ No newline at end of file diff --git a/JSON/I18N/ErrorsManager.py.i18n.turkce.json b/JSON/I18N/ErrorsManager.py.i18n.turkce.json new file mode 100644 index 0000000..2436a01 --- /dev/null +++ b/JSON/I18N/ErrorsManager.py.i18n.turkce.json @@ -0,0 +1,6 @@ +{ + "turkce" : { + + "errors_manager" : "HatalarManager" + } +} \ No newline at end of file diff --git a/JSON/I18N/ErrorsManager.py.i18n.ukrainska.json b/JSON/I18N/ErrorsManager.py.i18n.ukrainska.json new file mode 100644 index 0000000..50eef79 --- /dev/null +++ b/JSON/I18N/ErrorsManager.py.i18n.ukrainska.json @@ -0,0 +1,6 @@ +{ + "ukrainska" : { + + "errors_manager" : "Мапа" + } +} \ No newline at end of file diff --git a/JSON/I18N/ErrorsManager.py.i18n.urdu.json b/JSON/I18N/ErrorsManager.py.i18n.urdu.json new file mode 100644 index 0000000..0e669f6 --- /dev/null +++ b/JSON/I18N/ErrorsManager.py.i18n.urdu.json @@ -0,0 +1,6 @@ +{ + "urdu" : { + + "errors_manager" : "غلط‌فہمی" + } +} \ No newline at end of file diff --git a/JSON/I18N/ErrorsManager.py.i18n.zhongwen.json b/JSON/I18N/ErrorsManager.py.i18n.zhongwen.json new file mode 100644 index 0000000..3b670b8 --- /dev/null +++ b/JSON/I18N/ErrorsManager.py.i18n.zhongwen.json @@ -0,0 +1,6 @@ +{ + "zhongwen" : { + + "errors_manager" : "错误的管理者" + } +} \ No newline at end of file diff --git a/Public/doc/es/bugs.w.md b/Public/doc/es/bugs.w.md new file mode 100644 index 0000000..f77388c --- /dev/null +++ b/Public/doc/es/bugs.w.md @@ -0,0 +1,13 @@ +```wmd-options +language = es +title_i18n = errors_manager_title_bugs +title_text = Bugs - ErrorsManager +``` + + + +## 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. + + \ No newline at end of file diff --git a/Public/doc/es/description.w.md b/Public/doc/es/description.w.md new file mode 100644 index 0000000..ded7325 --- /dev/null +++ b/Public/doc/es/description.w.md @@ -0,0 +1,26 @@ +```wmd-options +language = es +title_i18n = errors_manager_title_description +title_text = Descripción - ErrorsManager +``` + + + +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. + + \ No newline at end of file diff --git a/Public/doc/es/design.w.md b/Public/doc/es/design.w.md new file mode 100644 index 0000000..624e7e3 --- /dev/null +++ b/Public/doc/es/design.w.md @@ -0,0 +1,49 @@ +```wmd-options +language = es +title_i18n = errors_manager_title_design +title_text = Diseño - ErrorsManager +``` + + + +## 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)) + + \ No newline at end of file diff --git a/Public/doc/es/donates.w.md b/Public/doc/es/donates.w.md new file mode 100644 index 0000000..83a4d36 --- /dev/null +++ b/Public/doc/es/donates.w.md @@ -0,0 +1,55 @@ +```wmd-options +language = es +title_i18n = errors_manager_title_donates +title_text = Donaciones - ErrorsManager +``` + + + +## 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. + + \ No newline at end of file diff --git a/Public/doc/es/faq.w.md b/Public/doc/es/faq.w.md new file mode 100644 index 0000000..d18427d --- /dev/null +++ b/Public/doc/es/faq.w.md @@ -0,0 +1,21 @@ +```wmd-options +language = es +title_i18n = errors_manager_title_faq +title_text = F.A.Q. - ErrorsManager +``` + + + +## 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. + + \ No newline at end of file diff --git a/Public/doc/es/integration.w.md b/Public/doc/es/integration.w.md new file mode 100644 index 0000000..9e092b4 --- /dev/null +++ b/Public/doc/es/integration.w.md @@ -0,0 +1,140 @@ +```wmd-options +language = es +title_i18n = errors_manager_title_integration +title_text = Integración - ErrorsManager +``` + + + +## 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 + +``` + +> [!@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. + + \ No newline at end of file diff --git a/Public/doc/es/manual.w.md b/Public/doc/es/manual.w.md new file mode 100644 index 0000000..82f1769 --- /dev/null +++ b/Public/doc/es/manual.w.md @@ -0,0 +1,55 @@ +```wmd-options +language = es +title_i18n = errors_manager_title_manual +title_text = Manual - ErrorsManager +``` + + + +## 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]] + + \ No newline at end of file diff --git a/Public/doc/es/manual/basis.w.md b/Public/doc/es/manual/basis.w.md new file mode 100644 index 0000000..7fead02 --- /dev/null +++ b/Public/doc/es/manual/basis.w.md @@ -0,0 +1,54 @@ +```wmd-options +language = es +title_i18n = errors_manager_title_basis +title_text = Base conceptual - ErrorsManager +``` + + + +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. + + diff --git a/Public/doc/es/manual/bits.w.md b/Public/doc/es/manual/bits.w.md new file mode 100644 index 0000000..e00aa8a --- /dev/null +++ b/Public/doc/es/manual/bits.w.md @@ -0,0 +1,45 @@ +```wmd-options +language = es +title_i18n = errors_manager_title_bits +title_text = bits - ErrorsManager +``` + + + +### bits + +[[@ [integer] ErrorsManager.bits(!Integer|String|Array 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. + + \ No newline at end of file diff --git a/Public/doc/es/manual/bitwise.w.md b/Public/doc/es/manual/bitwise.w.md new file mode 100644 index 0000000..b92a49e --- /dev/null +++ b/Public/doc/es/manual/bitwise.w.md @@ -0,0 +1,105 @@ +```wmd-options +language = es +title_i18n = errors_manager_title_bitwise +title_text = bitwise - ErrorsManager +``` + + + +### bitwise + +[[@ [Integer] ErrorsManager.bitwise(!Integer code, !Integer bits)]] + +[[@ [String] ErrorsManager.bitwise(!String code, !Integer bits)]] + +[[@ [Array] ErrorsManager.bitwise(!Array 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.} */ + options = [-10, -5, -3, -1, 0, 1, 3, 5, 10]; + +[105, "pB", [41, 1]].forEach((value, i) => options.forEach(bits => { + + /** @type {number|String|Array.} */ + 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"] +|] + + \ No newline at end of file diff --git a/Public/doc/es/manual/compact.w.md b/Public/doc/es/manual/compact.w.md new file mode 100644 index 0000000..23f9fb9 --- /dev/null +++ b/Public/doc/es/manual/compact.w.md @@ -0,0 +1,78 @@ +```wmd-options +language = es +title_i18n = errors_manager_title_compact +title_text = compact - ErrorsManager +``` + + + +### compact + +[[@ [Integer] ErrorsManager.compact(!Integer code)]] + +[[@ [String] ErrorsManager.compact(!String code)]] + +[[@ [Array] ErrorsManager.compact(!Array 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.} */ + 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. + + \ No newline at end of file diff --git a/Public/doc/es/manual/get_alphabet.w.md b/Public/doc/es/manual/get_alphabet.w.md new file mode 100644 index 0000000..6111529 --- /dev/null +++ b/Public/doc/es/manual/get_alphabet.w.md @@ -0,0 +1,42 @@ +```wmd-options +language = es +title_i18n = errors_manager_title_get_alphabet +title_text = get_alphabet - ErrorsManager +``` + + + +### 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()); + +``` + + \ No newline at end of file diff --git a/Public/doc/es/manual/has.w.md b/Public/doc/es/manual/has.w.md new file mode 100644 index 0000000..8907644 --- /dev/null +++ b/Public/doc/es/manual/has.w.md @@ -0,0 +1,118 @@ +```wmd-options +language = es +title_i18n = errors_manager_title_has +title_text = has - ErrorsManager +``` + + + +### has + +[[@ [Boolean] ErrorsManager.has(!Integer|String|Array code, Integer|Array 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. + + \ No newline at end of file diff --git a/Public/doc/es/manual/has_range.w.md b/Public/doc/es/manual/has_range.w.md new file mode 100644 index 0000000..8c2cf9f --- /dev/null +++ b/Public/doc/es/manual/has_range.w.md @@ -0,0 +1,85 @@ +```wmd-options +language = es +title_i18n = errors_manager_title_has_range +title_text = has_range - ErrorsManager +``` + + + +### has_range + +[[@ [Boolean] ErrorsManager.has_range(!Integer|String|Array 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. + + \ No newline at end of file diff --git a/Public/doc/es/manual/is_array.w.md b/Public/doc/es/manual/is_array.w.md new file mode 100644 index 0000000..5777243 --- /dev/null +++ b/Public/doc/es/manual/is_array.w.md @@ -0,0 +1,89 @@ +```wmd-options +language = es +title_i18n = errors_manager_title_is_array +title_text = is_array - ErrorsManager +``` + + + +### 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 +|] + + \ No newline at end of file diff --git a/Public/doc/es/manual/is_integer.w.md b/Public/doc/es/manual/is_integer.w.md new file mode 100644 index 0000000..7c5dca9 --- /dev/null +++ b/Public/doc/es/manual/is_integer.w.md @@ -0,0 +1,89 @@ +```wmd-options +language = es +title_i18n = errors_manager_title_is_integer +title_text = is_integer - ErrorsManager +``` + + + +### 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 +|] + + \ No newline at end of file diff --git a/Public/doc/es/manual/is_string.w.md b/Public/doc/es/manual/is_string.w.md new file mode 100644 index 0000000..3580a61 --- /dev/null +++ b/Public/doc/es/manual/is_string.w.md @@ -0,0 +1,89 @@ +```wmd-options +language = es +title_i18n = errors_manager_title_is_string +title_text = is_string - ErrorsManager +``` + + + +### 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 +|] + + \ No newline at end of file diff --git a/Public/doc/es/manual/join.w.md b/Public/doc/es/manual/join.w.md new file mode 100644 index 0000000..14464ec --- /dev/null +++ b/Public/doc/es/manual/join.w.md @@ -0,0 +1,26 @@ +```wmd-options +language = es +title_i18n = errors_manager_title_join +title_text = join - ErrorsManager +``` + + + +### 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) code, !(String|Integer|Array) 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. + + \ No newline at end of file diff --git a/Public/doc/es/manual/process.w.md b/Public/doc/es/manual/process.w.md new file mode 100644 index 0000000..83b4665 --- /dev/null +++ b/Public/doc/es/manual/process.w.md @@ -0,0 +1,85 @@ +```wmd-options +language = es +title_i18n = errors_manager_title_process +title_text = process - ErrorsManager +``` + + + +### process + +[[@ [Array>] ErrorsManager.process(!Integer|String|Array code, !Array 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.} */ + 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 | +|] + + \ No newline at end of file diff --git a/Public/doc/es/manual/set.w.md b/Public/doc/es/manual/set.w.md new file mode 100644 index 0000000..0376df2 --- /dev/null +++ b/Public/doc/es/manual/set.w.md @@ -0,0 +1,26 @@ +```wmd-options +language = es +title_i18n = errors_manager_title_set +title_text = set - ErrorsManager +``` + + + +### 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) code, !(String|Integer|Array) 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. + + \ No newline at end of file diff --git a/Public/doc/es/manual/set_alphabet.w.md b/Public/doc/es/manual/set_alphabet.w.md new file mode 100644 index 0000000..f632fdb --- /dev/null +++ b/Public/doc/es/manual/set_alphabet.w.md @@ -0,0 +1,54 @@ +```wmd-options +language = es +title_i18n = errors_manager_title_set_alphabet +title_text = set_alphabet - ErrorsManager +``` + + + +### 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. + + \ No newline at end of file diff --git a/Public/doc/es/manual/set_blocks.w.md b/Public/doc/es/manual/set_blocks.w.md new file mode 100644 index 0000000..3838212 --- /dev/null +++ b/Public/doc/es/manual/set_blocks.w.md @@ -0,0 +1,26 @@ +```wmd-options +language = es +title_i18n = errors_manager_title_set_blocks +title_text = set_blocks - ErrorsManager +``` + + + +### set_blocks + +[[@ [String] ErrorsManager.set_blocks(!String code, !Array. 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) code, !(String|Integer|Array) 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. + + \ No newline at end of file diff --git a/Public/doc/es/manual/to_array.w.md b/Public/doc/es/manual/to_array.w.md new file mode 100644 index 0000000..92cb30d --- /dev/null +++ b/Public/doc/es/manual/to_array.w.md @@ -0,0 +1,53 @@ +```wmd-options +language = es +title_i18n = errors_manager_title_to_array +title_text = to_array - ErrorsManager +``` + + + +### to_array + +[[@ [Array] ErrorsManager.to_array(!Integer|String|Array 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. + + \ No newline at end of file diff --git a/Public/doc/es/manual/to_array_binary.w.md b/Public/doc/es/manual/to_array_binary.w.md new file mode 100644 index 0000000..77c8f1f --- /dev/null +++ b/Public/doc/es/manual/to_array_binary.w.md @@ -0,0 +1,45 @@ +```wmd-options +language = es +title_i18n = errors_manager_title_to_array_binary +title_text = to_array_binary - ErrorsManager +``` + + + +### to_array_binary + +[[@ [Array] ErrorsManager.to_array_binary(!Integer|String|Array 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. + + \ No newline at end of file diff --git a/Public/doc/es/manual/to_integer.w.md b/Public/doc/es/manual/to_integer.w.md new file mode 100644 index 0000000..2f7d1b0 --- /dev/null +++ b/Public/doc/es/manual/to_integer.w.md @@ -0,0 +1,45 @@ +```wmd-options +language = es +title_i18n = errors_manager_title_to_integer +title_text = to_integer - ErrorsManager +``` + + + +### to_integer + +[[@ [Integer] ErrorsManager.to_integer(!Integer|String|Array 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. + + \ No newline at end of file diff --git a/Public/doc/es/manual/to_string.w.md b/Public/doc/es/manual/to_string.w.md new file mode 100644 index 0000000..713946c --- /dev/null +++ b/Public/doc/es/manual/to_string.w.md @@ -0,0 +1,53 @@ +```wmd-options +language = es +title_i18n = errors_manager_title_to_string +title_text = to_string - ErrorsManager +``` + + + +### to_string + +[[@ [String] ErrorsManager.to_string(!Integer|String|Array 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". + + \ No newline at end of file diff --git a/Public/doc/es/manual/to_unknown.w.md b/Public/doc/es/manual/to_unknown.w.md new file mode 100644 index 0000000..c6ae703 --- /dev/null +++ b/Public/doc/es/manual/to_unknown.w.md @@ -0,0 +1,59 @@ +```wmd-options +language = es +title_i18n = errors_manager_title_to_unknown +title_text = to_unknown - ErrorsManager +``` + + + +### 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 +|] + + \ No newline at end of file diff --git a/Public/doc/es/manual/type.w.md b/Public/doc/es/manual/type.w.md new file mode 100644 index 0000000..699d825 --- /dev/null +++ b/Public/doc/es/manual/type.w.md @@ -0,0 +1,96 @@ +```wmd-options +language = es +title_i18n = errors_manager_title_type +title_text = type - ErrorsManager +``` + + + +### 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]] +|] + + \ No newline at end of file diff --git a/Public/doc/es/opinions.w.md b/Public/doc/es/opinions.w.md new file mode 100644 index 0000000..78a5a6c --- /dev/null +++ b/Public/doc/es/opinions.w.md @@ -0,0 +1,17 @@ +```wmd-options +language = es +title_i18n = errors_manager_title_opinions +title_text = Opiniones y comentarios - ErrorsManager +``` + + + +## 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. + + \ No newline at end of file diff --git a/Public/doc/es/projects.w.md b/Public/doc/es/projects.w.md new file mode 100644 index 0000000..ec5f720 --- /dev/null +++ b/Public/doc/es/projects.w.md @@ -0,0 +1,48 @@ +```wmd-options +language = es +title_i18n = errors_manager_title_projects +title_text = Proyectos - ErrorsManager +``` + + + +## 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. + + \ No newline at end of file diff --git a/Public/doc/es/targets.w.md b/Public/doc/es/targets.w.md new file mode 100644 index 0000000..00d64ea --- /dev/null +++ b/Public/doc/es/targets.w.md @@ -0,0 +1,168 @@ +```wmd-options +language = es +title_i18n = errors_manager_title_targets +title_text = Objetivos - ErrorsManager +``` + + + +## 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. + + \ No newline at end of file diff --git a/Public/ecma/ErrorsManager.ecma.js b/Public/ecma/ErrorsManager.ecma.js new file mode 100644 index 0000000..fef9e97 --- /dev/null +++ b/Public/ecma/ErrorsManager.ecma.js @@ -0,0 +1,489 @@ +/** + * @param {string|Array.} [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.)} 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.)} code + * @param {!number} [length = 0] + * @returns {Array.} + * @access public + */ + this.to_array = (code, length = 0) => { + + /** @type {Array.} */ + 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.)} error + * @param {!Array.} messages + * @returns {Array.} + * @access public + */ + this.process = (error, messages) => { + + /** @type {Array.} */ + const response = [], + /** @type {number} */ + m = messages.length, + /** @type {Array.} */ + 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.} + * @access public + */ + this.get_alphabet = () => alphabet.join(""); + + /** + * @param {!(string|number|Array.)} 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.)} code + * @returns {Array.} + * @access public + */ + this.to_array_binary = code => (code = self.to_array(code)).map(hexa => ("000000" + hexa.toString(2)).slice(-6)); + + /** + * @param {!(string|number|Array.)} 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.)} 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.)} code + * @param {!(number|Array.)} [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.} */ + 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.)} code + * @returns {string|number|Array.} + * @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.)} code + * @param {!number} bits + * @returns {string|number|Array.} + * @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.} */ + 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.)} code + * @param {!(string|number|Array.)} 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.} */ + 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.)} code + * @param {!(string|number|Array.)} 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.)} code + * @param {!Array.>} 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.)} code + * @param {!number} _from + * @param {!number} [_to = 0] + * @returns {string|number|Array.|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.)} 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.} */ +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.)} code + * @returns {string} + * @access public + * @static + */ +ErrorsManager.prototype.type = code => { + + /** @type {Array.} */ + const types = ["string", "integer", "array"]; + + for(let i = 0; i < 3; i ++) + if(ErrorsManager.prototype["is_" + types[i]](code)) + return types[i]; + return "unknown"; +}; \ No newline at end of file diff --git a/Public/favicon.ico b/Public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..126f048b61e13119ef9f9497e591a1364fa3c039 GIT binary patch literal 4286 zcmchaTTGlq6vscdlJ$+Yi$aKT+l`6F7caFf`chuJq+a^wgE6h7#)s;g)HIRXvT{if z14ULy8cKr_6)-+fC=v`I^reJYx&(m)SO^J3uD-2JyW{zNyR&?|-ES`mI?d^KICIYb zKXYd0%&cML$iHL94E{HMJZub90x6hK2_F z`hNKXLB~elf7x<#bIm#T_V(Y)_k5#{dfH4u#|A$>2hnzRcHnY}IMDa@_KpUF!B0j; zMh0tZTmCuXX;())9Z_jl*yzIt-)Ou84D@Uo^H^P7{h+7kr`_4v*~a<#`SR=6f7pEY zT#d><{?FMemXwzkf#t*w2GpkoUJ0uA`Q@~ZEV zcrd}1=CWG{>2t7V9~c3g)geAPOFX%k16QbbU(ht5UX*(1Ups! zIXCQG&NXo-ifa^ev2w$)y}kWfV`G_WZ1hB>Okvafe2F1euLYQ3!(sK)I(37y%lUyD zf7ViP3bl{^ip?qc_K%K^b|L84bie+JtpE%?AF$y_tWn};)-~z}XBhsMPgg7Unv7S& z#lGVI*!1*t+xYnS4Fnxq%ps}}%bw(1fC)Annos*vyQ!blFui9uPvZB2_OX7&?&|Dp zx!=^}Q3yIVtB=;f04tKyNS%ZWPJE=_;QpY7@7Ixb#hI4AM{-Jx% z%{LkvF2wlJv1QKhhySkT&o=+->+A3Pd~e72(XrX^C(ZxOn}fIDr)9hUR#sLnRaTyi z@uOq2;g9V<_JGgVd|&ooKsdkL*w`>bbRIH2e{!bEYigd4@uOo)Mlm_-V%BHm8yw}i2?cqBkBG7 z;rUwO|1;(NE3vlk57r{#{qbJH`=f-tX8-VPRgd_$g=b%G1tZ$nC5SxpNS2$n8b+-_m!;^bub(MqPAF&+Q_ literal 0 HcmV?d00001 diff --git a/Public/images/ErrorsManager-180.png b/Public/images/ErrorsManager-180.png new file mode 100644 index 0000000000000000000000000000000000000000..0c0b3c22fe6b2c18861a81e279558352f91bc671 GIT binary patch literal 22048 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%0Ah` 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

E^3Wd|Q_&iE0P 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 literal 0 HcmV?d00001 diff --git a/Public/images/ErrorsManager-32.png b/Public/images/ErrorsManager-32.png new file mode 100644 index 0000000000000000000000000000000000000000..17a70ae1d315bda46bd73ca1408341c2586f7e8d GIT binary patch literal 2323 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 Q2L(O0TRUtm+Cq={9}h<6bpQYW literal 0 HcmV?d00001 diff --git a/Public/images/ErrorsManager.png b/Public/images/ErrorsManager.png new file mode 100644 index 0000000000000000000000000000000000000000..ad91ec96aa7a26b0de07134bcf6d64b4921dee32 GIT binary patch literal 9013 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 + +[[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]] + + \ No newline at end of file diff --git a/Public/scss/ErrorsManager.css b/Public/scss/ErrorsManager.css new file mode 100644 index 0000000..f8a9cab --- /dev/null +++ b/Public/scss/ErrorsManager.css @@ -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 */ diff --git a/Public/scss/ErrorsManager.css.map b/Public/scss/ErrorsManager.css.map new file mode 100644 index 0000000..12d0de7 --- /dev/null +++ b/Public/scss/ErrorsManager.css.map @@ -0,0 +1,7 @@ +{ +"version": 3, +"mappings": "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", +"sources": ["ErrorsManager.scss","../../../AnP/Public/scss/AnP.common.scss","../../../AnP/Public/scss/AnP.settings.scss"], +"names": [], +"file": "ErrorsManager.css" +} diff --git a/Public/scss/ErrorsManager.scss b/Public/scss/ErrorsManager.scss new file mode 100644 index 0000000..2c89258 --- /dev/null +++ b/Public/scss/ErrorsManager.scss @@ -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;} \ No newline at end of file diff --git a/Public/test.html b/Public/test.html new file mode 100644 index 0000000..e5c838f --- /dev/null +++ b/Public/test.html @@ -0,0 +1,64 @@ + + \ No newline at end of file diff --git a/Public/test2.html b/Public/test2.html new file mode 100644 index 0000000..94a139d --- /dev/null +++ b/Public/test2.html @@ -0,0 +1,62 @@ + + + + Prueba de SpeechSynthesis + + + + + + + \ No newline at end of file diff --git a/Python/Application/ErrorsManager.py b/Python/Application/ErrorsManager.py new file mode 100644 index 0000000..a4c505b --- /dev/null +++ b/Python/Application/ErrorsManager.py @@ -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" + }) \ No newline at end of file diff --git a/Python/ErrorsManager.py b/Python/ErrorsManager.py new file mode 100644 index 0000000..d4edea5 --- /dev/null +++ b/Python/ErrorsManager.py @@ -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)) \ No newline at end of file diff --git a/Python/tests.py b/Python/tests.py new file mode 100644 index 0000000..7c2cdfb --- /dev/null +++ b/Python/tests.py @@ -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")) \ No newline at end of file diff --git a/Tools/sass.sh b/Tools/sass.sh new file mode 100755 index 0000000..7a3eeef --- /dev/null +++ b/Tools/sass.sh @@ -0,0 +1,3 @@ +#!/bin/bash +directory=`dirname $(readlink -f "$0")` +sass $directory/../Public/scss/ErrorsManager.scss ../Public/scss/ErrorsManager.css; \ No newline at end of file diff --git a/Tools/test.py.sh b/Tools/test.py.sh new file mode 100755 index 0000000..3969d27 --- /dev/null +++ b/Tools/test.py.sh @@ -0,0 +1,3 @@ +#!/bin/bash +directory=`dirname $(readlink -f "$0")` +python3 $directory/../Python/tests.py \ No newline at end of file diff --git a/version b/version new file mode 100644 index 0000000..2dbf3de --- /dev/null +++ b/version @@ -0,0 +1 @@ +0.0.1.23 \ No newline at end of file