From d073c4e1a539816ed092a8ab6954a7c382e4b6b2 Mon Sep 17 00:00:00 2001
From: Luigi_Nitro_V_15
Date: Wed, 29 Apr 2026 21:10:53 +0200
Subject: [PATCH] -
---
Resistere_in_silenzio.md | 105 +
content/css/style.css | 412 ++
content/php/Parsedown.php | 1995 +++++++++
content/php/markDown.php | 52 +
img/woman-hair.png | Bin 0 -> 34113 bytes
img/women-smovement.webp | Bin 0 -> 3097464 bytes
index.php | 100 +
my-app/.gitignore | 41 +
my-app/AGENTS.md | 5 +
my-app/CLAUDE.md | 1 +
my-app/README.md | 36 +
my-app/app/favicon.ico | Bin 0 -> 25931 bytes
my-app/app/globals.css | 26 +
my-app/app/layout.tsx | 33 +
my-app/app/page.tsx | 14 +
my-app/app/plasma/page.tsx | 37 +
my-app/eslint.config.mjs | 18 +
my-app/next.config.ts | 7 +
my-app/package-lock.json | 6592 ++++++++++++++++++++++++++++++
my-app/package.json | 27 +
my-app/postcss.config.mjs | 7 +
my-app/public/file.svg | 1 +
my-app/public/globe.svg | 1 +
my-app/public/next.svg | 1 +
my-app/public/vercel.svg | 1 +
my-app/public/window.svg | 1 +
my-app/src/components/Plasma.css | 6 +
my-app/src/components/Plasma.js | 240 ++
my-app/tsconfig.json | 34 +
29 files changed, 9793 insertions(+)
create mode 100644 Resistere_in_silenzio.md
create mode 100644 content/css/style.css
create mode 100644 content/php/Parsedown.php
create mode 100644 content/php/markDown.php
create mode 100644 img/woman-hair.png
create mode 100644 img/women-smovement.webp
create mode 100644 index.php
create mode 100644 my-app/.gitignore
create mode 100644 my-app/AGENTS.md
create mode 100644 my-app/CLAUDE.md
create mode 100644 my-app/README.md
create mode 100644 my-app/app/favicon.ico
create mode 100644 my-app/app/globals.css
create mode 100644 my-app/app/layout.tsx
create mode 100644 my-app/app/page.tsx
create mode 100644 my-app/app/plasma/page.tsx
create mode 100644 my-app/eslint.config.mjs
create mode 100644 my-app/next.config.ts
create mode 100644 my-app/package-lock.json
create mode 100644 my-app/package.json
create mode 100644 my-app/postcss.config.mjs
create mode 100644 my-app/public/file.svg
create mode 100644 my-app/public/globe.svg
create mode 100644 my-app/public/next.svg
create mode 100644 my-app/public/vercel.svg
create mode 100644 my-app/public/window.svg
create mode 100644 my-app/src/components/Plasma.css
create mode 100644 my-app/src/components/Plasma.js
create mode 100644 my-app/tsconfig.json
diff --git a/Resistere_in_silenzio.md b/Resistere_in_silenzio.md
new file mode 100644
index 0000000..72665f5
--- /dev/null
+++ b/Resistere_in_silenzio.md
@@ -0,0 +1,105 @@
+
+
+## Le protagoniste invisibili della storia:
+
+
+Nel corso della storia, e in particolare durante le fasi di forte **crisi** che hanno attanagliato l'umanità, ad emergere sono quasi sempre figure maschili, oscurando **i sacrifici e la dedizione che contraddistinguono molte donne** in tali momenti di emergenza.
+
+Tra gli esempi concreti dello sforzo femminile, vi è il loro impiego massiccio in fabbriche e negli ospedali da campo durante i due conflitti mondiali. In queste fasi, le donne non costituirono solo una figura di supporto logistico ma anche una **garanzia per la continuità della vita civile**; quanto descritto dimostra una rivoluzione silenziosa e impercettibile la quale riuscì gradualmente a **sfaldare le barriere del patriarcato dell’epoca**.
+
+Parallelamente agli avvenimenti concreti, anche la letteratura fa emergere forme di resistenza invisibili ma altrettanto profonde, come nel romanzo **La Ciociara** di Alberto Moravia.
+
+I paragrafi che seguono propongono un’analisi storica e letteraria di fatti e testimonianze dell’epoca, per far emergere quelli che sono stati i mutamenti nei confronti delle figure femminili, dal silenzio a ruolo cruciale per la storia, donne che, nel mezzo di una **lotta quotidiana per la sopravvivenza**, hanno imparato a “***salvarsi da sole***"
+
+## La Resistenza italiana: un protagonismo femminile dimenticato
+
+### Tra le due guerre:
+
+Con lo scoppio della Prima guerra mondiale, l’assenza di molti uomini chiamati a combattere al fronte provocò effetti economici e sociali devastanti in tutta Europa. Le uniche figure rimaste a poter impiegare i posti vacanti di molti contadini e operai furono le donne; continuando a svolgere allo stesso tempo le mansioni domestiche, questo intenso coinvolgimento vede ruoli sempre più di rilievo attribuiti alla donna (dalla gestione delle proprietà agricole alla Croce Rossa per il supporto dei feriti nelle vicinanze dei fronti di guerra).
+
+L’avvento del regime fascista cercò di porre freno all’emancipazione femminile avvenuta negli anni precedenti, attuando riforme costituite esplicitamente sulla disuguaglianza fra i sessi. Con la legge del 20 gennaio 1927, il governo fascista **dimezza gli stipendi delle donne**, basandosi sull’idea che la donna dovesse essere dipendente economicamente dall'uomo e concentrarsi sulla famiglia.
+
+Inoltre, attraverso **l’ONMI** (*Opera Nazionale Maternità e Infanzia*) si incentiva la natalità con premi e onorificenze alle “**madri prolifiche**” italiane, in modo tale da distogliere l’attenzione dalle **aspirazioni professionali e sociali delle donne**
+
+
+
+### La Resistenza:
+
+
+Tra il 1943 e il 1945, nel pieno della Seconda guerra mondiale, furono decine di **migliaia** le donne italiane, di ogni età e ceto sociale che si esposero ai rischi della guerra, facendo fronte alla piaga del nazifascismo; non solo 'angeli del focolare', ma **parte cruciale per la liberazione dell’Italia**, le quali, nel tentativo di portare al successo tale obiettivo comune, divennero vittime di deportazioni, uccisioni e violenze.
+
+A Fronte di ciò il mondo (almeno all’epoca) rispose a tali sacrifici **ignorandole** e **sminuendole**, tant’è che in troppi casi le donne si rifiutarono di sfilare al fianco dei compagni nelle parate della vittoria, e solo pochissime partigiane ricevettero medaglie e riconoscimenti ufficiali.
+
+Solo verso la fine degli anni ’60 emerse la verità sul contributo delle donne durante la Seconda guerra mondiale e della Resistenza italiana: incarnarono **profili materni oltre i confini familiari** (assistendo soldati, prigionieri, ebrei e bambini) dimostrando anche un **forte protagonismo** alla pari di quello maschile.
+
+Ancor prima della nascita della Resistenza, le donne furono protagoniste di scioperi tra il 1943 e 1944, contro lo sfruttamento nei loro confronti negli ambiti lavorativi e la loro riduzione ai compiti esclusivamente domestici della figura femminile, imposta imposte dal regime fascista in Italia.
+
+Nel novembre 1943 nacquero a Milano i **GDD** (*Gruppi di Difesa della Donna*), i quali consistevano in aiuto economico alle famiglie dei deportati e dei combattenti, organizzazione di sabotaggi, attività di propaganda, raccolta di fondi, quindi non una specializzazione fissa per la donna, ma un’occupazione a 360 gradi comprendendo anche il combattere con le armi in pugno.
+
+Come sosteneva **Ada Gobetti** (nome di battaglia *'Ulisse'*), tra i partigiani di **Giustizia e Libertà**, durante la Resistenza “*la donna era presente ovunque*”; infatti, secondo i dati forniti dall’**ANPI** (*Associazione nazionale partigiani d’Italia*), il numero delle donne che, dopo la guerra, ha presentato domanda ufficiale per il riconoscimento del titolo partigiano si aggirerebbe intorno alle 35.000, un valore considerato sottostimato a confronto di ipotesi moderne che in realtà portano alla luce la partecipazione di **almeno un milione di donne**, andando a comprendere:
+
+- Donne dei **GDD**;
+- Chi ha compiuto atti di disobbedienza radicale (come nascondere i ricercati).
+
+L’accettazione di tali figure, dalla parte maschile, non fu facile. Agli albori di tali resistenze, alle donne venivano affidati compiti considerati adatti alla loro “natura”, quindi semplicemente cucinare o prendersi cura dei feriti; compiti più importanti furono legati al ruolo di **staffette** (tra quelli maggiormente riconosciuti), un compito che rompeva con l'immagine tradizionale della donna chiusa in casa. Il termine stesso richiama il passaggio di mano in mano dei messaggi, un lavoro fondamentale che solo a Firenze, per esempio, coinvolse circa 400 donne.
+
+Per queste donne, la guerra portò una libertà di movimento prima impensabile: potevano viaggiare per giorni a piedi, in bicicletta o sui treni, spesso giustificando le assenze con i genitori o i vicini dicendo che andavano in campagna a cercare cibo. Era però un compito pericolosissimo, che richiedeva nervi saldi e il rispetto di **regole rigide per non farsi scoprire**, come:
+
+- **Agire nell'ombra**: non rivelare a nessuno la propria missione e fingere una vita normale in famiglia.
+- **Massima allerta**: assicurarsi di non essere seguite e avere sempre una scusa pronta in caso di fermo.
+- **Discrezione assoluta**: nascondere il materiale con cura, camminare con disinvoltura e non svelare mai il contenuto di ciò che si consegnava.
+
+Le staffette sapevano bene che un errore poteva costare la prigione, la violenza o la vita, rendendo la loro partecipazione una forma di resistenza coraggiosa e consapevole.
+
+Una volta terminata la guerra, l’esperienza della Resistenza e della Liberazione, era divenuta oramai un punto di non ritorno per il paese e anche per i diritti delle donne.
+
+
+
+### Dalla Resistenza alle urne:
+
+
+Questo impegno capillare e rischioso segnò un punto di non ritorno nella storia dell'emancipazione italiana. L'esperienza della Resistenza fu infatti il preludio necessario al riconoscimento del **suffragio universale**: prima ancora del Referendum del 2 giugno, **le donne italiane esercitarono il loro diritto di voto nelle elezioni amministrative della primavera del 1946**, un momento storico che vide un'affluenza massiccia e l'elezione delle prime donne nei consigli comunali.
+
+Quel primo passo portò poi alla storica data del **2 giugno 1946**, quando furono chiamate al voto nazionale per scegliere tra **Monarchia e Repubblica**. Non si trattò di una concessione dall'alto, ma del riconoscimento di un diritto conquistato sul campo: dalle staffette alle 21 'Madri Costituenti', il contributo femminile divenne la base imprescindibile su cui fondare la nuova democrazia repubblicana.
+
+Il 25 giugno 1946 si riunì per la prima volta l’Assemblea costituente e ben **21 donne** entrano a far parte di quel gruppo di eletti che potevano sedere ufficialmente nei banchi della politica. Le cosiddette **Madri Costituenti** erano rappresentanti dei diversi partiti presenti nel paese: nove dalla DC, nove dal PCI, due dal PSIUP ed una dal Fronte Liberale Democratico dell’Uomo qualunque.
+
+L’impatto di queste 21 donne nello scenario politico nazionale fece sì che tutto ciò che fino ad ora era delegato agli uomini, potesse essere portato avanti in prima persona da chi fino a poco prima era senza voce, come la formulazione dell'**Articolo 3** della Costituzione, dove l'aggiunta delle parole **“s*enza distinzione di sesso*”** non fu un semplice dettaglio formale, ma una vittoria politica monumentale. Quelle 21 donne rappresentavano tutte quelle staffette e partigiane che al momento del voto non avevano compiuto la maggiore età ma anche tutte le donne che ora si sentivano sempre più paritarie agli uomini.
+
+
+
+## Sopravvivere come atto di coraggio: *La Ciociara* di Alberto Moravia
+
+
+Se le 21 Madri Costituenti rappresentano il trionfo del protagonismo femminile nelle istituzioni, la letteratura di quegli stessi anni ci offre il ritratto di chi quella rivoluzione la visse non tra i banchi del Parlamento, ma faccia a faccia con la continua lotta per la sopravvivenza. È qui che si inserisce la figura di **Cesira**, protagonista del romanzo ***La Ciociara*** di **Alberto Moravia**.
+
+Mentre la Storia ufficiale celebrava le grandi vittorie e i nuovi diritti, Cesira incarnava quella "***resistenza in silenzio***" tipica di chi non ha ideologie, ma solo la necessità biologica di sopravvivere. La sua storia non parla di politica, ma di una lotta quotidiana per la dignità che è altrettanto fondamentale per comprendere il ruolo della donna in quel periodo.
+
+
+
+### La trama:
+
+
+***La Ciociara* di Alberto Moravia**, pubblicato nel **1957**, racconta la storia di **Cesira**, una contadina ciociara trasferitasi a Roma dopo aver sposato un pizzicagnolo romano, e sua figlia **Rosetta**, un'adolescente timida. La loro vita cambia a causa degli eventi storici.
+
+Quando i nazisti occupano Roma, sono costrette a fuggire nelle montagne della Ciociaria. Lì, cominciano a rendersi conto della malvagità e del male che non avevano mai visto prima. Il ritorno nella loro terra natale è un po' un ritorno alle origini e all'innocenza, nonostante le difficoltà economiche. L'arrivo degli Alleati sembra portare speranza. Ma è proprio allora che accade la cosa più terribile.
+
+In una chiesa abbandonata, davanti a un'immagine della Madonna girata, un gruppo di soldati marocchini, chiamati **goumier**, che sono arrivati con gli inglesi e gli americani per liberare l'Italia, violentano Cesira e Rosetta. **Il male viene da chi avrebbe dovuto aiutarle**. Cesira guarda sua figlia, rassegnata a ciò che è accaduto. Il romanzo finisce con **la distruzione dell'innocenza e della speranza** che sembrava possibile.
+
+La storia parla della guerra e delle persone che ne sono state colpite, e di come certe esperienze possano cambiare profondamente la vita delle persone.
+
+### lo specchio di un’Italia violata:
+
+Il Romanzo evidenzia apertamente quali fossero le crudeltà della guerra nei confronti delle protagoniste, frutto non solo della freddezza nazifascista, ma anche dei crimini degli alleati; con la scena dello stupro da parte dei goumier fa riflettere il dramma storico delle cosiddette 'marocchinate': migliaia di donne italiane che, durante la liberazione, subirono stupri di massa da parte delle truppe coloniali francesi. Moravia usa questo trauma per mostrare come **la guerra non faccia distinzioni** tra ***'liberatori'*** e ***'oppressori'*** **quando si tratta di violare il corpo femminile**.
+
+Tali momenti di crisi mettono in luce gli effetti devastanti su chi li vive: attraverso l’evoluzione morale di Rosetta, la quale ne esce moralmente degradata e privata della sua innocenza originaria, non solo Moravia fa appello a ciò che subirono le donne lottando per la loro sopravvivenza, ma fa anche da simbolo di un’Italia, la quale sarà per sempre segnata da tali crimini.
+
+## Dalle macerie alla dignità: l'eredità di una lotta
+
+In definitiva, l'indagine condotta tra le pieghe della storia e i ritratti della letteratura rivela come il silenzio delle donne non sia mai stato sinonimo di assenza, ma una forma di resistenza attiva e resiliente. Se da un lato la storia ufficiale ci consegna l’immagine gloriosa delle Madri Costituenti e il traguardo fondamentale del suffragio universale, dall'altro la letteratura di Moravia ci ricorda il prezzo umano e il trauma di chi ha vissuto la guerra sulla propria pelle.
+
+Cesira e Rosetta rappresentano l'altra faccia della medaglia: **quella di un’Italia violata che**, nonostante la fine del conflitto, deve fare i conti con ferite invisibili. Tuttavia, è proprio da quel "*salvarsi da sole*" e da quella partecipazione coraggiosa nelle fabbriche, nelle montagne e nelle urne, che è nata l’Italia moderna.
+
+Oggi, riconoscere il ruolo delle donne tra il 1943 e il 1946 significa non solo rendere giustizia a un protagonismo a lungo dimenticato, ma anche onorare quel mutamento sociale che ha trasformato la sopravvivenza individuale in una conquista collettiva di dignità e libertà. La "*rivoluzione silenziosa*" di allora rimane ancora oggi la base fondamentale su cui poggiano i nostri valori democratici, ricordandoci che nessun diritto è mai stato una concessione, ma il frutto di una **lotta consapevole per esistere e resistere**.
+
+
diff --git a/content/css/style.css b/content/css/style.css
new file mode 100644
index 0000000..ead7cec
--- /dev/null
+++ b/content/css/style.css
@@ -0,0 +1,412 @@
+* {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+:root {
+ --bg-body: #050505;
+ --bg-header: rgba(10, 10, 10, 0.85);
+ --bg-footer: #0a0a0a;
+ --accent: rgb(249, 39, 39);
+ --text-primary: #ffffff;
+ --text-secondary: #a0a0a0;
+ --border: #222222;
+ --transition: all 0.4s ease;
+}
+
+/* --- LOGICA PER FOOTER IN BASSO --- */
+html,
+body {
+ height: 100%;
+}
+
+body {
+ display: flex;
+ flex-direction: column;
+ /* Impila gli elementi verticalmente */
+ background-color: var(--bg-body);
+ font-family: 'Inter', sans-serif;
+ color: var(--text-primary);
+ line-height: 1.6;
+}
+
+/* Il main occupa tutto lo spazio vuoto spingendo il footer */
+main {
+ flex: 1 0 auto;
+ background: rgba(15, 15, 15, 0.568);
+}
+
+.footer {
+ flex-shrink: 0;
+ /* Impedisce al footer di restringersi */
+}
+
+/* ---------------------------------- */
+
+a {
+ text-decoration: none;
+ color: inherit;
+ transition: var(--transition);
+}
+
+.container {
+ max-width: 1200px;
+ margin: 0 auto;
+ padding: 0 25px;
+}
+
+/* --- HEADER --- */
+.header {
+ position: fixed;
+ top: 0;
+ width: 100%;
+ z-index: 1000;
+ background: var(--bg-header);
+ backdrop-filter: blur(15px);
+ border-bottom: 1px solid var(--border);
+ padding: 18px 0;
+}
+
+.header-content {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+}
+
+.logo {
+ font-size: 1.4rem;
+ font-weight: 800;
+ letter-spacing: -0.5px;
+ text-transform: uppercase;
+}
+
+.logo span {
+ color: var(--accent);
+}
+
+.nav-menu {
+ display: flex;
+ list-style: none;
+ gap: 35px;
+}
+
+.nav-link {
+ font-size: 0.85rem;
+ font-weight: 500;
+ color: var(--text-secondary);
+ letter-spacing: 1px;
+ text-transform: uppercase;
+}
+
+.nav-link:hover {
+ color: var(--accent);
+}
+
+.cta-btn {
+ background: var(--accent);
+ padding: 10px 22px;
+ border-radius: 2px;
+ font-weight: 700;
+ font-size: 0.8rem;
+ text-transform: uppercase;
+ letter-spacing: 1px;
+}
+
+.cta-btn:hover {
+ filter: brightness(1.2);
+ box-shadow: 0 0 20px rgba(188, 0, 0, 0.4);
+}
+
+/* --- CONTENUTO --- */
+.hero {
+ min-height: 60vh;
+ /* Altezza minima per il contenuto */
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ align-items: center;
+ text-align: center;
+}
+
+.hero h1 {
+ font-size: clamp(3rem, 10vw, 5rem);
+ font-weight: 900;
+ line-height: 1;
+ margin-bottom: 20px;
+}
+
+/* --- FOOTER --- */
+.footer {
+ background: var(--bg-footer);
+ border-top: 1px solid var(--border);
+ padding: 80px 0 30px;
+}
+
+.footer-grid {
+ display: grid;
+ grid-template-columns: 2fr 1fr 1fr;
+ gap: 50px;
+ margin-bottom: 60px;
+}
+
+.footer-brand h2 {
+ color: var(--accent);
+ margin-bottom: 20px;
+ font-size: 1.5rem;
+}
+
+.footer-brand p {
+ color: var(--text-secondary);
+ max-width: 400px;
+ font-size: 0.95rem;
+}
+
+.footer-title {
+ font-size: 0.75rem;
+ text-transform: uppercase;
+ letter-spacing: 2px;
+ color: #fff;
+ margin-bottom: 25px;
+ display: block;
+}
+
+.footer-list {
+ list-style: none;
+}
+
+.footer-list li {
+ margin-bottom: 12px;
+}
+
+.footer-list a {
+ color: var(--text-secondary);
+ font-size: 0.9rem;
+}
+
+.footer-list a:hover {
+ color: var(--accent);
+ padding-left: 8px;
+}
+
+.footer-bottom {
+ border-top: 1px solid var(--border);
+ padding-top: 30px;
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ color: #444;
+ font-size: 0.8rem;
+}
+
+@media (max-width: 768px) {
+
+ .nav-menu,
+ .cta-btn {
+ display: none;
+ }
+
+ .footer-grid {
+ grid-template-columns: 1fr;
+ gap: 40px;
+ }
+
+ .footer-bottom {
+ flex-direction: column;
+ gap: 15px;
+ text-align: center;
+ }
+}
+
+.iframe-background {
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100vw;
+ height: 100vh;
+ border: none;
+ z-index: -2;
+ pointer-events: none;
+
+ transform: scale(1.5);
+ transform-origin: center;
+}
+
+.title-conteiner {
+ position: relative;
+ width: 100%;
+ max-height: 500px;
+ overflow: hidden;
+}
+
+.title-conteiner img {
+ width: 100%;
+ height: 500px;
+ display: block;
+ object-fit: cover;
+}
+
+.title-on-img {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+
+ background-color: rgba(0, 0, 0, 0.664);
+ color: white;
+
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ align-items: center;
+
+ text-align: center;
+ padding: 20px;
+ box-sizing: border-box;
+}
+
+.title-on-img h1, .title-on-img h2, .title-on-img p {
+ max-width: 850px;
+}
+
+.title-on-img h1 {
+ font-family: 'Playfair Display', serif;
+ font-size: 3rem;
+ color: #c02626;
+ margin-bottom: 5px;
+ text-transform: uppercase;
+ letter-spacing: 2px;
+}
+
+.title-on-img h2 {
+ font-family: 'Playfair Display', serif;
+ font-style: italic;
+ font-size: 1.5rem;
+ color: #e9ecef;
+ font-weight: 400;
+ margin-bottom: 20px;
+}
+
+.title-on-img p {
+ font-family: 'Montserrat', sans-serif;
+ font-size: 1.1rem;
+ color: #f8f9fa;
+ line-height: 1.6;
+ max-width: 700px;
+}
+
+.footer-logo {
+ width: 70px;
+}
+
+
+@media (max-width: 768px) {
+ .title-on-img h1 { font-size: 2rem; }
+ .title-on-img h2 { font-size: 1.1rem; }
+ .title-on-img p { font-size: 0.95rem; }
+}
+
+
+@media (max-width: 768px) {
+ .title-conteiner img {
+ height: 400px;
+ }
+
+ .title-on-img {
+ padding: 15px;
+ }
+
+ .title-on-img h1 {
+ font-size: 1.8rem;
+ margin-bottom: 10px;
+ }
+
+ .title-on-img h2 {
+ font-size: 1.2rem;
+ line-height: 1.3;
+ }
+
+ .title-on-img p {
+ font-size: 0.9rem;
+ line-height: 1.4;
+ display: -webkit-box;
+ -webkit-line-clamp: 4;
+ -webkit-box-orient: vertical;
+ overflow: hidden;
+ }
+}
+
+
+.markdown-body {
+ font-family: 'Inter', sans-serif;
+ line-height: 1.8;
+ color: #e0e0e0;
+ max-width: 850px;
+ margin: 0 auto;
+ padding: 40px 20px;
+ background-color: transparent;
+}
+
+
+.markdown-body h2 {
+ font-size: 2rem;
+ font-weight: 700;
+ color: rgb(249, 39, 39);
+ border-bottom: 1px solid #333;
+ padding-bottom: 0.5rem;
+ margin-top: 2.5rem;
+ margin-bottom: 1rem;
+ letter-spacing: -0.01em;
+}
+
+
+.markdown-body h3 {
+ font-size: 1.5rem;
+ font-weight: 600;
+ color: #f8f9fa;
+ margin-top: 2rem;
+ margin-bottom: 0.8rem;
+}
+
+
+.markdown-body p {
+ font-size: 1.15rem;
+ margin-bottom: 1.5rem;
+ color: #bdbdbd;
+ font-weight: 300;
+}
+
+.markdown-body strong {
+ color: #ffffff;
+ font-weight: 600;
+ letter-spacing: 0.02em;
+}
+
+@media (max-width: 768px) {
+ .markdown-body {
+ padding: 20px 15px;
+ }
+
+ .markdown-body h2 {
+ font-size: 1.5rem;
+ margin-top: 1.8rem;
+ line-height: 1.2;
+ }
+
+ .markdown-body h3 {
+ font-size: 1.25rem;
+ margin-top: 1.5rem;
+ }
+
+ .markdown-body p {
+ font-size: 1rem;
+ line-height: 1.6;
+ text-align: left;
+ color: #d1d1d1;
+ }
+
+ .markdown-body strong {
+ font-weight: 700;
+ }
+}
diff --git a/content/php/Parsedown.php b/content/php/Parsedown.php
new file mode 100644
index 0000000..2f01d5c
--- /dev/null
+++ b/content/php/Parsedown.php
@@ -0,0 +1,1995 @@
+textElements($text);
+
+ # convert to markup
+ $markup = $this->elements($Elements);
+
+ # trim line breaks
+ $markup = trim($markup, "\n");
+
+ return $markup;
+ }
+
+ protected function textElements($text)
+ {
+ # make sure no definitions are set
+ $this->DefinitionData = array();
+
+ # standardize line breaks
+ $text = str_replace(array("\r\n", "\r"), "\n", $text);
+
+ # remove surrounding line breaks
+ $text = trim($text, "\n");
+
+ # split text into lines
+ $lines = explode("\n", $text);
+
+ # iterate through lines to identify blocks
+ return $this->linesElements($lines);
+ }
+
+ #
+ # Setters
+ #
+
+ function setBreaksEnabled($breaksEnabled)
+ {
+ $this->breaksEnabled = $breaksEnabled;
+
+ return $this;
+ }
+
+ protected $breaksEnabled;
+
+ function setMarkupEscaped($markupEscaped)
+ {
+ $this->markupEscaped = $markupEscaped;
+
+ return $this;
+ }
+
+ protected $markupEscaped;
+
+ function setUrlsLinked($urlsLinked)
+ {
+ $this->urlsLinked = $urlsLinked;
+
+ return $this;
+ }
+
+ protected $urlsLinked = true;
+
+ function setSafeMode($safeMode)
+ {
+ $this->safeMode = (bool) $safeMode;
+
+ return $this;
+ }
+
+ protected $safeMode;
+
+ function setStrictMode($strictMode)
+ {
+ $this->strictMode = (bool) $strictMode;
+
+ return $this;
+ }
+
+ protected $strictMode;
+
+ protected $safeLinksWhitelist = array(
+ 'http://',
+ 'https://',
+ 'ftp://',
+ 'ftps://',
+ 'mailto:',
+ 'tel:',
+ 'data:image/png;base64,',
+ 'data:image/gif;base64,',
+ 'data:image/jpeg;base64,',
+ 'irc:',
+ 'ircs:',
+ 'git:',
+ 'ssh:',
+ 'news:',
+ 'steam:',
+ );
+
+ #
+ # Lines
+ #
+
+ protected $BlockTypes = array(
+ '#' => array('Header'),
+ '*' => array('Rule', 'List'),
+ '+' => array('List'),
+ '-' => array('SetextHeader', 'Table', 'Rule', 'List'),
+ '0' => array('List'),
+ '1' => array('List'),
+ '2' => array('List'),
+ '3' => array('List'),
+ '4' => array('List'),
+ '5' => array('List'),
+ '6' => array('List'),
+ '7' => array('List'),
+ '8' => array('List'),
+ '9' => array('List'),
+ ':' => array('Table'),
+ '<' => array('Comment', 'Markup'),
+ '=' => array('SetextHeader'),
+ '>' => array('Quote'),
+ '[' => array('Reference'),
+ '_' => array('Rule'),
+ '`' => array('FencedCode'),
+ '|' => array('Table'),
+ '~' => array('FencedCode'),
+ );
+
+ # ~
+
+ protected $unmarkedBlockTypes = array(
+ 'Code',
+ );
+
+ #
+ # Blocks
+ #
+
+ protected function lines(array $lines)
+ {
+ return $this->elements($this->linesElements($lines));
+ }
+
+ protected function linesElements(array $lines)
+ {
+ $Elements = array();
+ $CurrentBlock = null;
+
+ foreach ($lines as $line)
+ {
+ if (chop($line) === '')
+ {
+ if (isset($CurrentBlock))
+ {
+ $CurrentBlock['interrupted'] = (isset($CurrentBlock['interrupted'])
+ ? $CurrentBlock['interrupted'] + 1 : 1
+ );
+ }
+
+ continue;
+ }
+
+ while (($beforeTab = strstr($line, "\t", true)) !== false)
+ {
+ $shortage = 4 - mb_strlen($beforeTab, 'utf-8') % 4;
+
+ $line = $beforeTab
+ . str_repeat(' ', $shortage)
+ . substr($line, strlen($beforeTab) + 1)
+ ;
+ }
+
+ $indent = strspn($line, ' ');
+
+ $text = $indent > 0 ? substr($line, $indent) : $line;
+
+ # ~
+
+ $Line = array('body' => $line, 'indent' => $indent, 'text' => $text);
+
+ # ~
+
+ if (isset($CurrentBlock['continuable']))
+ {
+ $methodName = 'block' . $CurrentBlock['type'] . 'Continue';
+ $Block = $this->$methodName($Line, $CurrentBlock);
+
+ if (isset($Block))
+ {
+ $CurrentBlock = $Block;
+
+ continue;
+ }
+ else
+ {
+ if ($this->isBlockCompletable($CurrentBlock['type']))
+ {
+ $methodName = 'block' . $CurrentBlock['type'] . 'Complete';
+ $CurrentBlock = $this->$methodName($CurrentBlock);
+ }
+ }
+ }
+
+ # ~
+
+ $marker = $text[0];
+
+ # ~
+
+ $blockTypes = $this->unmarkedBlockTypes;
+
+ if (isset($this->BlockTypes[$marker]))
+ {
+ foreach ($this->BlockTypes[$marker] as $blockType)
+ {
+ $blockTypes []= $blockType;
+ }
+ }
+
+ #
+ # ~
+
+ foreach ($blockTypes as $blockType)
+ {
+ $Block = $this->{"block$blockType"}($Line, $CurrentBlock);
+
+ if (isset($Block))
+ {
+ $Block['type'] = $blockType;
+
+ if ( ! isset($Block['identified']))
+ {
+ if (isset($CurrentBlock))
+ {
+ $Elements[] = $this->extractElement($CurrentBlock);
+ }
+
+ $Block['identified'] = true;
+ }
+
+ if ($this->isBlockContinuable($blockType))
+ {
+ $Block['continuable'] = true;
+ }
+
+ $CurrentBlock = $Block;
+
+ continue 2;
+ }
+ }
+
+ # ~
+
+ if (isset($CurrentBlock) and $CurrentBlock['type'] === 'Paragraph')
+ {
+ $Block = $this->paragraphContinue($Line, $CurrentBlock);
+ }
+
+ if (isset($Block))
+ {
+ $CurrentBlock = $Block;
+ }
+ else
+ {
+ if (isset($CurrentBlock))
+ {
+ $Elements[] = $this->extractElement($CurrentBlock);
+ }
+
+ $CurrentBlock = $this->paragraph($Line);
+
+ $CurrentBlock['identified'] = true;
+ }
+ }
+
+ # ~
+
+ if (isset($CurrentBlock['continuable']) and $this->isBlockCompletable($CurrentBlock['type']))
+ {
+ $methodName = 'block' . $CurrentBlock['type'] . 'Complete';
+ $CurrentBlock = $this->$methodName($CurrentBlock);
+ }
+
+ # ~
+
+ if (isset($CurrentBlock))
+ {
+ $Elements[] = $this->extractElement($CurrentBlock);
+ }
+
+ # ~
+
+ return $Elements;
+ }
+
+ protected function extractElement(array $Component)
+ {
+ if ( ! isset($Component['element']))
+ {
+ if (isset($Component['markup']))
+ {
+ $Component['element'] = array('rawHtml' => $Component['markup']);
+ }
+ elseif (isset($Component['hidden']))
+ {
+ $Component['element'] = array();
+ }
+ }
+
+ return $Component['element'];
+ }
+
+ protected function isBlockContinuable($Type)
+ {
+ return method_exists($this, 'block' . $Type . 'Continue');
+ }
+
+ protected function isBlockCompletable($Type)
+ {
+ return method_exists($this, 'block' . $Type . 'Complete');
+ }
+
+ #
+ # Code
+
+ protected function blockCode($Line, $Block = null)
+ {
+ if (isset($Block) and $Block['type'] === 'Paragraph' and ! isset($Block['interrupted']))
+ {
+ return;
+ }
+
+ if ($Line['indent'] >= 4)
+ {
+ $text = substr($Line['body'], 4);
+
+ $Block = array(
+ 'element' => array(
+ 'name' => 'pre',
+ 'element' => array(
+ 'name' => 'code',
+ 'text' => $text,
+ ),
+ ),
+ );
+
+ return $Block;
+ }
+ }
+
+ protected function blockCodeContinue($Line, $Block)
+ {
+ if ($Line['indent'] >= 4)
+ {
+ if (isset($Block['interrupted']))
+ {
+ $Block['element']['element']['text'] .= str_repeat("\n", $Block['interrupted']);
+
+ unset($Block['interrupted']);
+ }
+
+ $Block['element']['element']['text'] .= "\n";
+
+ $text = substr($Line['body'], 4);
+
+ $Block['element']['element']['text'] .= $text;
+
+ return $Block;
+ }
+ }
+
+ protected function blockCodeComplete($Block)
+ {
+ return $Block;
+ }
+
+ #
+ # Comment
+
+ protected function blockComment($Line)
+ {
+ if ($this->markupEscaped or $this->safeMode)
+ {
+ return;
+ }
+
+ if (strpos($Line['text'], '') !== false)
+ {
+ $Block['closed'] = true;
+ }
+
+ return $Block;
+ }
+ }
+
+ protected function blockCommentContinue($Line, array $Block)
+ {
+ if (isset($Block['closed']))
+ {
+ return;
+ }
+
+ $Block['element']['rawHtml'] .= "\n" . $Line['body'];
+
+ if (strpos($Line['text'], '-->') !== false)
+ {
+ $Block['closed'] = true;
+ }
+
+ return $Block;
+ }
+
+ #
+ # Fenced Code
+
+ protected function blockFencedCode($Line)
+ {
+ $marker = $Line['text'][0];
+
+ $openerLength = strspn($Line['text'], $marker);
+
+ if ($openerLength < 3)
+ {
+ return;
+ }
+
+ $infostring = trim(substr($Line['text'], $openerLength), "\t ");
+
+ if (strpos($infostring, '`') !== false)
+ {
+ return;
+ }
+
+ $Element = array(
+ 'name' => 'code',
+ 'text' => '',
+ );
+
+ if ($infostring !== '')
+ {
+ /**
+ * https://www.w3.org/TR/2011/WD-html5-20110525/elements.html#classes
+ * Every HTML element may have a class attribute specified.
+ * The attribute, if specified, must have a value that is a set
+ * of space-separated tokens representing the various classes
+ * that the element belongs to.
+ * [...]
+ * The space characters, for the purposes of this specification,
+ * are U+0020 SPACE, U+0009 CHARACTER TABULATION (tab),
+ * U+000A LINE FEED (LF), U+000C FORM FEED (FF), and
+ * U+000D CARRIAGE RETURN (CR).
+ */
+ $language = substr($infostring, 0, strcspn($infostring, " \t\n\f\r"));
+
+ $Element['attributes'] = array('class' => "language-$language");
+ }
+
+ $Block = array(
+ 'char' => $marker,
+ 'openerLength' => $openerLength,
+ 'element' => array(
+ 'name' => 'pre',
+ 'element' => $Element,
+ ),
+ );
+
+ return $Block;
+ }
+
+ protected function blockFencedCodeContinue($Line, $Block)
+ {
+ if (isset($Block['complete']))
+ {
+ return;
+ }
+
+ if (isset($Block['interrupted']))
+ {
+ $Block['element']['element']['text'] .= str_repeat("\n", $Block['interrupted']);
+
+ unset($Block['interrupted']);
+ }
+
+ if (($len = strspn($Line['text'], $Block['char'])) >= $Block['openerLength']
+ and chop(substr($Line['text'], $len), ' ') === ''
+ ) {
+ $Block['element']['element']['text'] = substr($Block['element']['element']['text'], 1);
+
+ $Block['complete'] = true;
+
+ return $Block;
+ }
+
+ $Block['element']['element']['text'] .= "\n" . $Line['body'];
+
+ return $Block;
+ }
+
+ protected function blockFencedCodeComplete($Block)
+ {
+ return $Block;
+ }
+
+ #
+ # Header
+
+ protected function blockHeader($Line)
+ {
+ $level = strspn($Line['text'], '#');
+
+ if ($level > 6)
+ {
+ return;
+ }
+
+ $text = trim($Line['text'], '#');
+
+ if ($this->strictMode and isset($text[0]) and $text[0] !== ' ')
+ {
+ return;
+ }
+
+ $text = trim($text, ' ');
+
+ $Block = array(
+ 'element' => array(
+ 'name' => 'h' . $level,
+ 'handler' => array(
+ 'function' => 'lineElements',
+ 'argument' => $text,
+ 'destination' => 'elements',
+ )
+ ),
+ );
+
+ return $Block;
+ }
+
+ #
+ # List
+
+ protected function blockList($Line, ?array $CurrentBlock = null)
+ {
+ list($name, $pattern) = $Line['text'][0] <= '-' ? array('ul', '[*+-]') : array('ol', '[0-9]{1,9}+[.\)]');
+
+ if (preg_match('/^('.$pattern.'([ ]++|$))(.*+)/', $Line['text'], $matches))
+ {
+ $contentIndent = strlen($matches[2]);
+
+ if ($contentIndent >= 5)
+ {
+ $contentIndent -= 1;
+ $matches[1] = substr($matches[1], 0, -$contentIndent);
+ $matches[3] = str_repeat(' ', $contentIndent) . $matches[3];
+ }
+ elseif ($contentIndent === 0)
+ {
+ $matches[1] .= ' ';
+ }
+
+ $markerWithoutWhitespace = strstr($matches[1], ' ', true);
+
+ $Block = array(
+ 'indent' => $Line['indent'],
+ 'pattern' => $pattern,
+ 'data' => array(
+ 'type' => $name,
+ 'marker' => $matches[1],
+ 'markerType' => ($name === 'ul' ? $markerWithoutWhitespace : substr($markerWithoutWhitespace, -1)),
+ ),
+ 'element' => array(
+ 'name' => $name,
+ 'elements' => array(),
+ ),
+ );
+ $Block['data']['markerTypeRegex'] = preg_quote($Block['data']['markerType'], '/');
+
+ if ($name === 'ol')
+ {
+ $listStart = ltrim(strstr($matches[1], $Block['data']['markerType'], true), '0') ?: '0';
+
+ if ($listStart !== '1')
+ {
+ if (
+ isset($CurrentBlock)
+ and $CurrentBlock['type'] === 'Paragraph'
+ and ! isset($CurrentBlock['interrupted'])
+ ) {
+ return;
+ }
+
+ $Block['element']['attributes'] = array('start' => $listStart);
+ }
+ }
+
+ $Block['li'] = array(
+ 'name' => 'li',
+ 'handler' => array(
+ 'function' => 'li',
+ 'argument' => !empty($matches[3]) ? array($matches[3]) : array(),
+ 'destination' => 'elements'
+ )
+ );
+
+ $Block['element']['elements'] []= & $Block['li'];
+
+ return $Block;
+ }
+ }
+
+ protected function blockListContinue($Line, array $Block)
+ {
+ if (isset($Block['interrupted']) and empty($Block['li']['handler']['argument']))
+ {
+ return null;
+ }
+
+ $requiredIndent = ($Block['indent'] + strlen($Block['data']['marker']));
+
+ if ($Line['indent'] < $requiredIndent
+ and (
+ (
+ $Block['data']['type'] === 'ol'
+ and preg_match('/^[0-9]++'.$Block['data']['markerTypeRegex'].'(?:[ ]++(.*)|$)/', $Line['text'], $matches)
+ ) or (
+ $Block['data']['type'] === 'ul'
+ and preg_match('/^'.$Block['data']['markerTypeRegex'].'(?:[ ]++(.*)|$)/', $Line['text'], $matches)
+ )
+ )
+ ) {
+ if (isset($Block['interrupted']))
+ {
+ $Block['li']['handler']['argument'] []= '';
+
+ $Block['loose'] = true;
+
+ unset($Block['interrupted']);
+ }
+
+ unset($Block['li']);
+
+ $text = isset($matches[1]) ? $matches[1] : '';
+
+ $Block['indent'] = $Line['indent'];
+
+ $Block['li'] = array(
+ 'name' => 'li',
+ 'handler' => array(
+ 'function' => 'li',
+ 'argument' => array($text),
+ 'destination' => 'elements'
+ )
+ );
+
+ $Block['element']['elements'] []= & $Block['li'];
+
+ return $Block;
+ }
+ elseif ($Line['indent'] < $requiredIndent and $this->blockList($Line))
+ {
+ return null;
+ }
+
+ if ($Line['text'][0] === '[' and $this->blockReference($Line))
+ {
+ return $Block;
+ }
+
+ if ($Line['indent'] >= $requiredIndent)
+ {
+ if (isset($Block['interrupted']))
+ {
+ $Block['li']['handler']['argument'] []= '';
+
+ $Block['loose'] = true;
+
+ unset($Block['interrupted']);
+ }
+
+ $text = substr($Line['body'], $requiredIndent);
+
+ $Block['li']['handler']['argument'] []= $text;
+
+ return $Block;
+ }
+
+ if ( ! isset($Block['interrupted']))
+ {
+ $text = preg_replace('/^[ ]{0,'.$requiredIndent.'}+/', '', $Line['body']);
+
+ $Block['li']['handler']['argument'] []= $text;
+
+ return $Block;
+ }
+ }
+
+ protected function blockListComplete(array $Block)
+ {
+ if (isset($Block['loose']))
+ {
+ foreach ($Block['element']['elements'] as &$li)
+ {
+ if (end($li['handler']['argument']) !== '')
+ {
+ $li['handler']['argument'] []= '';
+ }
+ }
+ }
+
+ return $Block;
+ }
+
+ #
+ # Quote
+
+ protected function blockQuote($Line)
+ {
+ if (preg_match('/^>[ ]?+(.*+)/', $Line['text'], $matches))
+ {
+ $Block = array(
+ 'element' => array(
+ 'name' => 'blockquote',
+ 'handler' => array(
+ 'function' => 'linesElements',
+ 'argument' => (array) $matches[1],
+ 'destination' => 'elements',
+ )
+ ),
+ );
+
+ return $Block;
+ }
+ }
+
+ protected function blockQuoteContinue($Line, array $Block)
+ {
+ if (isset($Block['interrupted']))
+ {
+ return;
+ }
+
+ if ($Line['text'][0] === '>' and preg_match('/^>[ ]?+(.*+)/', $Line['text'], $matches))
+ {
+ $Block['element']['handler']['argument'] []= $matches[1];
+
+ return $Block;
+ }
+
+ if ( ! isset($Block['interrupted']))
+ {
+ $Block['element']['handler']['argument'] []= $Line['text'];
+
+ return $Block;
+ }
+ }
+
+ #
+ # Rule
+
+ protected function blockRule($Line)
+ {
+ $marker = $Line['text'][0];
+
+ if (substr_count($Line['text'], $marker) >= 3 and chop($Line['text'], " $marker") === '')
+ {
+ $Block = array(
+ 'element' => array(
+ 'name' => 'hr',
+ ),
+ );
+
+ return $Block;
+ }
+ }
+
+ #
+ # Setext
+
+ protected function blockSetextHeader($Line, ?array $Block = null)
+ {
+ if ( ! isset($Block) or $Block['type'] !== 'Paragraph' or isset($Block['interrupted']))
+ {
+ return;
+ }
+
+ if ($Line['indent'] < 4 and chop(chop($Line['text'], ' '), $Line['text'][0]) === '')
+ {
+ $Block['element']['name'] = $Line['text'][0] === '=' ? 'h1' : 'h2';
+
+ return $Block;
+ }
+ }
+
+ #
+ # Markup
+
+ protected function blockMarkup($Line)
+ {
+ if ($this->markupEscaped or $this->safeMode)
+ {
+ return;
+ }
+
+ if (preg_match('/^<[\/]?+(\w*)(?:[ ]*+'.$this->regexHtmlAttribute.')*+[ ]*+(\/)?>/', $Line['text'], $matches))
+ {
+ $element = strtolower($matches[1]);
+
+ if (in_array($element, $this->textLevelElements))
+ {
+ return;
+ }
+
+ $Block = array(
+ 'name' => $matches[1],
+ 'element' => array(
+ 'rawHtml' => $Line['text'],
+ 'autobreak' => true,
+ ),
+ );
+
+ return $Block;
+ }
+ }
+
+ protected function blockMarkupContinue($Line, array $Block)
+ {
+ if (isset($Block['closed']) or isset($Block['interrupted']))
+ {
+ return;
+ }
+
+ $Block['element']['rawHtml'] .= "\n" . $Line['body'];
+
+ return $Block;
+ }
+
+ #
+ # Reference
+
+ protected function blockReference($Line)
+ {
+ if (strpos($Line['text'], ']') !== false
+ and preg_match('/^\[(.+?)\]:[ ]*+(\S+?)>?(?:[ ]+["\'(](.+)["\')])?[ ]*+$/', $Line['text'], $matches)
+ ) {
+ $id = strtolower($matches[1]);
+
+ $Data = array(
+ 'url' => $matches[2],
+ 'title' => isset($matches[3]) ? $matches[3] : null,
+ );
+
+ $this->DefinitionData['Reference'][$id] = $Data;
+
+ $Block = array(
+ 'element' => array(),
+ );
+
+ return $Block;
+ }
+ }
+
+ #
+ # Table
+
+ protected function blockTable($Line, ?array $Block = null)
+ {
+ if ( ! isset($Block) or $Block['type'] !== 'Paragraph' or isset($Block['interrupted']))
+ {
+ return;
+ }
+
+ if (
+ strpos($Block['element']['handler']['argument'], '|') === false
+ and strpos($Line['text'], '|') === false
+ and strpos($Line['text'], ':') === false
+ or strpos($Block['element']['handler']['argument'], "\n") !== false
+ ) {
+ return;
+ }
+
+ if (chop($Line['text'], ' -:|') !== '')
+ {
+ return;
+ }
+
+ $alignments = array();
+
+ $divider = $Line['text'];
+
+ $divider = trim($divider);
+ $divider = trim($divider, '|');
+
+ $dividerCells = explode('|', $divider);
+
+ foreach ($dividerCells as $dividerCell)
+ {
+ $dividerCell = trim($dividerCell);
+
+ if ($dividerCell === '')
+ {
+ return;
+ }
+
+ $alignment = null;
+
+ if ($dividerCell[0] === ':')
+ {
+ $alignment = 'left';
+ }
+
+ if (substr($dividerCell, - 1) === ':')
+ {
+ $alignment = $alignment === 'left' ? 'center' : 'right';
+ }
+
+ $alignments []= $alignment;
+ }
+
+ # ~
+
+ $HeaderElements = array();
+
+ $header = $Block['element']['handler']['argument'];
+
+ $header = trim($header);
+ $header = trim($header, '|');
+
+ $headerCells = explode('|', $header);
+
+ if (count($headerCells) !== count($alignments))
+ {
+ return;
+ }
+
+ foreach ($headerCells as $index => $headerCell)
+ {
+ $headerCell = trim($headerCell);
+
+ $HeaderElement = array(
+ 'name' => 'th',
+ 'handler' => array(
+ 'function' => 'lineElements',
+ 'argument' => $headerCell,
+ 'destination' => 'elements',
+ )
+ );
+
+ if (isset($alignments[$index]))
+ {
+ $alignment = $alignments[$index];
+
+ $HeaderElement['attributes'] = array(
+ 'style' => "text-align: $alignment;",
+ );
+ }
+
+ $HeaderElements []= $HeaderElement;
+ }
+
+ # ~
+
+ $Block = array(
+ 'alignments' => $alignments,
+ 'identified' => true,
+ 'element' => array(
+ 'name' => 'table',
+ 'elements' => array(),
+ ),
+ );
+
+ $Block['element']['elements'] []= array(
+ 'name' => 'thead',
+ );
+
+ $Block['element']['elements'] []= array(
+ 'name' => 'tbody',
+ 'elements' => array(),
+ );
+
+ $Block['element']['elements'][0]['elements'] []= array(
+ 'name' => 'tr',
+ 'elements' => $HeaderElements,
+ );
+
+ return $Block;
+ }
+
+ protected function blockTableContinue($Line, array $Block)
+ {
+ if (isset($Block['interrupted']))
+ {
+ return;
+ }
+
+ if (count($Block['alignments']) === 1 or $Line['text'][0] === '|' or strpos($Line['text'], '|'))
+ {
+ $Elements = array();
+
+ $row = $Line['text'];
+
+ $row = trim($row);
+ $row = trim($row, '|');
+
+ preg_match_all('/(?:(\\\\[|])|[^|`]|`[^`]++`|`)++/', $row, $matches);
+
+ $cells = array_slice($matches[0], 0, count($Block['alignments']));
+
+ foreach ($cells as $index => $cell)
+ {
+ $cell = trim($cell);
+
+ $Element = array(
+ 'name' => 'td',
+ 'handler' => array(
+ 'function' => 'lineElements',
+ 'argument' => $cell,
+ 'destination' => 'elements',
+ )
+ );
+
+ if (isset($Block['alignments'][$index]))
+ {
+ $Element['attributes'] = array(
+ 'style' => 'text-align: ' . $Block['alignments'][$index] . ';',
+ );
+ }
+
+ $Elements []= $Element;
+ }
+
+ $Element = array(
+ 'name' => 'tr',
+ 'elements' => $Elements,
+ );
+
+ $Block['element']['elements'][1]['elements'] []= $Element;
+
+ return $Block;
+ }
+ }
+
+ #
+ # ~
+ #
+
+ protected function paragraph($Line)
+ {
+ return array(
+ 'type' => 'Paragraph',
+ 'element' => array(
+ 'name' => 'p',
+ 'handler' => array(
+ 'function' => 'lineElements',
+ 'argument' => $Line['text'],
+ 'destination' => 'elements',
+ ),
+ ),
+ );
+ }
+
+ protected function paragraphContinue($Line, array $Block)
+ {
+ if (isset($Block['interrupted']))
+ {
+ return;
+ }
+
+ $Block['element']['handler']['argument'] .= "\n".$Line['text'];
+
+ return $Block;
+ }
+
+ #
+ # Inline Elements
+ #
+
+ protected $InlineTypes = array(
+ '!' => array('Image'),
+ '&' => array('SpecialCharacter'),
+ '*' => array('Emphasis'),
+ ':' => array('Url'),
+ '<' => array('UrlTag', 'EmailTag', 'Markup'),
+ '[' => array('Link'),
+ '_' => array('Emphasis'),
+ '`' => array('Code'),
+ '~' => array('Strikethrough'),
+ '\\' => array('EscapeSequence'),
+ );
+
+ # ~
+
+ protected $inlineMarkerList = '!*_&[:<`~\\';
+
+ #
+ # ~
+ #
+
+ public function line($text, $nonNestables = array())
+ {
+ return $this->elements($this->lineElements($text, $nonNestables));
+ }
+
+ protected function lineElements($text, $nonNestables = array())
+ {
+ # standardize line breaks
+ $text = str_replace(array("\r\n", "\r"), "\n", $text);
+
+ $Elements = array();
+
+ $nonNestables = (empty($nonNestables)
+ ? array()
+ : array_combine($nonNestables, $nonNestables)
+ );
+
+ # $excerpt is based on the first occurrence of a marker
+
+ while ($excerpt = strpbrk($text, $this->inlineMarkerList))
+ {
+ $marker = $excerpt[0];
+
+ $markerPosition = strlen($text) - strlen($excerpt);
+
+ $Excerpt = array('text' => $excerpt, 'context' => $text);
+
+ foreach ($this->InlineTypes[$marker] as $inlineType)
+ {
+ # check to see if the current inline type is nestable in the current context
+
+ if (isset($nonNestables[$inlineType]))
+ {
+ continue;
+ }
+
+ $Inline = $this->{"inline$inlineType"}($Excerpt);
+
+ if ( ! isset($Inline))
+ {
+ continue;
+ }
+
+ # makes sure that the inline belongs to "our" marker
+
+ if (isset($Inline['position']) and $Inline['position'] > $markerPosition)
+ {
+ continue;
+ }
+
+ # sets a default inline position
+
+ if ( ! isset($Inline['position']))
+ {
+ $Inline['position'] = $markerPosition;
+ }
+
+ # cause the new element to 'inherit' our non nestables
+
+
+ $Inline['element']['nonNestables'] = isset($Inline['element']['nonNestables'])
+ ? array_merge($Inline['element']['nonNestables'], $nonNestables)
+ : $nonNestables
+ ;
+
+ # the text that comes before the inline
+ $unmarkedText = substr($text, 0, $Inline['position']);
+
+ # compile the unmarked text
+ $InlineText = $this->inlineText($unmarkedText);
+ $Elements[] = $InlineText['element'];
+
+ # compile the inline
+ $Elements[] = $this->extractElement($Inline);
+
+ # remove the examined text
+ $text = substr($text, $Inline['position'] + $Inline['extent']);
+
+ continue 2;
+ }
+
+ # the marker does not belong to an inline
+
+ $unmarkedText = substr($text, 0, $markerPosition + 1);
+
+ $InlineText = $this->inlineText($unmarkedText);
+ $Elements[] = $InlineText['element'];
+
+ $text = substr($text, $markerPosition + 1);
+ }
+
+ $InlineText = $this->inlineText($text);
+ $Elements[] = $InlineText['element'];
+
+ foreach ($Elements as &$Element)
+ {
+ if ( ! isset($Element['autobreak']))
+ {
+ $Element['autobreak'] = false;
+ }
+ }
+
+ return $Elements;
+ }
+
+ #
+ # ~
+ #
+
+ protected function inlineText($text)
+ {
+ $Inline = array(
+ 'extent' => strlen($text),
+ 'element' => array(),
+ );
+
+ $Inline['element']['elements'] = self::pregReplaceElements(
+ $this->breaksEnabled ? '/[ ]*+\n/' : '/(?:[ ]*+\\\\|[ ]{2,}+)\n/',
+ array(
+ array('name' => 'br'),
+ array('text' => "\n"),
+ ),
+ $text
+ );
+
+ return $Inline;
+ }
+
+ protected function inlineCode($Excerpt)
+ {
+ $marker = $Excerpt['text'][0];
+
+ if (preg_match('/^(['.$marker.']++)[ ]*+(.+?)[ ]*+(? strlen($matches[0]),
+ 'element' => array(
+ 'name' => 'code',
+ 'text' => $text,
+ ),
+ );
+ }
+ }
+
+ protected function inlineEmailTag($Excerpt)
+ {
+ $hostnameLabel = '[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?';
+
+ $commonMarkEmail = '[a-zA-Z0-9.!#$%&\'*+\/=?^_`{|}~-]++@'
+ . $hostnameLabel . '(?:\.' . $hostnameLabel . ')*';
+
+ if (strpos($Excerpt['text'], '>') !== false
+ and preg_match("/^<((mailto:)?$commonMarkEmail)>/i", $Excerpt['text'], $matches)
+ ){
+ $url = $matches[1];
+
+ if ( ! isset($matches[2]))
+ {
+ $url = "mailto:$url";
+ }
+
+ return array(
+ 'extent' => strlen($matches[0]),
+ 'element' => array(
+ 'name' => 'a',
+ 'text' => $matches[1],
+ 'attributes' => array(
+ 'href' => $url,
+ ),
+ ),
+ );
+ }
+ }
+
+ protected function inlineEmphasis($Excerpt)
+ {
+ if ( ! isset($Excerpt['text'][1]))
+ {
+ return;
+ }
+
+ $marker = $Excerpt['text'][0];
+
+ if ($Excerpt['text'][1] === $marker and preg_match($this->StrongRegex[$marker], $Excerpt['text'], $matches))
+ {
+ $emphasis = 'strong';
+ }
+ elseif (preg_match($this->EmRegex[$marker], $Excerpt['text'], $matches))
+ {
+ $emphasis = 'em';
+ }
+ else
+ {
+ return;
+ }
+
+ return array(
+ 'extent' => strlen($matches[0]),
+ 'element' => array(
+ 'name' => $emphasis,
+ 'handler' => array(
+ 'function' => 'lineElements',
+ 'argument' => $matches[1],
+ 'destination' => 'elements',
+ )
+ ),
+ );
+ }
+
+ protected function inlineEscapeSequence($Excerpt)
+ {
+ if (isset($Excerpt['text'][1]) and in_array($Excerpt['text'][1], $this->specialCharacters))
+ {
+ return array(
+ 'element' => array('rawHtml' => $Excerpt['text'][1]),
+ 'extent' => 2,
+ );
+ }
+ }
+
+ protected function inlineImage($Excerpt)
+ {
+ if ( ! isset($Excerpt['text'][1]) or $Excerpt['text'][1] !== '[')
+ {
+ return;
+ }
+
+ $Excerpt['text']= substr($Excerpt['text'], 1);
+
+ $Link = $this->inlineLink($Excerpt);
+
+ if ($Link === null)
+ {
+ return;
+ }
+
+ $Inline = array(
+ 'extent' => $Link['extent'] + 1,
+ 'element' => array(
+ 'name' => 'img',
+ 'attributes' => array(
+ 'src' => $Link['element']['attributes']['href'],
+ 'alt' => $Link['element']['handler']['argument'],
+ ),
+ 'autobreak' => true,
+ ),
+ );
+
+ $Inline['element']['attributes'] += $Link['element']['attributes'];
+
+ unset($Inline['element']['attributes']['href']);
+
+ return $Inline;
+ }
+
+ protected function inlineLink($Excerpt)
+ {
+ $Element = array(
+ 'name' => 'a',
+ 'handler' => array(
+ 'function' => 'lineElements',
+ 'argument' => null,
+ 'destination' => 'elements',
+ ),
+ 'nonNestables' => array('Url', 'Link'),
+ 'attributes' => array(
+ 'href' => null,
+ 'title' => null,
+ ),
+ );
+
+ $extent = 0;
+
+ $remainder = $Excerpt['text'];
+
+ if (preg_match('/\[((?:[^][]++|(?R))*+)\]/', $remainder, $matches))
+ {
+ $Element['handler']['argument'] = $matches[1];
+
+ $extent += strlen($matches[0]);
+
+ $remainder = substr($remainder, $extent);
+ }
+ else
+ {
+ return;
+ }
+
+ if (preg_match('/^[(]\s*+((?:[^ ()]++|[(][^ )]+[)])++)(?:[ ]+("[^"]*+"|\'[^\']*+\'))?\s*+[)]/', $remainder, $matches))
+ {
+ $Element['attributes']['href'] = $matches[1];
+
+ if (isset($matches[2]))
+ {
+ $Element['attributes']['title'] = substr($matches[2], 1, - 1);
+ }
+
+ $extent += strlen($matches[0]);
+ }
+ else
+ {
+ if (preg_match('/^\s*\[(.*?)\]/', $remainder, $matches))
+ {
+ $definition = strlen($matches[1]) ? $matches[1] : $Element['handler']['argument'];
+ $definition = strtolower($definition);
+
+ $extent += strlen($matches[0]);
+ }
+ else
+ {
+ $definition = strtolower($Element['handler']['argument']);
+ }
+
+ if ( ! isset($this->DefinitionData['Reference'][$definition]))
+ {
+ return;
+ }
+
+ $Definition = $this->DefinitionData['Reference'][$definition];
+
+ $Element['attributes']['href'] = $Definition['url'];
+ $Element['attributes']['title'] = $Definition['title'];
+ }
+
+ return array(
+ 'extent' => $extent,
+ 'element' => $Element,
+ );
+ }
+
+ protected function inlineMarkup($Excerpt)
+ {
+ if ($this->markupEscaped or $this->safeMode or strpos($Excerpt['text'], '>') === false)
+ {
+ return;
+ }
+
+ if ($Excerpt['text'][1] === '/' and preg_match('/^<\/\w[\w-]*+[ ]*+>/s', $Excerpt['text'], $matches))
+ {
+ return array(
+ 'element' => array('rawHtml' => $matches[0]),
+ 'extent' => strlen($matches[0]),
+ );
+ }
+
+ if ($Excerpt['text'][1] === '!' and preg_match('/^/s', $Excerpt['text'], $matches))
+ {
+ return array(
+ 'element' => array('rawHtml' => $matches[0]),
+ 'extent' => strlen($matches[0]),
+ );
+ }
+
+ if ($Excerpt['text'][1] !== ' ' and preg_match('/^<\w[\w-]*+(?:[ ]*+'.$this->regexHtmlAttribute.')*+[ ]*+\/?>/s', $Excerpt['text'], $matches))
+ {
+ return array(
+ 'element' => array('rawHtml' => $matches[0]),
+ 'extent' => strlen($matches[0]),
+ );
+ }
+ }
+
+ protected function inlineSpecialCharacter($Excerpt)
+ {
+ if (substr($Excerpt['text'], 1, 1) !== ' ' and strpos($Excerpt['text'], ';') !== false
+ and preg_match('/^&(#?+[0-9a-zA-Z]++);/', $Excerpt['text'], $matches)
+ ) {
+ return array(
+ 'element' => array('rawHtml' => '&' . $matches[1] . ';'),
+ 'extent' => strlen($matches[0]),
+ );
+ }
+ }
+
+ protected function inlineStrikethrough($Excerpt)
+ {
+ if ( ! isset($Excerpt['text'][1]))
+ {
+ return;
+ }
+
+ if ($Excerpt['text'][1] === '~' and preg_match('/^~~(?=\S)(.+?)(?<=\S)~~/', $Excerpt['text'], $matches))
+ {
+ return array(
+ 'extent' => strlen($matches[0]),
+ 'element' => array(
+ 'name' => 'del',
+ 'handler' => array(
+ 'function' => 'lineElements',
+ 'argument' => $matches[1],
+ 'destination' => 'elements',
+ )
+ ),
+ );
+ }
+ }
+
+ protected function inlineUrl($Excerpt)
+ {
+ if ($this->urlsLinked !== true or ! isset($Excerpt['text'][2]) or $Excerpt['text'][2] !== '/')
+ {
+ return;
+ }
+
+ if (strpos($Excerpt['context'], 'http') !== false
+ and preg_match('/\bhttps?+:[\/]{2}[^\s<]+\b\/*+/ui', $Excerpt['context'], $matches, PREG_OFFSET_CAPTURE)
+ ) {
+ $url = $matches[0][0];
+
+ $Inline = array(
+ 'extent' => strlen($matches[0][0]),
+ 'position' => $matches[0][1],
+ 'element' => array(
+ 'name' => 'a',
+ 'text' => $url,
+ 'attributes' => array(
+ 'href' => $url,
+ ),
+ ),
+ );
+
+ return $Inline;
+ }
+ }
+
+ protected function inlineUrlTag($Excerpt)
+ {
+ if (strpos($Excerpt['text'], '>') !== false and preg_match('/^<(\w++:\/{2}[^ >]++)>/i', $Excerpt['text'], $matches))
+ {
+ $url = $matches[1];
+
+ return array(
+ 'extent' => strlen($matches[0]),
+ 'element' => array(
+ 'name' => 'a',
+ 'text' => $url,
+ 'attributes' => array(
+ 'href' => $url,
+ ),
+ ),
+ );
+ }
+ }
+
+ # ~
+
+ protected function unmarkedText($text)
+ {
+ $Inline = $this->inlineText($text);
+ return $this->element($Inline['element']);
+ }
+
+ #
+ # Handlers
+ #
+
+ protected function handle(array $Element)
+ {
+ if (isset($Element['handler']))
+ {
+ if (!isset($Element['nonNestables']))
+ {
+ $Element['nonNestables'] = array();
+ }
+
+ if (is_string($Element['handler']))
+ {
+ $function = $Element['handler'];
+ $argument = $Element['text'];
+ unset($Element['text']);
+ $destination = 'rawHtml';
+ }
+ else
+ {
+ $function = $Element['handler']['function'];
+ $argument = $Element['handler']['argument'];
+ $destination = $Element['handler']['destination'];
+ }
+
+ $Element[$destination] = $this->{$function}($argument, $Element['nonNestables']);
+
+ if ($destination === 'handler')
+ {
+ $Element = $this->handle($Element);
+ }
+
+ unset($Element['handler']);
+ }
+
+ return $Element;
+ }
+
+ protected function handleElementRecursive(array $Element)
+ {
+ return $this->elementApplyRecursive(array($this, 'handle'), $Element);
+ }
+
+ protected function handleElementsRecursive(array $Elements)
+ {
+ return $this->elementsApplyRecursive(array($this, 'handle'), $Elements);
+ }
+
+ protected function elementApplyRecursive($closure, array $Element)
+ {
+ $Element = call_user_func($closure, $Element);
+
+ if (isset($Element['elements']))
+ {
+ $Element['elements'] = $this->elementsApplyRecursive($closure, $Element['elements']);
+ }
+ elseif (isset($Element['element']))
+ {
+ $Element['element'] = $this->elementApplyRecursive($closure, $Element['element']);
+ }
+
+ return $Element;
+ }
+
+ protected function elementApplyRecursiveDepthFirst($closure, array $Element)
+ {
+ if (isset($Element['elements']))
+ {
+ $Element['elements'] = $this->elementsApplyRecursiveDepthFirst($closure, $Element['elements']);
+ }
+ elseif (isset($Element['element']))
+ {
+ $Element['element'] = $this->elementsApplyRecursiveDepthFirst($closure, $Element['element']);
+ }
+
+ $Element = call_user_func($closure, $Element);
+
+ return $Element;
+ }
+
+ protected function elementsApplyRecursive($closure, array $Elements)
+ {
+ foreach ($Elements as &$Element)
+ {
+ $Element = $this->elementApplyRecursive($closure, $Element);
+ }
+
+ return $Elements;
+ }
+
+ protected function elementsApplyRecursiveDepthFirst($closure, array $Elements)
+ {
+ foreach ($Elements as &$Element)
+ {
+ $Element = $this->elementApplyRecursiveDepthFirst($closure, $Element);
+ }
+
+ return $Elements;
+ }
+
+ protected function element(array $Element)
+ {
+ if ($this->safeMode)
+ {
+ $Element = $this->sanitiseElement($Element);
+ }
+
+ # identity map if element has no handler
+ $Element = $this->handle($Element);
+
+ $hasName = isset($Element['name']);
+
+ $markup = '';
+
+ if ($hasName)
+ {
+ $markup .= '<' . $Element['name'];
+
+ if (isset($Element['attributes']))
+ {
+ foreach ($Element['attributes'] as $name => $value)
+ {
+ if ($value === null)
+ {
+ continue;
+ }
+
+ $markup .= " $name=\"".self::escape($value).'"';
+ }
+ }
+ }
+
+ $permitRawHtml = false;
+
+ if (isset($Element['text']))
+ {
+ $text = $Element['text'];
+ }
+ // very strongly consider an alternative if you're writing an
+ // extension
+ elseif (isset($Element['rawHtml']))
+ {
+ $text = $Element['rawHtml'];
+
+ $allowRawHtmlInSafeMode = isset($Element['allowRawHtmlInSafeMode']) && $Element['allowRawHtmlInSafeMode'];
+ $permitRawHtml = !$this->safeMode || $allowRawHtmlInSafeMode;
+ }
+
+ $hasContent = isset($text) || isset($Element['element']) || isset($Element['elements']);
+
+ if ($hasContent)
+ {
+ $markup .= $hasName ? '>' : '';
+
+ if (isset($Element['elements']))
+ {
+ $markup .= $this->elements($Element['elements']);
+ }
+ elseif (isset($Element['element']))
+ {
+ $markup .= $this->element($Element['element']);
+ }
+ else
+ {
+ if (!$permitRawHtml)
+ {
+ $markup .= self::escape($text, true);
+ }
+ else
+ {
+ $markup .= $text;
+ }
+ }
+
+ $markup .= $hasName ? '' . $Element['name'] . '>' : '';
+ }
+ elseif ($hasName)
+ {
+ $markup .= ' />';
+ }
+
+ return $markup;
+ }
+
+ protected function elements(array $Elements)
+ {
+ $markup = '';
+
+ $autoBreak = true;
+
+ foreach ($Elements as $Element)
+ {
+ if (empty($Element))
+ {
+ continue;
+ }
+
+ $autoBreakNext = (isset($Element['autobreak'])
+ ? $Element['autobreak'] : isset($Element['name'])
+ );
+ // (autobreak === false) covers both sides of an element
+ $autoBreak = !$autoBreak ? $autoBreak : $autoBreakNext;
+
+ $markup .= ($autoBreak ? "\n" : '') . $this->element($Element);
+ $autoBreak = $autoBreakNext;
+ }
+
+ $markup .= $autoBreak ? "\n" : '';
+
+ return $markup;
+ }
+
+ # ~
+
+ protected function li($lines)
+ {
+ $Elements = $this->linesElements($lines);
+
+ if ( ! in_array('', $lines)
+ and isset($Elements[0]) and isset($Elements[0]['name'])
+ and $Elements[0]['name'] === 'p'
+ ) {
+ unset($Elements[0]['name']);
+ }
+
+ return $Elements;
+ }
+
+ #
+ # AST Convenience
+ #
+
+ /**
+ * Replace occurrences $regexp with $Elements in $text. Return an array of
+ * elements representing the replacement.
+ */
+ protected static function pregReplaceElements($regexp, $Elements, $text)
+ {
+ $newElements = array();
+
+ while (preg_match($regexp, $text, $matches, PREG_OFFSET_CAPTURE))
+ {
+ $offset = $matches[0][1];
+ $before = substr($text, 0, $offset);
+ $after = substr($text, $offset + strlen($matches[0][0]));
+
+ $newElements[] = array('text' => $before);
+
+ foreach ($Elements as $Element)
+ {
+ $newElements[] = $Element;
+ }
+
+ $text = $after;
+ }
+
+ $newElements[] = array('text' => $text);
+
+ return $newElements;
+ }
+
+ #
+ # Deprecated Methods
+ #
+
+ /**
+ * @deprecated use text() instead
+ */
+ function parse($text)
+ {
+ $markup = $this->text($text);
+
+ return $markup;
+ }
+
+ protected function sanitiseElement(array $Element)
+ {
+ static $goodAttribute = '/^[a-zA-Z0-9][a-zA-Z0-9-_]*+$/';
+ static $safeUrlNameToAtt = array(
+ 'a' => 'href',
+ 'img' => 'src',
+ );
+
+ if ( ! isset($Element['name']))
+ {
+ unset($Element['attributes']);
+ return $Element;
+ }
+
+ if (isset($safeUrlNameToAtt[$Element['name']]))
+ {
+ $Element = $this->filterUnsafeUrlInAttribute($Element, $safeUrlNameToAtt[$Element['name']]);
+ }
+
+ if ( ! empty($Element['attributes']))
+ {
+ foreach ($Element['attributes'] as $att => $val)
+ {
+ # filter out badly parsed attribute
+ if ( ! preg_match($goodAttribute, $att))
+ {
+ unset($Element['attributes'][$att]);
+ }
+ # dump onevent attribute
+ elseif (self::striAtStart($att, 'on'))
+ {
+ unset($Element['attributes'][$att]);
+ }
+ }
+ }
+
+ return $Element;
+ }
+
+ protected function filterUnsafeUrlInAttribute(array $Element, $attribute)
+ {
+ foreach ($this->safeLinksWhitelist as $scheme)
+ {
+ if (self::striAtStart($Element['attributes'][$attribute], $scheme))
+ {
+ return $Element;
+ }
+ }
+
+ $Element['attributes'][$attribute] = str_replace(':', '%3A', $Element['attributes'][$attribute]);
+
+ return $Element;
+ }
+
+ #
+ # Static Methods
+ #
+
+ protected static function escape($text, $allowQuotes = false)
+ {
+ return htmlspecialchars($text, $allowQuotes ? ENT_NOQUOTES : ENT_QUOTES, 'UTF-8');
+ }
+
+ protected static function striAtStart($string, $needle)
+ {
+ $len = strlen($needle);
+
+ if ($len > strlen($string))
+ {
+ return false;
+ }
+ else
+ {
+ return strtolower(substr($string, 0, $len)) === strtolower($needle);
+ }
+ }
+
+ static function instance($name = 'default')
+ {
+ if (isset(self::$instances[$name]))
+ {
+ return self::$instances[$name];
+ }
+
+ $instance = new static();
+
+ self::$instances[$name] = $instance;
+
+ return $instance;
+ }
+
+ private static $instances = array();
+
+ #
+ # Fields
+ #
+
+ protected $DefinitionData;
+
+ #
+ # Read-Only
+
+ protected $specialCharacters = array(
+ '\\', '`', '*', '_', '{', '}', '[', ']', '(', ')', '>', '#', '+', '-', '.', '!', '|', '~'
+ );
+
+ protected $StrongRegex = array(
+ '*' => '/^[*]{2}((?:\\\\\*|[^*]|[*][^*]*+[*])+?)[*]{2}(?![*])/s',
+ '_' => '/^__((?:\\\\_|[^_]|_[^_]*+_)+?)__(?!_)/us',
+ );
+
+ protected $EmRegex = array(
+ '*' => '/^[*]((?:\\\\\*|[^*]|[*][*][^*]+?[*][*])+?)[*](?![*])/s',
+ '_' => '/^_((?:\\\\_|[^_]|__[^_]*__)+?)_(?!_)\b/us',
+ );
+
+ protected $regexHtmlAttribute = '[a-zA-Z_:][\w:.-]*+(?:\s*+=\s*+(?:[^"\'=<>`\s]+|"[^"]*+"|\'[^\']*+\'))?+';
+
+ protected $voidElements = array(
+ 'area', 'base', 'br', 'col', 'command', 'embed', 'hr', 'img', 'input', 'link', 'meta', 'param', 'source',
+ );
+
+ protected $textLevelElements = array(
+ 'a', 'br', 'bdo', 'abbr', 'blink', 'nextid', 'acronym', 'basefont',
+ 'b', 'em', 'big', 'cite', 'small', 'spacer', 'listing',
+ 'i', 'rp', 'del', 'code', 'strike', 'marquee',
+ 'q', 'rt', 'ins', 'font', 'strong',
+ 's', 'tt', 'kbd', 'mark',
+ 'u', 'xm', 'sub', 'nobr',
+ 'sup', 'ruby',
+ 'var', 'span',
+ 'wbr', 'time',
+ );
+}
diff --git a/content/php/markDown.php b/content/php/markDown.php
new file mode 100644
index 0000000..4b9e77a
--- /dev/null
+++ b/content/php/markDown.php
@@ -0,0 +1,52 @@
+Errore: Impossibile recuperare il contenuto ($httpCode).
";
+ }
+ }
+
+ $Parsedown = new Parsedown();
+ // Importante: Rimuove eventuali spazi bianchi superflui all'inizio/fine
+ return '' . $Parsedown->text(trim($markdown)) . '
';
+}
+
+?>
\ No newline at end of file
diff --git a/img/woman-hair.png b/img/woman-hair.png
new file mode 100644
index 0000000000000000000000000000000000000000..0930d27e700767ad58748441e67021323bcc762e
GIT binary patch
literal 34113
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
LhOCfB{r7(W93PW3
literal 0
HcmV?d00001
diff --git a/img/women-smovement.webp b/img/women-smovement.webp
new file mode 100644
index 0000000000000000000000000000000000000000..208711a3846be23e00f1d2d91d49b087b12889b8
GIT binary patch
literal 3097464
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