fix(py|ecma): Fixed some bugs and added multicode sample blocks.

This commit is contained in:
KyMAN 2025-03-31 20:23:07 +02:00
parent b215e04060
commit 2f95746f20
12 changed files with 1312 additions and 106 deletions

View File

@ -45,6 +45,15 @@ Esto es un ejemplo del error, donde el ***elemento1*** y el ***elemento2*** tend
> [!Srx00] El problema radica, en el ejemplo aquí expuesto, en que la cursiva sólo afectaría por posición de los atributos de WMarkDown por defecto, al fragmento de texto " y el ", dejando el resto en negrilla y con dos asteriscos sin procesar. Para arreglar dicho error hay que crear un subelemento que monte negrilla y cursiva de golpe, aunque lo ideal es que lo procese directamente tal como está. Es un poco chapuzas el arreglo pero inicialmente, y en base a la filosofía de funcionamiento, esta es la solución más plausible. > [!Srx00] El problema radica, en el ejemplo aquí expuesto, en que la cursiva sólo afectaría por posición de los atributos de WMarkDown por defecto, al fragmento de texto " y el ", dejando el resto en negrilla y con dos asteriscos sin procesar. Para arreglar dicho error hay que crear un subelemento que monte negrilla y cursiva de golpe, aunque lo ideal es que lo procese directamente tal como está. Es un poco chapuzas el arreglo pero inicialmente, y en base a la filosofía de funcionamiento, esta es la solución más plausible.
### Proporción de imágenes
Las imagénes tienden a salir desproporcionadas en algunos casos.
* [X] Localizar el error.
* [X] Solventar el error.
> [!@Srx00] El problema radicaba en que no está definido un sistema que determine si una imagen ha de ser adaptada al ancho o al largo. Se dejó temporalmente establecido siempre al ancho, pero ha de cambiar con el tiempo.
### Valor en el CodeDoc ### Valor en el CodeDoc
Cuando se establece valor en el Code Doc, el igual que separa el valor o función del resultado por defecto, en el caso de las funciones, no está separado. Cuando se establece valor en el Code Doc, el igual que separa el valor o función del resultado por defecto, en el caso de las funciones, no está separado.
@ -52,4 +61,13 @@ Cuando se establece valor en el Code Doc, el igual que separa el valor o funció
* [ ] Localizar el error. * [ ] Localizar el error.
* [ ] Solventar el error. * [ ] Solventar el error.
### Switch en Code Block
El evento tiene elementos superpuestos los cuales evitan que salte.
* [-] Localizar el error.
* [ ] Solventar el error.
> [!#] Línea 289 de [https://wmarkdown.k3y.pw/ecma/WMarkDown.ecma.js WMarkDown.ecma.js].
<!-- [[wmd]] --> <!-- [[wmd]] -->

View File

@ -29,12 +29,12 @@ Este proyecto es plenamente gratuito pues es un proyecto orientado a complementa
A continuación se mostrará una tabla de balance con respecto a las cantidades y usos dados. A continuación se mostrará una tabla de balance con respecto a las cantidades y usos dados.
[| [|
|= Activo | Cantidad | Motivo | Usuario | Cantidad total actual |= Activo | Cantidad | Fecha | Motivo | Usuario | Cantidad total actual
| **BTC** | 0 BTC | Inicio del contador de unidades de BTC. | | 0 BTC | **BTC** | 0 BTC | | Inicio del contador de unidades de BTC. | | 0 BTC
| **LTC** | 0 LTC | Inicio del contador de unidades de LTC. | | 0 LTC | **LTC** | 0 LTC | | Inicio del contador de unidades de LTC. | | 0 LTC
| **DOGE** | 0 DOGE | Inicio del contador de unidades de DOGE. | | 0 DOGE | **DOGE** | 0 DOGE | | Inicio del contador de unidades de DOGE. | | 0 DOGE
| **DASH** | 0 DASH | Inicio del contador de unidades de DASH. | | 0 DASH | **DASH** | 0 DASH | | Inicio del contador de unidades de DASH. | | 0 DASH
| **FAIR** | 0 FAIR | Inicio del contador de unidades de FAIR. | | 0 FAIR | **FAIR** | 0 FAIR | | Inicio del contador de unidades de FAIR. | | 0 FAIR
|] |]
Cómputo total actual en tenencia. Cómputo total actual en tenencia.

View File

@ -75,6 +75,8 @@ Los objetivos para poder llevar a cabo este proyecto son los siguientes:
+ [X] Módulo para visibilizar proyectos y recursos. + [X] Módulo para visibilizar proyectos y recursos.
+ [ ] Módulo para visualizar direcciones de monedas o de pago mediante String y QR con Link integrado. + [ ] Módulo para visualizar direcciones de monedas o de pago mediante String y QR con Link integrado.
+ [ ] Módulo para comentar fragmentos que no resulten en el String de salida. + [ ] Módulo para comentar fragmentos que no resulten en el String de salida.
+ [ ] Implementar compatibilidad HTML.
+ [ ] Gestor de etiquetas HTML limitadas.
+ [X] Implementar SyntaxHightlighter para el módulo de bloque de código. + [X] Implementar SyntaxHightlighter para el módulo de bloque de código.
+ [X] Implementar MathJax. + [X] Implementar MathJax.
+ [X] Implementar MermaidJS. + [X] Implementar MermaidJS.
@ -88,20 +90,41 @@ Los puntos a cubrir dentro del proyecto son los siguientes:
[| [|
|= Objetivo | Py | C# | Go | PHP | JS | CSS | HTML |= Objetivo | Py | C# | Go | PHP | JS | CSS | HTML
| Base HTML | | | | | [X] | [X] | [X] | Base HTML | | | | | [X] | [X] | [X]
| Checkboxes | [X] | [X] | [ ] | [ ] | | [X] |
| Párrafos | [X] | [X] | [ ] | [ ] | | [X] | | Párrafos | [X] | [X] | [ ] | [ ] | | [X] |
| Checkboxes | [X] | [X] | [ ] | [ ] | | [X] |
| Radiobuttons | [X] | [X] | [ ] | [ ] | | [X] |
| Ticks | [X] | [X] | [ ] | [ ] | | [X] |
| Títulos y cabeceras | [X] | [X] | [ ] | [ ] | [X] | [X] | | Títulos y cabeceras | [X] | [X] | [ ] | [ ] | [X] | [X] |
| Formatos de texto | [X] | [X] | [ ] | [ ] | | [X] | | Negrilla | [X] | [X] | [ ] | [ ] | | [X] |
| Exclusor de marcas | [X] | [X] | [ ] | [ ] | [X] | | | Cursiva | [X] | [X] | [ ] | [ ] | | [X] |
| Include | [X] | [X] | [ ] | [ ] | | | | Tachado | [X] | [X] | [ ] | [ ] | | [X] |
| Subrayado | [X] | [X] | [ ] | [ ] | | [X] |
| Links | [X] | [X] | [ ] | [ ] | | [X] | | Links | [X] | [X] | [ ] | [ ] | | [X] |
| Listas | [X] | [X] | [ ] | [ ] | [X] | [X] | | Muestras de color | [X] | [X] | [ ] | [ ] | | [X] |
| Tablas | [X] | [X] | [ ] | [ ] | | [X] | | Tablas | [X] | [X] | [ ] | [ ] | | [X] |
| Quotes | [X] | [X] | [ ] | [ ] | [X] | [X] | | Listas | [X] | [X] | [ ] | [ ] | [X] | [X] |
| Quotes y comentarios | [X] | [X] | [ ] | [ ] | [X] | [X] |
| Bloques de código | [X] | [X] | [ ] | [ ] | [X] | [X] |
| Bloque MathJAX | [X] | [X] | [ ] | [ ] | [X] | [X] |
| Bloque Mermaid | [X] | [X] | [ ] | [ ] | [X] | [X] |
| Bloque de ejemplos | [X] | [X] | [ ] | [ ] | [X] | [X] |
| Bloque XML WMD | [X] | [X] | [ ] | [ ] | [X] | [X] |
| Links de presentación | [X] | [X] | [ ] | [ ] | [X] | [X] |
| Módulo de exclusión | [X] | [X] | [ ] | [ ] | [X] | |
| Inclusiones | [X] | [X] | [ ] | [ ] | | |
| Diccionario | | | | | [X] | [X] | | Diccionario | | | | | [X] | [X] |
| Sample de color | [X] | [X] | [ ] | [ ] | | [X] |
| Presentación de Links | [X] | [X] | [ ] | [ ] | [X] | [X] |
| Documento de código | [X] | [X] | [ ] | [ ] | [X] | [X] | | Documento de código | [X] | [X] | [ ] | [ ] | [X] | [X] |
| Links Cryptomonedas | [ ] | [ ] | [ ] | [ ] | [ ] | [ ] |
| Scripts de ejemplo | [ ] | [ ] | [ ] | [ ] | [ ] | [ ] |
| Módulo de imagen | [-] | [ ] | [ ] | [ ] | [-] | [-] |
| Módulo de imágenes | [ ] | [ ] | [ ] | [ ] | [ ] | [ ] |
| Módulo de vídeo | [ ] | [ ] | [ ] | [ ] | [ ] | [ ] |
| Módulo de vídeos | [ ] | [ ] | [ ] | [ ] | [ ] | [ ] |
| Módulo de audio | [ ] | [ ] | [ ] | [ ] | [ ] | [ ] |
| Módulo de audios | [ ] | [ ] | [ ] | [ ] | [ ] | [ ] |
| Módulo de multimedia | [ ] | [ ] | [ ] | [ ] | [ ] | [ ] |
| Sistema de progreso | [ ] | [ ] | [ ] | [ ] | [ ] | [ ] |
| Bloque de comentarios | [ ] | [ ] | [ ] | [ ] | [ ] | [ ] |
|] |]
> [!#] Con respecto a Python y Go hablamos de compatibilidad local tanto servidor como WASM. > [!#] Con respecto a Python y Go hablamos de compatibilidad local tanto servidor como WASM.

View File

@ -156,4 +156,64 @@ Esto es más contenido de la celda 2-B." | Celda 3-B
Esto es más contenido de la celda 2-C.' | Celda 3-C Esto es más contenido de la celda 2-C.' | Celda 3-C
|] |]
## Code Sample Block Test
<code-sample-block>
```js
console.log("PASA");
```
```py
print("PASA")
```
¿Funciona? xD
```rust
fn main(){
println!(String::from("PASA"));
}
```
```go
fn main(){
println("PASA")
}
```
```c
print("PASA");
```
```c++
#include <iostream>
#include <string>
std::cout << "PASA" << std::endl;
```
```c#
debug.println("a", "PASA");
```
```java
system.out.println("PASA");
```
```php
echo "PASA";
```
```as
trace("PASA");
```
```sql
select "PASA" as x
```
</code-sample-block>
<!-- [[wmd]] --> <!-- [[wmd]] -->

View File

@ -327,6 +327,22 @@ export const WMarkDown = (function(){
return item; return item;
}; };
/**
* @param {!string} type
* @returns {string}
* @access private
*/
const get_alternative_type_dictionary = type => {
/** @type {number} */
const l = type_dictionary.length;
for(let i = 0; i < l; i ++)
if(type_dictionary[i].includes(type))
return type_dictionary[i][0];
return type;
};
const code_block_format = () => { const code_block_format = () => {
document.querySelectorAll(".wmd-code-block[data-processed=false]").forEach(block => { document.querySelectorAll(".wmd-code-block[data-processed=false]").forEach(block => {
@ -378,6 +394,48 @@ export const WMarkDown = (function(){
}); });
document.querySelectorAll(".wmd-code-sample-block[data-processed=false]").forEach(block => {
if(!block.innerHTML || (
block.querySelector(".wmd-code-block") &&
!block.querySelector(".wmd-code-block[data-processed=false]")
)){
block.setAttribute("data-processed", true);
block.querySelectorAll(".languages>ul>li").forEach((language, i) => {
/** @type {string} */
const name = get_alternative_type_dictionary(language.getAttribute("data-language"));
language.setAttribute("data-selected", !i);
language.setAttribute("data-i", i);
language.setAttribute("data-title", name);
language.innerHTML = name;
language.addEventListener("click", event => {
if(event.target.getAttribute("data-selected") == "true")
return;
/** @type {number} */
const i = Number(event.target.getAttribute("data-i"));
event.target.parentNode.querySelectorAll("li").forEach((language, j) => {
/** @type {boolean} */
const selected = i == j;
if(language.getAttribute("data-selected") != (selected ? "true" : "false")){
language.setAttribute("data-selected", selected);
event.target.parentNode.parentNode.parentNode.querySelector(".content>[data-i='" + j + "']").setAttribute("data-visible", selected);
};
});
});
});
block.querySelectorAll(".content>.wmd-code-block").forEach((sample, i) => {
sample.setAttribute("data-i", i);
sample.setAttribute("data-visible", !i);
});
};
});
}; };
const build_dictionary_items = () => { const build_dictionary_items = () => {

View File

@ -872,4 +872,39 @@
"https://x.com/faircoinconf", "https://x.com/faircoinconf",
"https://es.wikipedia.org/wiki/FairCoop" "https://es.wikipedia.org/wiki/FairCoop"
] ]
], [
[
["/\\bmath[ \\-\\.]*jax\\b/i", "MathJax"],
["/\\blatex\\b/i", "LaTeX"],
["/\\bmath[ \\-\\.]*ml\\b/i", "MathML"],
["/\\bascii[ \\.\\-]*math[ \\-\\.]*ml\\b/i", "ASCIIMathML"]
], [
"MathJax es una librería JavaScript para implementar funciones matemáticas codificadas en LaTeX, MathML y ",
"ASCIIMathML para entornos Web principalmente, aunque su uso puede extenderse fuera de dicho ámbito.. Fue ",
"desarrollado por la Sociedad Estadounidense de Matemática."
], [
"https://www.mathjax.org/",
"https://github.com/mathjax/MathJax",
"https://x.com/mathjax",
"https://www.latex-project.org/",
"https://github.com/latex3/latex2e",
"https://es.wikibooks.org/wiki/Manual_de_LaTeX",
"https://asciimath.org/",
"https://github.com/asciimath/asciimathml",
"https://www.w3.org/Math/",
"https://www.data2type.de/en/xml-xslt-xslfo/math-ml/",
"https://xrjunque.nom.es/(S(wc3b1mabt1xd54jsgfv2gbqm))/MathML_To_String",
"https://es.wikipedia.org/wiki/MathJax",
"https://es.wikipedia.org/wiki/AsciiMath",
"https://es.wikipedia.org/wiki/LaTeX"
]
], [
["/\\bmermaid([ \\-\\.]*js)?\\b/i", "MermaidJS"], [
"MermaidJS es una librería JavaScript para implementar esquemas, estructuras, gráficos, etc. Desde un sencillo ",
"entorno de texto encapsulado, procesado de forma dinámica en JavaScript para HTML."
], [
"https://mermaid.js.org/",
"https://github.com/mermaid-js/mermaid",
"https://mermaid.live/"
]
]] ]]

View File

@ -0,0 +1,910 @@
[[
[
["/\\bwmarkdown\\b/ig", "WMarkDown"],
["/\\b(wmd\\b|w\\.m\\.d\\.|w\\. +m\\. +d\\. +)/ig", "WMD"]
], [
"O WMarkDown é un procxecto o cal permítenos facer documentación e textos ",
"formateados dende unha linguaxe de marcas sinxelo que parte como idea de ",
"linguaxes de marcas coma MarkDown e MediaWiki, persoaizado a usos máis ",
"extensos, flexibles e sinxelos."
], [
"https://wmarkdown.k3y.pw/",
"https://git.k3y.pw/Whalers/WMarkDown"
]
], [
["/\\bmedia *wiki\\b/gi", "MediaWiki"], [
"MediaWiki é un proxecto Free Open Source que ven sendo a base de Webs ",
"coma Wikipedia entre outros, o cal permite xestionar publicacións e ",
"documentación nun entorno flexible, aberto e extendido cunha gran ",
"comunidade que o mantén."
], [
"https://www.mediawiki.org/",
"https://es.wikipedia.org/wiki/MediaWiki",
"https://github.com/wikimedia/mediawiki"
]
], [
[
["/\\bmarkdown\\b/gi", "Markdown"],
["/(?<!\\.)\\b\\bmd\\b|\\b(m\\.d\\.|m\\. +d\\. +)/ig", "MD"]
], [
"Markdown é un estándar de linguaxe de marcas que se desenrolou para facilitaren ",
"a documentación con texto formateado nos proyectos, tanto a un nivel visual ",
"mediante texto plano coma unha vez formateado."
], [
"https://daringfireball.net/projects/markdown",
"https://daringfireball.net/projects/markdown/syntax",
"https://es.wikipedia.org/wiki/Markdown",
"https://www.markdownguide.org/"
]
], [
[
["/\\bpython\\b/ig", "Python"],
["/(?<!\\.)\\bpy\\b/ig", "Py"],
["/(?<!\\.)\\bpyc\\b/ig", "PyC"]
], [
"Python é unha linguaxe de programación moi extendida de uso xeral precompilado ",
"con alta versatilidade moi usado en cómputo. A extensión dos seus arquivos de Script ",
"é '.py' e a dos compilados por defecto '.pyc', ainda que éstes últimos dependen ",
"do compilador."
], [
"https://www.python.org/",
"https://es.wikipedia.org/wiki/Python",
"https://es.wikibooks.org/wiki/Python"
]
], [
[
["/(?<!\\.)\\b(html(5)?\\b|h\\.t\\.m\\.l\\.|h\\. +t\\. +m\\. +l\\. +)/ig", "HTML$2"]
], [
"HTML é unha linguaxe de marcas basado en XML pero cunha estructura predefinida ",
"que condiciona como han de exporse os datos, entendendo cada elemento coma unha ",
"estructura de formato para a presentación da información, normalmente, ",
"orientado a contornos Web."
], [
"https://www.w3.org/html/",
"https://html.spec.whatwg.org/multipage/",
"https://es.wikipedia.org/wiki/HTML",
"https://developer.mozilla.org/es/docs/Web/HTML",
"https://www.w3schools.com/html/",
"https://lenguajehtml.com/",
"https://desarrolloweb.com/home/html"
]
], [
["/(?<!\\.)\\b(css\\b|c\\.(s\\.){2}|c\\. +(s\\. +){2})/ig", "CSS"], [
"CSS é unha linguaxe de marcas que serve para separa-lo que son os estilos da ",
"estructura da información a cal quérese amosar. Normalmente vai orientado a ",
"contornos Web sobre HTML así como para estructurar e darlle deseño e formato a ",
"contidos XML, velaquí o seu sistema de selectores."
], [
"https://www.w3.org/Style/CSS/",
"https://drafts.csswg.org/",
"https://es.wikipedia.org/wiki/CSS",
"https://developer.mozilla.org/es/docs/Web/CSS",
"https://www.w3schools.com/css/",
"https://lenguajecss.com/css/introduccion/que-es-css/"
]
], [
[
["/\\b(sass\\b|s\\.a\\.(s\\.){2}|s\\. +a\\. +(s\\. +){2})/ig", "Sass"],
["/(?<!\\.)\\b(scss\\b|s\\.c\\.(s\\.){2}|s\\. +c\\. +(s\\. +){2})/ig", "SCSS"]
], [
"SASS é unha linguaxe de marcas que extende a propia linguaxe CSS para facilitaren o ",
"desenrolo de estilos de tal forma que unha vez se procese o SASS, éste retorne un ",
"arquiivo CSS mapeado contra o propio arquivo SCSS no que se desenrola SASS."
], [
"https://sass-lang.com/",
"https://es.wikipedia.org/wiki/Sass",
"https://github.com/sass/sass"
]
], [
["/\\b(srx01|tars[yi](er(isco)?)?)\\b/ig", "Tarsier"], [
"Un Tarsierisco de pura cepa."
], [
"https://git.k3y.pw/Tarsier"
]
], [
["/\\b(srx00|ky *man)\\b/ig", "KyMAN"], [
"KyMAN é o desenrolador de AnP e dos desenroladores orixináis de WMarkDown, ",
"entre outros. As súas linguaxes principais son Golang, JavaScript/ECMAScript, Python, PHP, ",
"Java, C#, C/C++, MySQL, SQL Server, SQLite, HTML e SASS/CSS."
], [
"https://kyman.k3y.pw/",
"https://git.k3y.pw/KyMAN",
"https://github.com/0KyMAN0/"
]
], [
["/\\b(srx02|angelus)\\b/ig", "Angelus"], [
"Cine; Running, ainda que agora xa non corro; e Chocolate xD."
], [
"https://git.k3y.pw/Angelus"
]
], [
["/\\b(srx03|[1i]noro)\\b/ig", "1noro"], [
"Entusiasta das redes, da programación e administración se sistemas. Centrandome sempre no software libre."
], [
"https://github.com/1noro",
"https://rats.land/",
"https://git.k3y.pw/1noro"
]
], [
["/\\bsrx04\\b/ig", "Srx04"], [
"Srx04 é un/ha divulgador@, Gamer e desenrolad@ que participou en certos proxectos ",
"coma MuWeb, AnP, WMarkDown, etc."
], []
], [
[
["/\\b(a[n&]p\\b|a\\.n\\.p\\.|a\\. +n\\. +p\\. +)/ig", "AnP"],
["/\\battach +and +play\\b/gi", "Attach and Play"]
], [
"AnP (Attach and Play) é un proxecto a modo Framework para desenrolar aplicacións, ",
"principalmente aplicacións Web ainda que pódese extender a xogos, aplicacións de ",
"escritorio ou de terminal/consola de comandos, desenrolado por KyMAN."
], [
"https://anp.k3y.pw/",
"https://git.k3y.pw/AnP/AnP"
]
], [
["/\\b((?<!\\.)xml\\b|x\\.m\\.l\\.|x\\. +m\\. +l\\. +)/ig", "XML"], [
"XML é un formato de almaceamento de datos en texto plano basado en marcas para a ",
"encapsulación por etiquetas, as cales identifícanse mediante aperturas e peches de ",
"diamantes, é dicir, '&lt;' e '&gt;'."
], [
"https://www.w3.org/XML/",
"https://es.wikipedia.org/wiki/Extensible_Markup_Language",
"https://developer.mozilla.org/es/docs/Web/XML/XML_introduction",
"https://support.microsoft.com/es-es/office/xml-para-no-iniciados-a87d234d-4c2e-4409-9cbc-45e4eb857d44"
]
], [
[
["/\\b(dpis?\\b|d\\.p\\.i\\.|d\\. +p\\. +i\\. +)/ig", "DPI"],
["/\\b(p{3}s?\\b|(p\\.){3}|(p\\. +){3})/ig", "PPP"],
["/\\bpuntos +(x|por) +pulgada\\b/gi", "Puntos Por Pulgada"],
["/\\bdots +per +inch\\b/gi", "Dots Per Inch"]
], [
"Os DPI ou Puntos por Pulgada, é unha unidade de medida para relativizar á densidade ",
"do número de píxels por pulgada nunha pantalla ou imaxe."
], [
"https://es.wikipedia.org/wiki/Puntos_por_pulgada",
"https://www.pccomponentes.com/dpi-que-son-para-que-sirven-cual-es-su-funcion-en-raton-gaminge",
"https://www.sony.es/electronics/support/articles/00027623"
]
], [
["/\\blicencia +(mit\\b|m\\.i\\.t\\.|m\\. +i\\. +t\\. +)/ig", "Licencia MIT"], [
"A Licencia MIT é unha licencia Open Source do MIT para compartir abertamente sen ",
"necesidade de nomear ó/á ou ós autores, e que permite a modificación e comercialización ",
"do Software."
], [
"https://es.wikipedia.org/wiki/Licencia_MIT",
"https://opensource.org/license/mit",
"https://www.licen.cc/es/licencias/mit/",
"https://www.youtube.com/watch?v=5oMm0MBPK6g"
]
], [
[
["/\\b(mit\\b|m\\.i\\.t\\.|m\\. +i\\. +t\\. +)/ig", "MIT"],
["/\\bmas{1,2}achuset{1,2}s? +institute +of +technology\\b/gi", "Massachusetts Institute of Technology"],
["/\\binstituto +(de +tecnolog[ií]a|tecnol[óo]gico) +de +mas{1,2}achuset{1,2}s?\\b/gi", "Instituto de Tecnología de Massachusetts"]
], [
"O MIT, ou Instituto Tecnolóxico de Massachusetts, é a Universidade Americana de ",
"Tecnoloxía por excelencia, onde está o desenrolo dos Robots como Atlas; ou a ",
"famosa licencia de Software Libre MIT."
], [
"https://www.mit.edu/",
"https://es.wikipedia.org/wiki/Instituto_de_Tecnolog%C3%ADa_de_Massachusetts"
]
], [
[
["/\\bopen *source\\b/ig", "Open Source"],
["/\\bsoftware +libre\\b/ig", "Software Libre"],
["/\\bsoftware +de +c[óo]digo +abierto\\b/gi", "Software de Código Abierto"]
], [
"O Open Source é o concepto de deixar público o código fonte dun proxecto para ",
"poder ser compartido e/ou analizado pola comunidade. O Free Open Source sería ",
"Software Libre e gratuito."
], [
"https://opensource.org/",
"https://es.wikipedia.org/wiki/Software_de_c%C3%B3digo_abierto"
]
], [
["/\\bgit *hub\\b/ig", "GitHub"], [
"GitHub é a plataforma principal pública para proxectos Git en Internet. Actualmente, ",
"GitHub.com é a opción para xestionar repositorios para proxectos mentras que GitHub.io ",
"é para a xeración de páxinas Web basadas no mesmo concepto de Git."
], [
"https://github.com/",
"https://github.io/",
"https://es.wikipedia.org/wiki/GitHub"
]
], [
["/\\bgit *lab\\b/ig", "GitLab"], [
"GitLab é o proxecto orixinal público con soporte para Self Hosting para xestión de ",
"proxectos Git. Pero ademáis ten a opción de facer uso como ferramenta externa como GitHub ",
"sen que éste pertenza a Microsoft."
], [
"https://gitlab.com/",
"https://es.wikipedia.org/wiki/GitLab",
"https://git-scm.com/book/es/v2/Git-en-el-Servidor-GitLab"
]
], [
["/\\bgitea\\b/ig", "Gitea"], [
"Gitea é unha alternativa ultralixeira e portable para ter un servidor local Git alternativo ",
"de baixos recursos e gran versatilidade."
], [
"https://gitea.com/",
"https://github.com/go-gitea/gitea",
"https://es.wikipedia.org/wiki/Gitea"
]
], [
["/\\b(?<!\\.)git\\b/ig", "Git"], [
"Git é un Software para facer control de sistemas de distribución de versións dun proxecto. ",
"Éste tamén permite control entre os participantes en grupos e permisos e xestión da ",
"publicación do código."
], [
"https://git-scm.com/",
"https://github.com/git/git",
"https://es.wikipedia.org/wiki/Git",
"https://learn.microsoft.com/es-es/devops/develop/git/what-is-git",
"https://www.atlassian.com/es/git/tutorials/what-is-git"
]
], [
["/\\berrors *manager\\b/ig", "ErrorsManager"], [
"ErrorsManager é un proxecto multiplataforma desenrolado por KyMAN orientado a xestionar códigos ",
"de error con valores Booleanos dentro de bloques String ou enteiros para simplificaren de forma ",
"binaria cada un deles."
], [
"https://errorsmanager.k3y.pw/",
"https://git.k3y.pw/KyMAN/ErrorsManager"
]
], [
[
["/\\bbits? *wise\\b/ig", "Bitwise"],
["/\\bdesplazamientos? *de *bits?\\b/ig", "Desplazamiento de Bit"]
], [
"Bitwise ou Desprazamento de Bit é unha práctica de traballo en binarios que se trata de desaprazar ",
"bits á dereita ou á esquerda nun valor para operar con eles. É unha práctica moi utilizada ",
"en informática é realizan operacións que soen vir integrados nos procesadores físicos, o ",
"que fai destas operacións un traballo moi rápido, global e áxil. Tamén sóense englobar os ",
"operadores de Bits habituais como AND, NOT, OR, etc."
], [
"https://es.wikipedia.org/wiki/Operador_a_nivel_de_bits",
"https://www.w3schools.com/js/js_bitwise.asp",
"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Bitwise_OR",
"https://ellibrodepython.com/operadores-bitwise",
"https://manual.gamemaker.io/monthly/es/Additional_Information/Bitwise_Operators.htm"
]
], [
["/\\b(?<!\\.)((j\\.s\\.o\\.n\\.|j\\. +s\\. +o\\. +n\\. +)|json\\b)/gi", "JSON"],
[
"Os arquivos JSON son arquivos para estructuración de datos no formato de diccionarios (Arrays ",
"Asociativos) e vectores e matrices (Arrays Indexados ou Secuenciales) de JavaScript."
], [
"https://www.json.org/",
"https://es.wikipedia.org/wiki/JSON",
"https://www.oracle.com/es/database/what-is-json/",
"https://www.hostinger.es/tutoriales/que-es-json"
]
], [
[
["/\\bjava *script\\b/ig", "JavaScript"],
["/\\b(?<!\\.)js\\b/ig", "JS"],
["/\\b(?<!\\.)ecma( *script)?\\b/ig", "ECMAScript"],
["/\\btype *script\\b/ig", "TypeScript"],
["/\\b(?<!\\.)ts\\b/gi", "TS"]
], [
"JavaScript, ou JS é unha linguaxe de programación débilmente tipada e moi flexible sintácticamente, interpretado ",
"e precompilado, coñecido principalmente por NodeJS e JavaScript nos navegadores cara programación Web ",
"Front End. Por outra banda, temos ECMAScript, que deriva de JavaScript cara un estándar usado en Node ",
"principalmente. Tamén temos derivacións compiladas como TypeScript, TS, que permite definir mellor os ",
"elementos."
], [
"https://ecma-international.org/",
"https://es.wikipedia.org/wiki/JavaScript",
"https://es.wikipedia.org/wiki/ECMAScript",
"https://www.w3schools.com/js/",
"https://developer.mozilla.org/es/docs/Learn/JavaScript/First_steps/What_is_JavaScript",
"https://developer.mozilla.org/es/docs/Glossary/ECMAScript",
"https://es.javascript.info/",
"https://lenguajejs.com/javascript/"
]
], [
["/\\bstring(s)?\\b/ig", "String$1"], [
"Un String é un tipado de valor para referirse a un texto. Básicamente ven sendo unha cadea ou vector de ",
"caracteres que mediante funcións ou estructuras internas da linguaxe permite ser traballado como un tipado ",
"nativo."
], [
"https://es.wikipedia.org/wiki/Cadena_de_caracteres",
"https://developer.mozilla.org/es/docs/Glossary/String",
"https://docs.python.org/es/3/library/string.html",
"https://learn.microsoft.com/es-es/dotnet/api/system.string?view=net-8.0",
"https://www.php.net/manual/es/language.types.string.php",
"https://www.w3schools.com/js/js_string_methods.asp"
]
], [
[
["/\\b(acl|a\\.c\\.l\\.|a\\. +c\\. +l\\. +)\\b/ig", "ACL"],
["/\\blistas? +de +control +de +acceso\\b/gi", "Lista de Control de Acceso"],
["/\\baccess +control +lists?\\b/gi", "Access Control List"]
], [
"As ACL ou Listas de Control de Acceso son unha serie de normas que extenden os permisos dun ",
"entorno UNIX, LDAP ou de Rede."
], [
"https://es.wikipedia.org/wiki/Lista_de_control_de_acceso",
"https://datatracker.ietf.org/doc/html/rfc4949",
"https://launchpad.net/ubuntu/+source/acl",
"https://packages.debian.org/search?keywords=acl"
]
], [
[
["/\\b(cdn|c\\.d\\.n\\.|c\\. +d\\. +n\\. +)\\b/ig", "CDN"],
["/\\bred +de +distri[bv]uci[oó]n +de +contenidos?\\b/gi", "Red de Distribución de Contenidos"],
["/\\bcontents? +delivery +network\\b/gi", "Content Delivery Network"]
], [
"Unha Rede de Distribución de Contidos ou CDN ven sendo unha rede de servidores para distruir e ",
"manter contidos en Rede de forma centralizada para especializar contidos de uso común."
], [
"https://es.wikipedia.org/wiki/Red_de_distribuci%C3%B3n_de_contenidos",
"https://www.cloudflare.com/es-es/learning/cdn/what-is-a-cdn/",
"https://aws.amazon.com/es/what-is/cdn/",
"https://learn.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2008-R2-and-2008/cc754435(v=ws.11)?redirectedfrom=MSDN"
]
], [
[
["/\\bsql *server\\b/ig", "SQL Server"],
["/\\btransact *sql\\b/gi", "Transact SQL"]
], [
"SQL Server é o motor de Base de Datos relacional de Microsoft, coa linguaxe Transact SQL."
], [
"https://www.microsoft.com/es-es/sql-server",
"https://www.tsql.info/",
"https://learn.microsoft.com/es-es/training/modules/get-started-transact-sql-programming/",
"https://es.wikipedia.org/wiki/Transact-SQL",
"https://es.wikipedia.org/wiki/Microsoft_SQL_Server",
"https://www.arsys.es/blog/ms-sql-server"
]
], [
[
["/\\bmy *sql\\b/ig", "MySQL"],
["/\\bmaria *(db|bd)\\b/gi", "MariaDB"]
], [
"MySQL é un motor Free Open Source para Bases de Datos relacionais coa linguaxe SQL, actualmente ",
"propiedade de Oracle. Por éste último motivo e para preserva-la filosofía anterior a Oracle, existe ",
"o Fork MariaDB como alternativa fora de Oracle."
], [
"https://www.mysql.com/",
"https://mariadb.org/",
"https://mariadb.com/",
"https://github.com/mysql/mysql-server",
"https://github.com/MariaDB",
"https://es.wikipedia.org/wiki/MySQL",
"https://es.wikibooks.org/wiki/MySQL",
"https://es.wikipedia.org/wiki/MariaDB",
"https://en.wikibooks.org/wiki/MariaDB",
"https://www.arsys.es/blog/mysql"
]
], [
["/\\bsql *l?ite\\b/ig", "SQLite"], [
"SQLite é un pequeno motor para Bases de Datos relacionais, moi simplificado con ausencia de ",
"certos elementos como Procedimientos Almaceados ainda que coa capacidade de integrar compilados ",
"de C, moi extendido para usos locais."
], [
"https://www.sqlite.org/",
"https://es.wikipedia.org/wiki/SQLite",
"https://github.com/sqlite/sqlite",
"https://docs.python.org/es/3/library/sqlite3.html",
"https://codigofacilito.com/articulos/configurando-sqlite"
]
], [
[
["/\\b((?<!\\.)sql\\b|s\\.q\\.l\\.|(?<! )s\\. +q\\. +l\\. +)/ig", "SQL"],
["/\\bstructured +query +language\\b/gi", "Structured Query Language"],
["/\\blengua[jg]e +de +consulta +estructurada\\b/gi", "Lenguaje de Consulta Estructurada)"]
], [
"SQL é unha linguaxe que parte de Pascal para xestión de datos."
], [
"https://www.iso.org/standard/76583.html",
"https://es.wikipedia.org/wiki/SQL",
"https://datademia.es/blog/que-es-sql"
]
], [
[
["/\\b(?<!\\.)(was[mt]|w\\.a\\.s\\.[mt]\\.|(?<! )w\\. +a\\. +s\\. +[mt]\\. +)\\b/gi", "WASM"],
["/\\bweb *assembly\\b/gi", "WebAssembly"]
], [
"WebAssembly, o WASM, es un API de navegador para ejecución de binarios compilados de una forma ",
"específica con el objetivo de agilizar y profundizar en el entorno cliente Web. Actualmente ",
"se pueden desarrollar WASM desde C, Rust, C++, etc."
], [
"https://webassembly.org/",
"https://es.wikipedia.org/wiki/WebAssembly",
"https://developer.mozilla.org/es/docs/WebAssembly"
]
], [
[
["/\\b(gui|(?<!\\.)(g\\.u\\.i\\.|(?<! )g\\. +u\\. +i\\. +))(?![a-zÀ-ÖØ-öø-ÿ])\\b/gi", "GUI"],
["/\\b(ui|(?<!\\.)(u\\.i\\.|(?<! )u\\. +i\\. +))\\b/gi", "UI"],
["/\\bgraphic(al)? +user +interface\\b/gi", "Graphical User Interface"],
["/\\buser +interface\\b/gi", "User Interface"],
["/\\binterfa(z|ce) +gr[aá]fica +del? +usuario\\b/gi", "Interfaz Gráfica de Usuario"],
["/\\binterfa(z|ce) +del? +usuario\\b/gi", "Interfaz de Usuario"]
], [
"El UI, o Interfaz Gráfica por sus siglas en Inglés, es un entorno donde el usuario puede ",
"interactuar o ver una información; y el GUI, o Interfaz Gráfica del Usuario por sus siglas ",
"en inglés, sería un entorno gráfico, no sólo Core en modo texto, donde el usuario puede ",
"ver y/o interactuar con una información."
], [
"https://es.wikipedia.org/wiki/Interfaz_gr%C3%A1fica_de_usuario"
]
], [
["/\\bweb\\b/gi", "Web"], [
"La Web es lo que conocemos como aquella parte de Internet regida por la normativa de la W3 ",
"donde nos podemos encontrar sitios Web, páginas Web y protocolos y versiones Web."
], [
"https://www.w3.org/",
"https://es.wikipedia.org/wiki/Web"
]
], [
["/\\bi18n\\b/gi", "I18N"], [
"La I18N, o Intenacionalización, viene siendo la gestión de textos en distintos idiomas dentro ",
"de una aplicación. Puede haber numerosos métodos para dicho fin, ya sea dependiendo del lenguaje, ",
"así como la filosofía de desarrollo escogida."
], [
"https://es.wikipedia.org/wiki/Internacionalizaci%C3%B3n_y_localizaci%C3%B3n",
"https://www.w3.org/International/questions/qa-i18n.en.html#i18n",
"https://developer.mozilla.org/es/docs/Mozilla/Add-ons/WebExtensions/API/i18n"
]
], [
["/\\bsingletons?\\b/gi", "Singleton"], [
"Un Singleton es una instancia única de un clase, es decir, la instancia de una clase que sólo ",
"puede ser creada como objeto una única vez. Este término de uso único también es aplicado por ",
"KyMAN para ejecuciones de funciones que sólo pueden ser ejecutadas una única vez por estructura ",
"de código."
], [
"https://es.wikipedia.org/wiki/Singleton",
"http://design-patterns-with-uml.blogspot.com/2013/02/singleton-pattern.html",
"https://medium.com/dise%C3%B1o-de-software/singleton-el-patr%C3%B3n-del-mal-f3fdab0e16a2"
]
], [
["/\\bcallback(s)?\\b/gi", "Callback$1"], [
"Función que se envía para ser llamada por alguna acción, ya sea de forma síncrona (Para definir ",
"cómo hacer algo a algún método, como sucede con los métodos 'sort', 'reduce', etc.) o asíncrona ",
"(como sucede cuando se quiere continuar un proceso de forma asíncrona, como una carga de algo, ",
"etc. Sin hacer uso de elementos de gestión de hilos de proceso de tipo 'wait')."
], [
"https://es.wikipedia.org/wiki/Retrollamada_(inform%C3%A1tica)",
"https://developer.mozilla.org/es/docs/Glossary/Callback_function",
"https://www.freecodecamp.org/espanol/news/que-es-una-funcion-callback-javascript/",
"https://lenguajejs.com/javascript/asincronia/callbacks/"
]
], [
["/\\bbool(ean(o)?)?\\b/gi", "Boolean$2"], [
"Un valor Booleano es aquel cuyo tipado que sólo puede tener dos valores lógicos: verdadero o falso, ",
"equivalentes a 1 y a 0 consecutivamente a nivel de Bit. Ésto parte del álgebra de Bool."
], [
"https://es.wikipedia.org/wiki/Tipo_de_dato_l%C3%B3gico",
"https://es.wikipedia.org/wiki/%C3%81lgebra_booleana",
"https://developer.mozilla.org/es/docs/Web/JavaScript/Reference/Global_Objects/Boolean",
"https://learn.microsoft.com/es-es/dotnet/csharp/language-reference/builtin-types/bool"
]
], [
["/\\bbit(s)?\\b/gi", "Bit$1"], [
"Un Bit es la unidad mínima de memoria e información, y representaría un 0 o un 1, que como valor Booleano ",
"sería 'false' y 'true' consecutivamente."
], [
"https://es.wikipedia.org/wiki/Bit",
"https://es.wiktionary.org/wiki/bit",
"https://www.rae.es/dpd/bit"
]
], [
["/\\b(?<!\\.)js *doc\\b/gi", "JSDoc"], [
"JSDoc es un sistema estándar para documentar código JavaScript y equivalentes a partir de comentarios ",
"dentro de código. Esto no sólo nos facilita la interpretación del código sino que también ayuda al IDE ",
"a guiarnos por el mismo si éste posee las herramientas adecuadas."
], [
"https://jsdoc.app/",
"https://github.com/jsdoc/jsdoc",
"https://es.wikipedia.org/wiki/JSDoc",
"https://www.typescriptlang.org/docs/handbook/jsdoc-supported-types.html"
]
], [
["/\\bframe *work(s)?\\b/gi", "Framework$1"], [
"Conjunto de herramientas y librerías con un fin o propósito diseñado para ayuda al desarrollo de un tipo ",
"de Software con una filosofía, lenguajes y estructuras concretas."
], [
"https://es.wikipedia.org/wiki/Framework",
"https://unirfp.unir.net/revista/ingenieria-y-tecnologia/framework/"
]
], [
[
["/\\b(?<![\\.a-zÀ-ÖØ-öø-ÿ])as( *[23](\\.0)?)?(?![a-zÀ-ÖØ-öø-ÿ])\\b/gi", "AS$1"],
["/\\baction *script( *[23](\\.0)?)?\\b/gi", "ActionScript$1"]
], [
"ActionScript es un lenguaje de programación el cual fue usado para desarrollar en Flash. Actualmente, ",
"JavaScript en entorno navegador, aparentemente heredó muchos conceptos de éste pues antes de que ",
"JavaScript en entorno navegador haga lo que hace hoy, lo hacía Action Script. La extensión de los archivos ",
"ActionScript es AS."
], [
"https://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/index.html",
"https://help.adobe.com/en_US/as3/dev/index.html",
"https://web.archive.org/web/20130131044759/http://help.adobe.com/en_US/AS2LCR/Flash_10.0/help.html?content=Part2_AS2_LangRef_1.html",
"https://en.wikipedia.org/wiki/ActionScript"
]
], [
[
["/\\b(?<!\\.)swf\\b/gi", "SWF"],
["/\\bmacromedia *flash *player\\b/gi", "Macromedia Flash Player"],
["/\\bmacromedia *flash\\b/gi", "Macromedia Flash"],
["/\\badobe *flash *player\\b/gi", "Adobe Flash Player"],
["/\\badobe *flash\\b/gi", "Adobe Flash"],
["/\\bflash *player\\b/gi", "Flash Player"],
["/\\bruf+le\\b/gi", "Ruffle"],
["/\\bflash\\b/gi", "Flash"]
], [
"Flash fue una tecnología para crear animaciones principalmente, aunque en su momento dio tal versatilidad ",
"que muchos lo usaron no sólo como recurso Web sino para crear páginas Web o juegos y/o aplicaciones Web. ",
"El lenguaje de programación sobre el que se sostenía era Action Script. Actualmente, Flash ya no existe de ",
"forma oficial y fue sustituído por Adobe Air entre otras tecnologías de la misma compañía. La extensión de ",
"los compilados de Flash era SWF. Existen emuladores para dichos archivos como lo es el Ruffle."
], [
"https://www.adobe.com/es/products/flashplayer/end-of-life-alternative.html",
"https://es.wikipedia.org/wiki/Adobe_Flash_Player",
"https://ruffle.rs/"
]
], [
["/\\bscript(s)?\\b/gi", "Script$1"], [
"Un Script no es más que un conjunto de órdenes para automatización de tareas o para designar acciones o ",
"conjuntos de acciones bajo una orden."
], [
"https://es.wikipedia.org/wiki/Script"
]
], [
[
["/\\bx[ \\-]*gravity\\b/gi", "XGravity"],
["/\\balienado\\b/gi", "Alienado"]
], [
"Alienado, antiguamente XGravity, es un juego basado en XQuest desarrollado plenamente por KyMAN tipo Asteroids ",
"de MSDOS pero orientado a navegador. La primera versión fue un SWF desarrollado en ActionScript 2.0, pero el ",
"resto de versiones ya fueron en JavaScript. La idea de cambiarle a Alienado fue en pensar en Aliens y la ",
"película Sharknado."
], [
"https://xgravity.k3y.pw",
"https://git.k3y.pw/KyMAN/XGravity"
]
], [
["/\\bx[ \\-]*qu?est\\b/gi", "XQuest"], [
"XQuest es un juego para MSDOS del tipo Asteroids pero con unos gráficos más avanzados, con Scroll y Parallax."
], [
"http://www.swallowtail.org/xquest/",
"http://www.abandonia.com/es/games/28643/XQuest.html"
]
], [
[
["/\\bDOS\\b/g", "DOS"],
["/\\b(microsoft|ms) *dos\\b/gi", "MSDOS"],
["/\\bcomandos\\b/gi", "COMANDOS"],
["/\\b((?<!\\.)cmd|c\\.m\\.d\\.|c\\. +m\\. +d\\. +)\\b/gi", "CMD"],
["/\\bconsola *de *comandos *de *windows\\b/gi", "Consola de Comandos de Windows"],
["/\\bs[ií]mbolo *de *sistema\\b/gi", "Símbolo de Sistema"],
["/\\b(?<!\\.)batch\\b/gi", "Batch"]
], [
"DOS es el sistema Core base de Microsoft cuyo primer Sistema Operativo fue MSDOS, utilizado como base Core de ",
"Windows hasta Windows XP donde apareció COMANDOS, una evolución de MSDOS. Los archivos de Script nativos de DOS ",
"son los Batch. Actualmente se puede acceder a COMANDOS desde Símbolo de Sistema de Windows."
], [
"https://github.com/microsoft/MS-DOS",
"https://es.wikipedia.org/wiki/DOS",
"https://es.wikipedia.org/wiki/MS-DOS",
"https://es.wikipedia.org/wiki/S%C3%ADmbolo_del_sistema_de_Windows",
"https://es.wikipedia.org/wiki/Archivo_batch",
"https://web.archive.org/web/20160309064627/https://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/windows_dos_overview.mspx?mfr=true"
]
], [
["/\\bscrolls?\\b/gi", "Scroll"], [
"Los Scroll son la capacidad gráfica de poder desplazar internamente un marco en una pantalla sobre un contenido ",
"que ocupa más que el mismo, y éste puede ser horizontal o vertical."
], [
"https://es.wikipedia.org/wiki/Scroll"
]
], [
[
["/\\bp[áa]ral+ax\\b/gi", "Parallax"],
["/\\bparalaje\\b/gi", "Paralaje"]
], [
"El Parallax, o Paralaje, es una sincronización de movimientos 2D para distintos elementos a diferentes velocidades, ",
"reconocíblemente usado en los fondos de los videojuegos 2D donde los las distintas profundidades se distinguen por ",
"ese movimiento distintivo."
], [
"https://es.wikipedia.org/wiki/Paralaje"
]
], [
[
["/\\bcr[yi]pto *activo(s)?\\b/gi", "Cryptoactivo$1"],
["/\\bcr[yi]pto *moneda(s)?\\b/gi", "Cryptomoneda$1"],
["/\\bcr[yi]pto *coin(s)?\\b/gi", "Cryptocoin$1"],
["/\\bcr[yi]pto *divisa(s)?\\b/gi", "Cryptodivisa$1"]
], [
"Un Cryptoactivo o Cryptodivisa o Cryptomoneda no es más que un recurso económico digital el cual puede ser no físico. ",
"El más conocido es el Bitcoin, pero hay muchos más y más tipos como los NFT y otro tipo de recursos."
], [
"https://es.wikipedia.org/wiki/Criptomoneda",
"https://www.cnmv.es/Cursos/Educacion-Financiera/Criptoactivos/index.html",
"https://www.imf.org/es/Publications/fandd/issues/2022/09/Regulating-crypto-Narain-Moretti"
]
], [
[
["/\\bbitcoin\\b/gi", "Bitcoin"],
["/\\b((?<!\\.)btc|b\\.t\\.c\\.|b\\. +t\\. +c\\. +)\\b/gi", "BTC"]
], [
"El Bitcoin es la Cryptomoneda más conocida y más usada, siendo de las primeras Cryptodivisas que se hicieron ",
"específicamente para su uso en Internet. Su símbolo es BTC. Su funcionamiento, garantías, etc. Se basa en una base de ",
"datos pública basada en Block Chain. Fue diseñada por un desconocido Satoshi Nakamoto, del cual se sacó el nombre a la ",
"unidad mínima que puede trabajar, el Satoshi, que viene siendo una diezmillonésima parte de un Bitcoin entero."
], [
"https://bitcoin.org/es/",
"https://bitcoin.org/files/bitcoin-paper/bitcoin_es_latam.pdf",
"https://github.com/bitcoin/bitcoin",
"https://es.wikipedia.org/wiki/Bitcoin",
"https://www.blockchain.com/explorer/assets/btc"
]
], [
["/\\bsatoshi *nakamoto\\b/gi", "Satoshi Nakamoto"], [
"Satoshi Nakamoto es el pseudónimo por el cual se conoce al creador del White Paper del Bitcoin, aunque actualmente no ",
"se sabe a ciencia cierta quién es."
], [
"https://es.wikipedia.org/wiki/Satoshi_Nakamoto",
"https://www.mail-archive.com/search?l=cryptography@metzdowd.com&q=from:%22Satoshi+Nakamoto%22"
]
], [
[
["/\\blitecoin\\b/gi", "Litecoin"],
["/\\b((?<!\\.)ltc|b\\.l\\.c\\.|b\\. +l\\. +c\\. +)\\b/gi", "LTC"]
], [
"Litecoin es una Cryptodivisa inspirada plenamente en Bitcoin con una filosofía de seguridad y agilidad ",
"transaccional, así como menor peso y consumo por parte del Core tanto en RAM como por procesador. Su ",
"símbolo es el LTC."
], [
"https://litecoin.org/",
"https://litecoin.com/en/",
"https://github.com/litecoin-project/litecoin",
"https://es.wikipedia.org/wiki/Litecoin",
"https://x.com/litecoin",
"https://www.reddit.com/r/litecoin/"
]
], [
[
["/\\bsrx06\\b/gi", "Grillo Team"],
["/\\bgri(ll+|y)o[ \t]*t(e[ae]|i)[mn]\\b/gi", "Grillo Team"]
], [
"Grupo profesional de las TIC."
], []
], [
["/\\bkde(['`] *)?n(['`] *)?live\\b/gi", "Kdenlive"], [
"Kdenlive es un editor de vídeos no lineales Free OpenSource con mantenimiento de desarrollo de la ",
"comunidad KDE."
], [
"https://kdenlive.org/",
"https://github.com/KDE/kdenlive",
"https://apps.kde.org/es/kdenlive/",
"https://es.wikipedia.org/wiki/Kdenlive",
"https://bugs.kde.org/buglist.cgi?product=kdenlive"
]
], [
["/\\bM[Aa][Nn][Gg][Aa]\\b/g", "Manga"], [
"El Manga es el estilo de dibujo Japonés orientado al Cómic para la representación de historias principalmente."
], [
"https://es.wikipedia.org/wiki/Manga",
"https://es.wikipedia.org/wiki/Historieta",
"https://commons.wikimedia.org/wiki/Category:Manga",
"https://es.wikibooks.org/wiki/Manga",
"https://es.wikinews.org/wiki/Categor%C3%ADa:Manga"
]
], [
["/\\banime\\b/gi", "Anime"], [
"El Anime es el estilo de animación japonesa."
], [
"https://es.wikipedia.org/wiki/Anime",
"https://commons.wikimedia.org/wiki/Category:Anime",
"https://es.wikinews.org/wiki/Categor%C3%ADa:Anime"
]
], [
["/\\b((?<!\\.)a\\.[n\\&]\\.p\\.r\\.m\\.|a\\. +[n\\&]\\. +p\\. +r\\. +m\\. +|a[n\\&]prm\\b)/gi", "AnPRM"],
[
"El proyecto AnPRM viene siendo un proyecto desarrollado por Srx00 para desarrollar bases de proyectos ",
"plenamente funcionales sobre el propio proyecto AnP, principalmente desarrollado en HTML, SASS y JavaScript ",
"sobre el cliente; y MariaDB y Python sobre el servidor. El proyecto actualmente está privado pero se espera ",
"ser publicado como servicio de uso general."
], []
], [
["/\\bhard *ware\\b/gi", "Hardware"],
[
"En informática, sería la parte tangible, es decir, aquellos componentes físicos que componen un equipo ",
"informático."
], [
"https://es.wikipedia.org/wiki/Hardware",
"https://dle.rae.es/hardware",
"https://concepto.de/hardware/",
"https://apen.es/glosario-de-informatica/hardware/"
]
], [
["/\\bent01\\b/gi", "ENT01"], [
"Empresa gallega de desarrollo de Aplicaciones Web."
], []
], [
["/\\bw( +|\\-)?log(s)?\\b/gi", "WLog$2"], [
"Un WLog viene siendo un término personalizado para hacer referencia a un Blog hecho sobre una base de ",
"WMarkDown."
], []
], [
["/\\btag(s)?\\b/gi", "Tag$1"], [
"Los Tags, tambié conocidas como etiquetas en Español, son palabras clave orientadas a facilitar las ",
"búsquedas en conjuntos de datos masivos relacionados."
], [
"https://es.wikipedia.org/wiki/Etiqueta_(metadato)",
"https://www.luisrevuelto.es/blog/tecnicas-seo-como-usar-tags-correctamente/",
"https://www.hostinger.es/tutoriales/que-son-las-tags",
"https://www.ionos.es/digitalguide/paginas-web/desarrollo-web/tags/",
"https://www.webempresa.com/blog/que-son-los-tags-y-para-que-sirven.html"
]
], [
["/\\bguin(x|ch)u\\b/gi", "Guinxu"], [
"Guinxu es un desarrollador de videojuegos Indie español, conocido tanto por sus redes sociales como por ",
"su juego Flatworld principalmente."
], [
"https://guinxu.com/",
"https://www.youtube.com/@Guinxu",
"https://www.facebook.com/Guinxu/",
"https://www.tiktok.com/@guinxudev",
"https://www.twitch.tv/guinxu",
"https://www.youtube.com/@MomentoGuinxu",
"https://www.youtube.com/@hackeandoconguinxu718",
"https://x.com/guinxu",
"https://www.instagram.com/Guinxu/",
"https://store.steampowered.com/developer/Guinxu",
"https://eu.wikipedia.org/wiki/Guinxu",
"https://youtube.fandom.com/es/wiki/Guinxu"
]
], [
["/\\bh?al[bv]a *ma([jhyl]|ll)o\\b/gi", "Alva Majo"], [
"Alva Majo es un desarrollador de videojuegos Indie español conocido principalmente por sus redes sociales ",
"y sus juegos Purella, Pineapple On Pizza y Majotori entre otros."
], [
"https://www.alvamajo.com/",
"https://youtube.fandom.com/es/wiki/Alva_Majo",
"https://x.com/5ro4",
"https://www.twitch.tv/5ro4",
"https://www.youtube.com/@alvamajoclips",
"https://www.youtube.com/@majorariatto",
"https://youtube.fandom.com/es/wiki/Alva_Majo"
]
], [
[
["/\\b((?<!\\.)cs|c\\.s\\.|c\\. +s\\. +)\\b/i", "CS"],
["/\\bc\\#/i", "C#"],
["/\\bc *sharp\\b/i", "C Sharp"]
], [
"C Sharp, más conocido como C#, es un lenguaje de programación desarrollado por Microsoft contra .NET, ",
"que convivió durante mucho tiempo con Visual Basic para poder coger usuarios de desarrollo Java, de ahí ",
"la sintaxis que se asemeja enormente a dicho lenguaje, y migrarlos al entorno de .NET."
], [
"https://learn.microsoft.com/es-es/dotnet/csharp/",
"https://es.wikipedia.org/wiki/C_Sharp",
"https://www.w3schools.com/cs/index.php"
]
], [
[
["/\\b(?!\\.)go\\b/i", "Go"],
["/\\bgo *lang?\\b/i", "Golang"]
], [
"Golang, más conocido como Go, es un lenguaje de programación estructurada desarrollado por Google. Su ",
"filosofía es la eficiencia y seguridad de los datos a partir del recolector de basura. Para la programación ",
"de procesos paralelos se hace uso de las Gorutinas, que vienen siendo como promesas pero gestionadas por el ",
"propio Runtime de Go. Esto hace que para casos como el de WASM se requiera de integrar dentro del compilado ",
"el Runtime de Go, lo que hace aumentar el peso del mismo significativamente."
], [
"https://go.dev/",
"https://github.com/golang/go",
"https://go.googlesource.com/go",
"https://es.wikipedia.org/wiki/Go_(lenguaje_de_programaci%C3%B3n)"
]
], [
[
["/\\b(rust([ \\-]*lang?)?|(?!\\.)rs)\\b/i", "Rust"]
], [
"Rust es un lenguaje de programación estructurada que compite con C. Su filosofía es la seguridad de los datos ",
"y el rendimiento. Su uso se está extendiendo enormente pese a tener una curva de dificultad muy elevada y ",
"requerir de mezclar enormes cantidades de protocolos o metodologías internas para hacerlo funcionar de forma eficaz."
], [
"https://www.rust-lang.org/",
"https://doc.rust-lang.org/stable/",
"https://github.com/rust-lang/rust",
"https://es.wikipedia.org/wiki/Rust_(lenguaje_de_programaci%C3%B3n)",
"https://rustlang-es.org/",
"https://x.com/rustlang"
]
], [
[
["/\\b((?<!\\.)php|p\\.h\\.p\\.|p\\. +h\\. +p\\. +)\\b/i", "PHP"],
["/\\bpersonal *home *page\\b/i", "Personal Home Page"],
["/\\bh?[yi]pertext *(pre)?proces+or\\b/i", "Hypertext Preprocessor"]
], [
"PHP, también conocido como Hypertext Preprocessor, es un lenguaje interpretado usado habitualmente para ",
"el desarrollo de servicios Web. Está muy extendido su uso en entornos de CMS como Wordpress, MediaWiki, etc."
], [
"https://www.php.net/",
"https://github.com/php/php-src",
"https://es.wikipedia.org/wiki/PHP",
"https://developer.mozilla.org/es/docs/Glossary/PHP"
]
], [
[
["/\\bdoge[ \\-]*coin\\b/i", "Dogecoin"],
["/\\bdoge\\b/i", "DOGE"],
["/\\bÐ\\b/", "Ð"]
], [
"El Dogecoin, o DOGE, es una Cryptomoneda del tipo Bitcoin Memecoin, Fork de Litecoin, actualmente conocida ",
"por la exposición mediática de Elon Musk."
], [
"https://dogecoin.com/",
"https://github.com/dogecoin/dogecoin",
"https://x.com/dogecoin",
"https://es.wikipedia.org/wiki/Dogecoin"
]
], [
[
["/\\bdash([ \\-]*coin)?\\b/i", "Dash"],
["/\\bx[ \\-]*coin\\b/i", "XCoin"]
], [
"Dash es un Cryptoactivo que parte de la misma idea de Bitcoin pero implementando nuevos servicios ",
"transaccionales como InstantSend para agilizar las transacciones, así como PrivateSend para mejorar la ",
"privacidad de la misma."
], [
"https://www.dash.org/",
"https://github.com/dashpay/dash",
"https://es.wikipedia.org/wiki/Dash_(criptomoneda)"
]
], [
[
["/\\bfair[ \\-]*coin\\b/i", "Faircoin"],
["/\\bfair\\b/i", "FAIR"]
], [
"Faircoin, o FAIR, es un proyecto de FairCoop para realizar la parte colaborativa económica de su proyecto, ",
"haciendo de éste su sistema monetario, base del mismo proyecto FairCoop."
], [
"https://fair-coin.org/",
"https://x.com/faircoinconf",
"https://es.wikipedia.org/wiki/FairCoop"
]
], [
[
["/\\bmath[ \\-\\.]*jax\\b/i", "MathJax"],
["/\\blatex\\b/i", "LaTeX"],
["/\\bmath[ \\-\\.]*ml\\b/i", "MathML"],
["/\\bascii[ \\.\\-]*math[ \\-\\.]*ml\\b/i", "ASCIIMathML"]
], [
"MathJax es una librería JavaScript para implementar funciones matemáticas codificadas en LaTeX, MathML y ",
"ASCIIMathML para entornos Web principalmente, aunque su uso puede extenderse fuera de dicho ámbito.. Fue ",
"desarrollado por la Sociedad Estadounidense de Matemática."
], [
"https://www.mathjax.org/",
"https://github.com/mathjax/MathJax",
"https://x.com/mathjax",
"https://www.latex-project.org/",
"https://github.com/latex3/latex2e",
"https://es.wikibooks.org/wiki/Manual_de_LaTeX",
"https://asciimath.org/",
"https://github.com/asciimath/asciimathml",
"https://www.w3.org/Math/",
"https://www.data2type.de/en/xml-xslt-xslfo/math-ml/",
"https://xrjunque.nom.es/(S(wc3b1mabt1xd54jsgfv2gbqm))/MathML_To_String",
"https://es.wikipedia.org/wiki/MathJax",
"https://es.wikipedia.org/wiki/AsciiMath",
"https://es.wikipedia.org/wiki/LaTeX"
]
], [
["/\\bmermaid([ \\-\\.]*js)?\\b/i", "MermaidJS"], [
"MermaidJS es una librería JavaScript para implementar esquemas, estructuras, gráficos, etc. Desde un sencillo ",
"entorno de texto encapsulado, procesado de forma dinámica en JavaScript para HTML."
], [
"https://mermaid.js.org/",
"https://github.com/mermaid-js/mermaid",
"https://mermaid.live/"
]
]]

View File

@ -25,8 +25,8 @@
margin: 0em; margin: 0em;
padding: .1em .4em; padding: .1em .4em;
height: 1.2em; height: 1.2em;
border: .1em solid #BBB; border: 0.1em solid #BBB;
box-shadow: 0em 0em .8em inset #BBB; } box-shadow: 0em 0em 0.8em inset #BBB; }
.wmd-code-block .data li::before { .wmd-code-block .data li::before {
font-family: monospace; } font-family: monospace; }
.wmd-code-block .data li > [data-i18n] { .wmd-code-block .data li > [data-i18n] {
@ -68,6 +68,31 @@
.wmd-code-block[data-type=mermaid] svg { .wmd-code-block[data-type=mermaid] svg {
font-size: 1em; } font-size: 1em; }
.wmd-code-sample-block[data-processed=false] {
display: none; }
.wmd-code-sample-block > nav > ul {
margin: 0em;
padding: 0em;
list-style-type: none;
text-align: left; }
.wmd-code-sample-block > nav > ul > li {
display: inline-block;
padding: .2em .5em;
border: 0.1em solid #BBB;
cursor: pointer;
box-shadow: 0em 0em 0.8em inset #BBB;
transition-duration: 1s;
transition-property: box-shadow; }
.wmd-code-sample-block > nav > ul > li[data-selected=true] {
box-shadow: 0em 0em 0.2em inset #BBB; }
.wmd-code-sample-block > nav > ul > li:hover {
box-shadow: 0em 0em 1.2em inset #BBB;
transition-duration: 0.25s; }
.wmd-code-sample-block > nav > ul > :first-child {
border-radius: .3em 0em 0em .3em; }
.wmd-code-sample-block > nav > ul > :last-child {
border-radius: 0em .3em .3em 0em; }
.wmd-quote { .wmd-quote {
display: flex; display: flex;
margin: 1em 2em; margin: 1em 2em;
@ -250,9 +275,7 @@
box-sizing: border-box; } box-sizing: border-box; }
.wmd-media:not([data-type=icon]) img { .wmd-media:not([data-type=icon]) img {
width: 100%; width: 100%;
height: auto; height: auto; }
max-width: 30em;
max-height: 30em; }
.wmd-media:not([data-type=icon]) img + span { .wmd-media:not([data-type=icon]) img + span {
background-position: center center; background-position: center center;
background-size: cover; } background-size: cover; }

File diff suppressed because one or more lines are too long

View File

@ -1,4 +1,5 @@
// Settings // Settings
$color-fore : #BBB;
$transition-in : .25s; $transition-in : .25s;
$transition-out : 1s; $transition-out : 1s;
// Settings // Settings
@ -29,8 +30,8 @@ $transition-out : 1s;
margin : 0em; margin : 0em;
padding : .1em .4em; padding : .1em .4em;
height : 1.2em; height : 1.2em;
border : .1em solid #BBB; border : .1em solid $color-fore;
box-shadow : 0em 0em .8em inset #BBB; box-shadow : 0em 0em .8em inset $color-fore;
&::before{font-family : monospace;} &::before{font-family : monospace;}
&>[data-i18n]{display : none;} &>[data-i18n]{display : none;}
} }
@ -69,6 +70,31 @@ $transition-out : 1s;
} }
&[data-type=mermaid] svg{font-size : 1em;} &[data-type=mermaid] svg{font-size : 1em;}
} }
.wmd-code-sample-block{
&[data-processed=false]{display : none;}
&>nav>ul{
margin : 0em;
padding : 0em;
list-style-type : none;
text-align : left;
&>li{
display : inline-block;
padding : .2em .5em;
border : .1em solid $color-fore;
cursor : pointer;
box-shadow : 0em 0em .8em inset $color-fore;
transition-duration : $transition-out;
transition-property : box-shadow;
&[data-selected=true]{box-shadow : 0em 0em .2em inset $color-fore;}
&:hover{
box-shadow : 0em 0em 1.2em inset $color-fore;
transition-duration : $transition-in;
}
}
&>:first-child{border-radius : .3em 0em 0em .3em;}
&>:last-child{border-radius : 0em .3em .3em 0em;}
}
}
.wmd-quote{ .wmd-quote{
display : flex; display : flex;
margin : 1em 2em; margin : 1em 2em;
@ -277,8 +303,8 @@ $transition-out : 1s;
img{ img{
width : 100%; width : 100%;
height : auto; height : auto;
max-width : 30em; // max-width : 30em;
max-height : 30em; // max-height : 30em;
&+span{ &+span{
// display : none; // display : none;
background-position : center center; background-position : center center;

View File

@ -6,7 +6,7 @@ from re import Pattern as REPattern
from re import Match as REMatch from re import Match as REMatch
from re import MULTILINE as RE_MULTILINE from re import MULTILINE as RE_MULTILINE
from re import IGNORECASE as RE_IGNORE_CASE from re import IGNORECASE as RE_IGNORE_CASE
from typing import Callable, Optional from typing import Callable, Optional, Self
from os.path import exists as path_exists from os.path import exists as path_exists
from os.path import dirname as directory_name from os.path import dirname as directory_name
from base64 import b64encode as base64_encode from base64 import b64encode as base64_encode
@ -52,7 +52,7 @@ class WMarkDown:
re_characters_no_id:REPattern = RECompile(r'[^a-z0-9]+', RE_IGNORE_CASE) re_characters_no_id:REPattern = RECompile(r'[^a-z0-9]+', RE_IGNORE_CASE)
re_phone_number:REPattern = RECompile(r'^\+?[0-9 ]{5,22}$') re_phone_number:REPattern = RECompile(r'^\+?[0-9 ]{5,22}$')
re_email_address:REPattern = RECompile(r'^[a-z\.0-9_\-]+@[a-z\.0-9_\-]+\.[a-z0-9]+$') re_email_address:REPattern = RECompile(r'^[a-z\.0-9_\-]+@[a-z\.0-9_\-]+\.[a-z0-9]+$')
re_class_attribute:REPattern = RECompile(r'(?<![a-z0-9_\-])(class=")([^"]+)(")') re_class_attribute:REPattern = RECompile(r'(?<![a-z0-9_\-])(class=")([^"]+)(")', RE_IGNORE_CASE)
re_white_spaces:REPattern = RECompile(r'[ \t]+') re_white_spaces:REPattern = RECompile(r'[ \t]+')
re_line_marks:REPattern = RECompile(r'[\*#~\-_]+|\[[ \-x]\]|\([ \-x]\)', RE_IGNORE_CASE) re_line_marks:REPattern = RECompile(r'[\*#~\-_]+|\[[ \-x]\]|\([ \-x]\)', RE_IGNORE_CASE)
re_integer:REPattern = RECompile(r'^[0-9]+$') re_integer:REPattern = RECompile(r'^[0-9]+$')
@ -63,7 +63,7 @@ class WMarkDown:
re_domain:REPattern = RECompile(r'^[^\:]+\:\/{2}[^\/]+') re_domain:REPattern = RECompile(r'^[^\:]+\:\/{2}[^\/]+')
re_protocol:REPattern = RECompile(r'^([a-z0-9_\-]+)\:', RE_IGNORE_CASE) re_protocol:REPattern = RECompile(r'^([a-z0-9_\-]+)\:', RE_IGNORE_CASE)
def __init__(self) -> None: def __init__(self:Self) -> None:
self.modules:dict[str, tuple[int, REPattern]] = { self.modules:dict[str, tuple[int, REPattern]] = {
"special_characters" : (WMarkDown.SUBITEM, RECompile(r'\\([\(\{\[\*\\])')), "special_characters" : (WMarkDown.SUBITEM, RECompile(r'\\([\(\{\[\*\\])')),
@ -76,12 +76,9 @@ class WMarkDown:
"media" : (WMarkDown.SUBITEM | WMarkDown.LINKED, RECompile(r'\({2}\!(image|icon|video|audio|sound|picture)[ \t]+("(([^"]+|[\r\n]+))"|\'(([^\']+|[\r\n]+))\'|([^ \t\)]+))([ \t]*|[ \t]+("(([^\\\\"]+|\\\\.|[\r\n]+)*)"|\'(([^\\\\\']+|\\\\.|[\r\n]+)*)\'|([^\)]+)))\){2}', RE_IGNORE_CASE)), "media" : (WMarkDown.SUBITEM | WMarkDown.LINKED, RECompile(r'\({2}\!(image|icon|video|audio|sound|picture)[ \t]+("(([^"]+|[\r\n]+))"|\'(([^\']+|[\r\n]+))\'|([^ \t\)]+))([ \t]*|[ \t]+("(([^\\\\"]+|\\\\.|[\r\n]+)*)"|\'(([^\\\\\']+|\\\\.|[\r\n]+)*)\'|([^\)]+)))\){2}', RE_IGNORE_CASE)),
"code_doc" : (WMarkDown.RAW, RECompile(r'^\[{2}@(([^\]]+|\][^\]])+)\]{2}', RE_MULTILINE)), "code_doc" : (WMarkDown.RAW, RECompile(r'^\[{2}@(([^\]]+|\][^\]])+)\]{2}', RE_MULTILINE)),
"presentation_links" : (WMarkDown.RAW, RECompile(r'^\[{2}"{3}(([^"]+|[\r\n]+|"{1,2}[^"])*)"{3}\]{2}', RE_MULTILINE)), "presentation_links" : (WMarkDown.RAW, RECompile(r'^\[{2}"{3}(([^"]+|[\r\n]+|"{1,2}[^"])*)"{3}\]{2}', RE_MULTILINE)),
"code_sample_block" : (WMarkDown.RAW, RECompile(r'<code\-sample\-block([^>]*)>(((?!<\/code\-sample\-block>)(.|[\r\n]+))+)<\/code\-sample\-block>', RE_IGNORE_CASE)),
"paragraph" : (WMarkDown.RAW, RECompile(r'^(([^\r\n]+(\n|\r\n|\r)?)+)', RE_MULTILINE)), "paragraph" : (WMarkDown.RAW, RECompile(r'^(([^\r\n]+(\n|\r\n|\r)?)+)', RE_MULTILINE)),
# "bold_italic" : (WMarkDown.SUBITEM | WMarkDown.LINKED, RECompile(r'\*{3}(([^\*]+|\*{1,2}[^\*]|[\r\n]+|\\\*)*)\*{3}')),
# "bold_italic" : (WMarkDown.SUBITEM | WMarkDown.LINKED, RECompile(r'(?<!\\)\*{3}((?:\\\*|\*{1,2}[^\*]|[^*\r\n]|[\r\n])*)\*{3}')),
# "bold" : (WMarkDown.SUBITEM | WMarkDown.LINKED, RECompile(r'\*{2}(([^\*]+|\*[^\*]|[\r\n]+|\\\*)*)\*{2}')),
"bold" : (WMarkDown.SUBITEM | WMarkDown.LINKED, RECompile(r'(?<!\\)\*{2}((?:\\\*|\*[^\*]|[^*\r\n]|[\r\n]|(?!\*{2}[^\*])\*)*)\*{2}')), "bold" : (WMarkDown.SUBITEM | WMarkDown.LINKED, RECompile(r'(?<!\\)\*{2}((?:\\\*|\*[^\*]|[^*\r\n]|[\r\n]|(?!\*{2}[^\*])\*)*)\*{2}')),
# "italic" : (WMarkDown.SUBITEM | WMarkDown.LINKED, RECompile(r'(?<!\\)\*(([^\*]+|[\r\n]+|\\\*)*)\*')),
"italic" : (WMarkDown.SUBITEM | WMarkDown.LINKED, RECompile(r'(?<!\\)\*((?:\\\*|[^*\r\n]|[\r\n]|\*{2})*)\*')), "italic" : (WMarkDown.SUBITEM | WMarkDown.LINKED, RECompile(r'(?<!\\)\*((?:\\\*|[^*\r\n]|[\r\n]|\*{2})*)\*')),
"underline" : (WMarkDown.SUBITEM | WMarkDown.LINKED, RECompile(r'__(((?!__).)+)__')), "underline" : (WMarkDown.SUBITEM | WMarkDown.LINKED, RECompile(r'__(((?!__).)+)__')),
"strike" : (WMarkDown.SUBITEM | WMarkDown.LINKED, RECompile(r'~~(((?!~~).)+)~~')), "strike" : (WMarkDown.SUBITEM | WMarkDown.LINKED, RECompile(r'~~(((?!~~).)+)~~')),
@ -95,7 +92,7 @@ class WMarkDown:
} }
self.__ids_cache:tuple[str] = tuple() self.__ids_cache:tuple[str] = tuple()
def __id(self, string:str) -> str: def __id(self:Self, string:str) -> str:
id:str = WMarkDown.re_characters_no_id.sub(r'-', string).lower() id:str = WMarkDown.re_characters_no_id.sub(r'-', string).lower()
@ -120,7 +117,7 @@ class WMarkDown:
def reset_ids(self): def reset_ids(self):
self.__ids_cache = tuple() self.__ids_cache = tuple()
def module_title(self, matches:REMatch, language:Optional[int] = HTML, path:Optional[str] = None) -> str|None: def module_title(self:Self, matches:REMatch, language:Optional[int] = HTML, path:Optional[str] = None) -> str|None:
if language & WMarkDown.HTML: if language & WMarkDown.HTML:
level:str = str(len(matches.group(2) or matches.group(4))) level:str = str(len(matches.group(2) or matches.group(4)))
@ -135,37 +132,37 @@ class WMarkDown:
'</h' + level + '>') '</h' + level + '>')
return None return None
def module_paragraph(self, matches:REMatch, language:Optional[int] = HTML, path:Optional[str] = None) -> str|None: def module_paragraph(self:Self, matches:REMatch, language:Optional[int] = HTML, path:Optional[str] = None) -> str|None:
if language & WMarkDown.HTML: if language & WMarkDown.HTML:
return '<p>' + self.analyse(matches.group(0).strip(), language, WMarkDown.SUBITEM, path) + '</p>' return '<p>' + self.analyse(matches.group(0).strip(), language, WMarkDown.SUBITEM, path) + '</p>'
return None return None
def module_bold_italic(self, matches:REMatch, language:Optional[int] = HTML, path:Optional[str] = None) -> str|None: def module_bold_italic(self:Self, matches:REMatch, language:Optional[int] = HTML, path:Optional[str] = None) -> str|None:
if language & WMarkDown.HTML: if language & WMarkDown.HTML:
return '<b><i>' + self.analyse(matches.group(1), language, WMarkDown.SUBITEM, path) + '</i></b>' return '<b><i>' + self.analyse(matches.group(1), language, WMarkDown.SUBITEM, path) + '</i></b>'
return None return None
def module_bold(self, matches:REMatch, language:Optional[int] = HTML, path:Optional[str] = None) -> str|None: def module_bold(self:Self, matches:REMatch, language:Optional[int] = HTML, path:Optional[str] = None) -> str|None:
if language & WMarkDown.HTML: if language & WMarkDown.HTML:
return '<b>' + self.analyse(matches.group(1), language, WMarkDown.SUBITEM, path) + '</b>' return '<b>' + self.analyse(matches.group(1), language, WMarkDown.SUBITEM, path) + '</b>'
return None return None
def module_italic(self, matches:REMatch, language:Optional[int] = HTML, path:Optional[str] = None) -> str|None: def module_italic(self:Self, matches:REMatch, language:Optional[int] = HTML, path:Optional[str] = None) -> str|None:
if language & WMarkDown.HTML: if language & WMarkDown.HTML:
return '<i>' + self.analyse(matches.group(1), language, WMarkDown.SUBITEM, path) + '</i>' return '<i>' + self.analyse(matches.group(1), language, WMarkDown.SUBITEM, path) + '</i>'
return None return None
def module_strike(self, matches:REMatch, language:Optional[int] = HTML, path:Optional[str] = None) -> str|None: def module_strike(self:Self, matches:REMatch, language:Optional[int] = HTML, path:Optional[str] = None) -> str|None:
if language & WMarkDown.HTML: if language & WMarkDown.HTML:
return '<del>' + self.analyse(matches.group(1), language, WMarkDown.SUBITEM, path) + '</del>' return '<del>' + self.analyse(matches.group(1), language, WMarkDown.SUBITEM, path) + '</del>'
return None return None
def module_underline(self, matches:REMatch, language:Optional[int] = HTML, path:Optional[str] = None) -> str|None: def module_underline(self:Self, matches:REMatch, language:Optional[int] = HTML, path:Optional[str] = None) -> str|None:
if language & WMarkDown.HTML: if language & WMarkDown.HTML:
return '<u>' + self.analyse(matches.group(1), language, WMarkDown.SUBITEM, path) + '</u>' return '<u>' + self.analyse(matches.group(1), language, WMarkDown.SUBITEM, path) + '</u>'
return None return None
def module_code_item(self, matches:REMatch, language:Optional[int] = HTML, path:Optional[str] = None) -> str|None: def module_code_item(self:Self, matches:REMatch, language:Optional[int] = HTML, path:Optional[str] = None) -> str|None:
if language & WMarkDown.HTML: if language & WMarkDown.HTML:
return '<code>' + self.analyse(matches.group(1), language, WMarkDown.SUBITEM, path) + '</code>' return '<code>' + self.analyse(matches.group(1), language, WMarkDown.SUBITEM, path) + '</code>'
return None return None
@ -184,21 +181,21 @@ class WMarkDown:
'</label>') '</label>')
@classmethod @classmethod
def module_checkbox(self, matches:REMatch, language:Optional[int] = HTML, path:Optional[str] = None) -> str|None: def module_checkbox(cls:type[Self], matches:REMatch, language:Optional[int] = HTML, path:Optional[str] = None) -> str|None:
if language & WMarkDown.HTML: if language & cls.HTML:
return WMarkDown.__check_html_module("checkbox", matches) return cls.__check_html_module("checkbox", matches)
return None return None
@classmethod @classmethod
def module_radio(self, matches:REMatch, language:Optional[int] = HTML, path:Optional[str] = None) -> str|None: def module_radio(cls:type[Self], matches:REMatch, language:Optional[int] = HTML, path:Optional[str] = None) -> str|None:
if language & WMarkDown.HTML: if language & cls.HTML:
return WMarkDown.__check_html_module("radio", matches) return cls.__check_html_module("radio", matches)
return None return None
@classmethod @classmethod
def module_tick(self, matches:REMatch, language:Optional[int] = HTML, path:Optional[str] = None) -> str|None: def module_tick(cls:type[Self], matches:REMatch, language:Optional[int] = HTML, path:Optional[str] = None) -> str|None:
if language & WMarkDown.HTML: if language & cls.HTML:
return WMarkDown.__check_html_module("tick", matches) return cls.__check_html_module("tick", matches)
return None return None
@staticmethod @staticmethod
@ -214,14 +211,14 @@ class WMarkDown:
return ' data-deployed="' + deployed + '"' + (' data-list-unprocessed="true"' if deployable else '') return ' data-deployed="' + deployed + '"' + (' data-list-unprocessed="true"' if deployable else '')
@classmethod @classmethod
def __list_start(self, unordered:bool, _type:str) -> str: def __list_start(cls:type[Self], unordered:bool, _type:str) -> str:
if not unordered: if not unordered:
_type = _type[:-1] _type = _type[:-1]
if WMarkDown.re_integer.search(_type): if cls.re_integer.search(_type):
return ' start="' + _type + '"' return ' start="' + _type + '"'
return '' return ''
def module_list(self, matches:REMatch, language:Optional[int] = HTML, path:Optional[str] = None) -> str|None: def module_list(self:Self, matches:REMatch, language:Optional[int] = HTML, path:Optional[str] = None) -> str|None:
if language & WMarkDown.HTML: if language & WMarkDown.HTML:
html:str = '' html:str = ''
@ -280,7 +277,7 @@ class WMarkDown:
return None return None
@classmethod @classmethod
def set_class(self, html:str, _class:str|list|tuple) -> str: def set_class(cls:type[Self], html:str, _class:str|list|tuple) -> str:
if not isinstance(_class, (list, tuple)): if not isinstance(_class, (list, tuple)):
_class = (_class,) _class = (_class,)
@ -297,15 +294,15 @@ class WMarkDown:
class_key:str class_key:str
attribute, classes_str, closer = matches.groups() attribute, classes_str, closer = matches.groups()
classes = WMarkDown.re_white_spaces.split(classes_str) classes = cls.re_white_spaces.split(classes_str)
return attribute + classes_str + (' ' if classes_str else '') + " ".join([ return attribute + classes_str + (' ' if classes_str else '') + " ".join([
class_key for class_key in _class if class_key not in classes class_key for class_key in _class if class_key not in classes
]) + closer ]) + closer
return WMarkDown.re_class_attribute.sub(callback, html) return cls.re_class_attribute.sub(callback, html)
def module_table(self, matches:REMatch, language:Optional[int] = HTML, path:Optional[str] = None) -> str|None: def module_table(self:Self, matches:REMatch, language:Optional[int] = HTML, path:Optional[str] = None) -> str|None:
if language & WMarkDown.HTML: if language & WMarkDown.HTML:
html:dict[str, str] = { html:dict[str, str] = {
@ -374,12 +371,12 @@ class WMarkDown:
return None return None
@classmethod @classmethod
def module_exclude(self, matches:REMatch, language:Optional[int] = HTML, path:Optional[str] = None) -> str|None: def module_exclude(cls:type[Self], matches:REMatch, language:Optional[int] = HTML, path:Optional[str] = None) -> str|None:
if language & WMarkDown.HTML: if language & cls.HTML:
return '<span class="wmd-excluded">' + (matches.group(1) or "") + '</span>' return '<span class="wmd-excluded">' + (matches.group(1) or "") + '</span>'
return None return None
def module_link(self, matches:REMatch, language:Optional[int] = HTML, path:Optional[str] = None) -> str|None: def module_link(self:Self, matches:REMatch, language:Optional[int] = HTML, path:Optional[str] = None) -> str|None:
if language & WMarkDown.HTML: if language & WMarkDown.HTML:
raw_url:str = (matches.group(4) or matches.group(11) or matches.group(14) or "").strip() raw_url:str = (matches.group(4) or matches.group(11) or matches.group(14) or "").strip()
@ -397,7 +394,7 @@ class WMarkDown:
) + '">' + self.analyse(text.strip(), language, WMarkDown.SUBITEM | self.LINKED, path) + '</a>' ) + '">' + self.analyse(text.strip(), language, WMarkDown.SUBITEM | self.LINKED, path) + '</a>'
return None return None
def module_quote(self, matches:REMatch, language:Optional[int] = HTML, path:Optional[str] = None) -> str|None: def module_quote(self:Self, matches:REMatch, language:Optional[int] = HTML, path:Optional[str] = None) -> str|None:
if language & WMarkDown.HTML: if language & WMarkDown.HTML:
_type:str|None = matches.group(2) _type:str|None = matches.group(2)
@ -419,8 +416,8 @@ class WMarkDown:
return None return None
@classmethod @classmethod
def code_block_data(self, key:str, value:str|int, language:Optional[int] = HTML, path:Optional[str] = None) -> str|None: def code_block_data(cls:type[Self], key:str, value:str|int, language:Optional[int] = HTML, path:Optional[str] = None) -> str|None:
if language & WMarkDown.HTML: if language & cls.HTML:
return ('<li data-i18n="' + key + '" data-i18n-without="true" title="' + key + '">' + return ('<li data-i18n="' + key + '" data-i18n-without="true" title="' + key + '">' +
'<span data-icon="' + key + '"></span>' + '<span data-icon="' + key + '"></span>' +
'<span data-i18n="' + key + '">' + key + '</span>' + '<span data-i18n="' + key + '">' + key + '</span>' +
@ -429,13 +426,13 @@ class WMarkDown:
return None return None
@classmethod @classmethod
def filter_html_special_characters(self, string:str) -> str: def filter_html_special_characters(cls:type[Self], string:str) -> str:
l:int = len(WMarkDown.html_special_characters) l:int = len(cls.html_special_characters)
_:int _:int
index:list[int] = [-1 for _ in range(l)] index:list[int] = [-1 for _ in range(l)]
response:str = '' response:str = ''
characters:tuple[str] = tuple(WMarkDown.html_special_characters.keys()) characters:tuple[str] = tuple(cls.html_special_characters.keys())
while True: while True:
@ -463,7 +460,7 @@ class WMarkDown:
length:int = index[i] length:int = index[i]
response += string[:length] + '&' + WMarkDown.html_special_characters[characters[i]] + ';' response += string[:length] + '&' + cls.html_special_characters[characters[i]] + ';'
string = string[length + 1:] string = string[length + 1:]
for j in range(l): for j in range(l):
@ -472,13 +469,12 @@ class WMarkDown:
return response return response
@classmethod @staticmethod
def module_code_block(self, matches:REMatch, language:Optional[int] = HTML, path:Optional[str] = None) -> str|None: def get_code_block_data(matches:REMatch) -> str:
if language & WMarkDown.HTML:
_type:str _type:str
content:str
i:int i:int
content:str
for i in range(6): for i in range(6):
@ -491,27 +487,50 @@ class WMarkDown:
content = (content or "") content = (content or "")
break break
return (_type, content)
@classmethod
def module_code_block(cls:type[Self], matches:REMatch, language:Optional[int] = HTML, path:Optional[str] = None) -> str|None:
if language & cls.HTML:
_type:str
content:str
# i:int
(_type, content) = cls.get_code_block_data(matches)
# for i in range(6):
# j:int = 2 + i * 4
# _type = matches.group(j)
# content = matches.group(j + 1)
# if _type or content:
# _type = (_type or "unamed").strip().lower()
# content = (content or "")
# break
if _type: if _type:
lines:list[str] = WMarkDown.re_new_line.split(content)[2:] lines:list[str] = cls.re_new_line.split(content)[2:]
_:str _:str
return ('<div class="wmd-code-block" data-type="' + _type + '" data-processed="false">' return ('<div class="wmd-code-block" data-type="' + _type + '" data-processed="false">'
'<ul class="data">' + '<ul class="data">' +
'<li><span data-icon="' + _type + '"></span></li>' + '<li><span data-icon="' + _type + '"></span></li>' +
WMarkDown.code_block_data("type", _type, language) + cls.code_block_data("type", _type, language) +
WMarkDown.code_block_data("characters", len(content), language) + cls.code_block_data("characters", len(content), language) +
WMarkDown.code_block_data("lines", len(lines), language) + cls.code_block_data("lines", len(lines), language) +
'</ul>' + '</ul>' +
'<div class="code">' + '<div class="code">' +
'<ol class="lines">' + ''.join(['<li></li>' for _ in lines]) + '</ol>' + '<ol class="lines">' + ''.join(['<li></li>' for _ in lines]) + '</ol>' +
'<pre class="content">' + WMarkDown.filter_html_special_characters(content) + '</pre>' + '<pre class="content">' + cls.filter_html_special_characters(content) + '</pre>' +
'</div>' + '</div>' +
'</div>') '</div>')
return 'UNKNOWN_BLOCK' return 'UNKNOWN_BLOCK'
return None return None
def module_special_characters(self, matches:REMatch, language:Optional[int] = HTML, path:Optional[str] = None) -> str|None: def module_special_characters(self:Self, matches:REMatch, language:Optional[int] = HTML, path:Optional[str] = None) -> str|None:
if language & WMarkDown.HTML: if language & WMarkDown.HTML:
return matches.group(1) return matches.group(1)
return None return None
@ -526,7 +545,7 @@ class WMarkDown:
pass pass
return None return None
def module_include(self, matches:REMatch, language:Optional[int] = HTML, path:Optional[str] = None) -> str|None: def module_include(self:Self, matches:REMatch, language:Optional[int] = HTML, path:Optional[str] = None) -> str|None:
if language & WMarkDown.HTML: if language & WMarkDown.HTML:
relative_path:str = matches.group(1) relative_path:str = matches.group(1)
@ -560,7 +579,7 @@ class WMarkDown:
('<span class="text">' + title + '</span>' if title else '') + ('<span class="text">' + title + '</span>' if title else '') +
'</span>') '</span>')
def module_media(self, matches:REMatch, language:Optional[int] = HTML, path:Optional[str] = None) -> str|None: def module_media(self:Self, matches:REMatch, language:Optional[int] = HTML, path:Optional[str] = None) -> str|None:
if language & WMarkDown.HTML: if language & WMarkDown.HTML:
_type:str = matches.group(1).lower() _type:str = matches.group(1).lower()
@ -601,7 +620,7 @@ class WMarkDown:
return None return None
@classmethod @classmethod
def mark_replace(self, string:str, matches:REMatch, fragments:list[str]) -> str: def mark_replace(cls:type[Self], string:str, matches:REMatch, fragments:list[str]) -> str:
if matches: if matches:
@ -611,17 +630,17 @@ class WMarkDown:
start, end = matches.span() start, end = matches.span()
string = string[:start] + WMarkDown.item_mark[0] + str(len(fragments)) + WMarkDown.item_mark[1] + string[end:] string = string[:start] + cls.item_mark[0] + str(len(fragments)) + cls.item_mark[1] + string[end:]
fragments += [matches.group(0)] fragments += [matches.group(0)]
return string return string
@classmethod @classmethod
def restore_marks(self, string:str, fragments:list[str]) -> str: def restore_marks(cls:type[Self], string:str, fragments:list[str]) -> str:
while True: while True:
matches:REMatch = WMarkDown.item_mark[2].search(string) matches:REMatch = cls.item_mark[2].search(string)
if not matches: if not matches:
break break
@ -637,8 +656,8 @@ class WMarkDown:
return string return string
@classmethod @classmethod
def __doc_typed_format(self, typed:str) -> str: def __doc_typed_format(cls:type[Self], typed:str) -> str:
return WMarkDown.filter_html_special_characters(typed.replace(' ', "").replace(',', ", ")) return cls.filter_html_special_characters(typed.replace(' ', "").replace(',', ", "))
@staticmethod @staticmethod
def is_reference(scope:str) -> str|None: def is_reference(scope:str) -> str|None:
@ -647,11 +666,9 @@ class WMarkDown:
"pointer" if '*' in scope else "pointer" if '*' in scope else
None) None)
def module_code_doc(self, matches:REMatch, language:Optional[int] = HTML, path:Optional[str] = None) -> str|None: def module_code_doc(self:Self, matches:REMatch, language:Optional[int] = HTML, path:Optional[str] = None) -> str|None:
if language & WMarkDown.HTML: if language & WMarkDown.HTML:
# print(matches.groups())
data:str = matches.group(1).strip() data:str = matches.group(1).strip()
base:REMatch = WMarkDown.re_code_doc.search(data) base:REMatch = WMarkDown.re_code_doc.search(data)
return_type:str = WMarkDown.__doc_typed_format(base.group(2) or "void") return_type:str = WMarkDown.__doc_typed_format(base.group(2) or "void")
@ -753,7 +770,7 @@ class WMarkDown:
'</fieldset>') '</fieldset>')
return None return None
def module_color_sample(self, matches:REMatch, language:Optional[int] = HTML, path:Optional[str] = None) -> str|None: def module_color_sample(self:Self, matches:REMatch, language:Optional[int] = HTML, path:Optional[str] = None) -> str|None:
if language & WMarkDown.HTML: if language & WMarkDown.HTML:
color:str = matches.group(2) or matches.group(3) color:str = matches.group(2) or matches.group(3)
@ -764,7 +781,7 @@ class WMarkDown:
'</span>') '</span>')
return None return None
def module_presentation_links(self, matches:REMatch, language:Optional[int] = HTML, path:Optional[str] = None) -> str|None: def module_presentation_links(self:Self, matches:REMatch, language:Optional[int] = HTML, path:Optional[str] = None) -> str|None:
if language & WMarkDown.HTML: if language & WMarkDown.HTML:
items:list = [] items:list = []
@ -823,11 +840,47 @@ class WMarkDown:
'</div>') '</div>')
return None return None
def module_code_sample_block(self:Self, matches:REMatch, language:Optional[int] = HTML, path:Optional[str] = None) -> str|None:
if language & WMarkDown.HTML:
attributes:str = matches.group(1) or ''
submatches:REMatch = WMarkDown.re_class_attribute.search(attributes)
classes:list[str] = WMarkDown.re_white_spaces.split((submatches.group(1) if submatches else '').strip())
content:str = matches.group(2)
languages:str = ''
html = ''
i:int = 0
while True:
submatches = self.modules["code_block"][1].search(content)
if not submatches:
break
_type:str = WMarkDown.get_code_block_data(submatches)[0]
span:tuple[int, int] = submatches.span()
languages += '<li data-language="' + _type + '" data-i18n="' + _type + '" title="' + _type + '" data-selected="' + ("false" if i else "true") + '">' + _type + '</li>'
html += self.module_code_block(submatches, language, path)
print(span + (len(content),))
content = content[span[1]:]
"wmd-code-sample-block" in classes or classes.insert(0, "wmd-code-sample-block")
return ('<div class="' + ' '.join(classes) + '"' + (matches.group(1) or '') + ' data-processed="false">' +
'<nav class="languages"><ul>' + languages + '</ul></nav>' +
'<div class="content">' + html + '</div>' +
'</div>')
return None
@classmethod @classmethod
def remove_default_tabulations(self, data:str) -> str: def remove_default_tabulations(cls:type[Self], data:str) -> str:
line:str line:str
lines:list[str] = WMarkDown.re_new_lines.split(data) lines:list[str] = cls.re_new_lines.split(data)
spaces:int = len(data) spaces:int = len(data)
def callback(matches:REMatch): def callback(matches:REMatch):
@ -837,20 +890,20 @@ class WMarkDown:
if not line: if not line:
continue continue
white_spaces:int = len(WMarkDown.re_started_white_spaces.search(line).group(0)) white_spaces:int = len(cls.re_started_white_spaces.search(line).group(0))
if white_spaces < spaces: if white_spaces < spaces:
spaces = white_spaces spaces = white_spaces
return WMarkDown.re_lines.sub(callback, data) return cls.re_lines.sub(callback, data)
def __build(self, data:str, language:int, path:str|None) -> str: def __build(self:Self, data:str, language:int, path:str|None) -> str:
return ('<div class="wmd wmarkdown" data-dictionary-processed="false" data-menu-processed="false">' + return ('<div class="wmd wmarkdown" data-dictionary-processed="false" data-menu-processed="false">' +
self.analyse(WMarkDown.remove_default_tabulations(data), language, WMarkDown.RAW, path) + self.analyse(WMarkDown.remove_default_tabulations(data), language, WMarkDown.RAW, path) +
'<div class="wmd-process-and-loaded"></div>' + '<div class="wmd-process-and-loaded"></div>' +
'</div>') '</div>')
def process(self, data:str, language:Optional[int] = HTML, path:Optional[str] = None) -> str: def process(self:Self, data:str, language:Optional[int] = HTML, path:Optional[str] = None) -> str:
results:str = "" results:str = ""
variables:dict[str, str] = {} variables:dict[str, str] = {}
@ -871,7 +924,7 @@ class WMarkDown:
if not option: if not option:
break break
variables[option.group(1).strip()] = option.group(2).strip() variables[str(option.group(1)).strip()] = str(option.group(2)).strip()
options_data = options_data[option.span()[1]:] options_data = options_data[option.span()[1]:]
data = data[:_from] + data[_to:] data = data[:_from] + data[_to:]
@ -911,7 +964,7 @@ class WMarkDown:
return results, variables return results, variables
def analyse(self, data:str, language:Optional[int] = HTML, mode:Optional[int] = RAW, path:Optional[str] = None) -> str: def analyse(self:Self, data:str, language:Optional[int] = HTML, mode:Optional[int] = RAW, path:Optional[str] = None) -> str:
response:str = "" response:str = ""
item_mode:int item_mode:int
@ -967,5 +1020,5 @@ class WMarkDown:
return response return response
def to_html(self, data:str, path:Optional[str] = None) -> str: def to_html(self:Self, data:str, path:Optional[str] = None) -> str:
return self.analyse(data, WMarkDown.HTML, WMarkDown.RAW, path) return self.analyse(data, WMarkDown.HTML, WMarkDown.RAW, path)

View File

@ -1 +1 @@
0.0.3.6 0.0.3.7