Toon posts:

[Php] goede markdown parser

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Voor mijn documentatie maak ik gebruik van markdown en echter wil ik gebruik maken van code voorbeelden.

Nu heb ik verscheidene php parsers gebruikt, 1 zelfs gedebugged en proberen de bug te vinden en oplossen (nog niet gelukt) maar de 3 parsers die ik nu getest heb kunnen mijn code niet mooi weergeven.

Die parsers gebruiken ook allemaal regexes, die ik normaliter zo veel mogelijk vermijdt vanwege slechte leesbaarheid (al kan dat met ai wellicht beter).

Mijn code tags beginnen met een dubbele {{ en daar voegen alle 3 de parsers daartussen enters en spaties tussen, zodat de opmaak wordt verpest.

Ik zoek dus een goede parser die mijn code tags goed houdt liefst met een abstract syntax tree en liever geen regex, maar mb_str_split.

Ik denk dat mijzelf het een maand duurt voordat ik een basis markdown parser kan maken (heb genoeg data om te testen) en overweeg zelfbouw ook omdat de parsers die ik heb getest html er niet uit kunnen filteren en ik dat in mijn parser wel kan toevoegen.

Kent iemand een goede markdown parser liefst in cli (debian) zodat ik mij die maand kan sparen ?


Heb wel ervaring met het bouwen van parsers.

Het moet ook html kunnen verwijderen uit het document het liefst zodat ik de markdown kan valideren en als user input kan gaan gebruiken.

De parsers die ik heb getest:


https://michelf.com/projects/php-markdown

https://github.com/cebe/markdown

https://github.com/erusev/parsedown

Acties:
  • +1 Henk 'm!

  • Barryvdh
  • Registratie: Juni 2003
  • Laatst online: 20:20
Heb je deze ook bekeken?
https://github.com/thephpleague/commonmark

Volgens mij is dat de meeste populaire, en ook aanpasbaar: https://commonmark.thephp...5/customization/overview/

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Nee nog niet, bedankt!

Volgens mij precies wat ik zoek...

Kan denk ik ook nog een bug melden daar, als die dat ook doet...

1 van mijn 3 had 40 miljoen downloads...

[ Voor 96% gewijzigd door Verwijderd op 25-08-2024 20:42 ]


Acties:
  • +2 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Verwijderd schreef op zondag 25 augustus 2024 @ 20:25:
liever geen regex, maar mb_str_split.
Als je op zoek bent naar een "dan hoef ik 't wiel niet opnieuw uit te vinden", ofwel kant-en-klare, parser wat boeit 't jou dan hoe die parser z'n doel bereikt? Waarom is zo'n minutieus implementatiedetail voor jou relevant?

En als jij er een 'afwijkende' syntax op na houdt, wat let je dan je code te pre-processen en vervolgens aan een willekeurige parser deze 'voorgekauwde' code te geven die de parser wél begrijp? Haal die {{ in de preprocessing stap er uit, haal de resulterende code door een willekeurige parse en plak zonodig naderhand die {{ weer terug erin.

[ Voor 16% gewijzigd door RobIII op 25-08-2024 21:18 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ik wil in de toekomst wel een parser die dingen kan toevoegen zoals iemand taggen in een bericht, dat kan met die van barryVdh, daarnaast is mb_str_split veiliger dan een regex, je moet dan karakter voor karakter langs waarbij je gelijk de html kan strippen.

Dit doet ie in ieder geval nog niet goed:

HTML:
1
2
3
4
5
6
7
8
9
10
11
12
<pre><code class="language-javascript">//{



{
R3M}}
const world = &quot;{{request('world')}}&quot;;
const hello = 'Hello ' + world + '!';
const state = &quot;{{raw|object(session(), 'json')}}&quot;;
console.log(hello);
console.log(state);
</code></pre>


ik lees je oplossing, en een simpele str_replace kan inderdaad wellicht afdoende zijn. ben net overgestapt op die van barryvdh.

[ Voor 9% gewijzigd door Verwijderd op 25-08-2024 21:26 ]


Acties:
  • +3 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Verwijderd schreef op zondag 25 augustus 2024 @ 21:25:
daarnaast is mb_str_split veiliger dan een regex
We kunnen hier een hele discussie gaan voeren over voors en tegens van regexen en 1001 andere manieren voor het parsen van code. Die discussie ga ik niet met je aan. Mijn punt was: waarom boeit 't je wat de internals van zo'n project zijn als 't doet wat 't moet doen?

Verder kom je nu met aanvullende eisen die je niet in je topicstart genoemd hebt: "dingen kan toevoegen zoals iemand taggen in een bericht". En wat als een regex-based parser dat zou kunnen, valt 'ie dan nog af? Want er is geen enkele technische reden waarom dat alleen met "mb_str_split" of juist alleen zonder regex zou kunnen.

Nogmaals: de discussie regex vs <iets anders> ga ik hier niet voeren; ikzelf zou ook niet gauw een regex gebruiken om zoiets te implementeren. Maar dat is 't punt niet. Je wil, voor zover ik begrijp, je code documenteren door deze door een php parser te halen en daar in markdown formaat documentatie uit te krijgen. Al gebruikt 't ding oempaloempa's om die code te parsen en documentatie te genereren: who cares? Als de output is wat je wil hebben: yay! En door! Toch?
Verwijderd schreef op zondag 25 augustus 2024 @ 21:25:
HTML:
1
const world = &quot;{{request('world')}}&quot;;
Ieuw. Wat is dit? :X

[ Voor 8% gewijzigd door RobIII op 25-08-2024 22:13 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
er staat eigenlijk: `const world = "{{request('world')}}";` en dat is een php request in een javascript bestand.

hier heb je de sessie:

const state = "{{raw|object(session(), 'json')}}";

en daar maakt ie een json object van

maar wat blijkt, ik heb nog een andere parser actief die het veroorzaakte, dus ik neem mijn woorden terug. maar heb nu wel een up2date markdown viewer waarbij je plugins kan schrijven 8)7

de parser veranderde ook de output van de debug informatie 8)7

[ Voor 70% gewijzigd door Verwijderd op 25-08-2024 21:56 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Deze huidige markdown viewer heeft een ast (abstract syntax tree) en strip_html. Moet nog ff kijken naar hoe die dat doet, anders maak ik een eigen strip html , zodat ik zeker weet dat er geen script inzit. Daarnaast ben ik nu trotse bezitter van ollama.com op mijn server, mooie modellen! Die kan ook middels een ast in json daarvan code genereren.

Acties:
  • +1 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Verwijderd schreef op zondag 25 augustus 2024 @ 21:51:
er staat eigenlijk: `const world = "{{request('world')}}";` en dat is een php request in een javascript bestand.
Ja, dat snap(te) ik, maar waarom die &quot;'s :? Dat wil je toch helemaal niet in je JS code hebben?

[ Voor 10% gewijzigd door RobIII op 25-08-2024 22:15 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
anders geeft ie een javascript error in de ide en zie ik de andere errors moeilijker, ik heb mijn taal zo gemaakt dat ie hybrid is tussen php, json, js en css, html, xml etc..

het zijn geen &quote; maar gewoon "", hij parsed de string in dubbele quotes ook en met raw kun je er een json object van maken

die &quote komt van de markdown parser

[ Voor 91% gewijzigd door Verwijderd op 25-08-2024 22:22 ]


Acties:
  • +2 Henk 'm!

  • CodeCaster
  • Registratie: Juni 2003
  • Niet online

CodeCaster

Can I get uhm...

Verwijderd schreef op zondag 25 augustus 2024 @ 22:09:
Deze huidige markdown viewer heeft een ast (abstract syntax tree) en strip_html. Moet nog ff kijken naar hoe die dat doet, anders maak ik een eigen strip html , zodat ik zeker weet dat er geen script inzit.
Ik zou er niet van uitgaan dat je wel ff beter weet hoe je veilig html kunt renderen dan tientallen contributors die gezamenlijk al jaren werken aan een markdown-parser en -renderer.

Gebruik gewoon de populaire componenten die doen wat je nodig hebt, en als je een testcase hebt die niet goed wordt afgehandeld: maak een issue aan en/of een PR die het issue fixt.

Zo kun je meer tijd besteden aan wat je eigenlijk wilde doen, namelijk documentatie schrijven.

[ Voor 25% gewijzigd door CodeCaster op 25-08-2024 23:19 ]

https://oneerlijkewoz.nl
Op papier is hij aan het tekenen, maar in de praktijk...


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
De strip is de basis voor een veilig systeem. Ik zeg niet dat ik het beter kan. Ik zeg dat ik een strip functie ga maken als ik de andere strip functie niet begrijp. De strip functie kun je met een allow list maken en per tag attributen definiëren. Zo laat je voor de a tag alleen de href en target en title door, en je hebt links werken. Maar ik parse dan karakter voor karakter. Ik wil gewoon dat een user markdown kan gebruiken maar dat moet wel veilig. 1 of meer strip html is toch geen probleem ?

Zoals ik al zei, ben al bekend met parsers.

En je kan heel goed specificeren wat je wel omzet en wat niet...

Mijn bug was, ik had een data bestand gemaakt van een php class. Dit bestand omzetten had een decorator nodig om tot een mooie php class gegenereerd te worden. Deze stond nog aan. Toen die uitstond stond deed ie weer normaal.
..

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ik heb er momenteel dit van gemaakt (maakt het mogelijk om html-comment toe te voegen)

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$config = [
            'html_input' => 'strip',
            'allow_unsafe_links' => false,
        ];
        $environment = new Environment($config);
        $environment->addExtension(new CommonMarkCoreExtension());
        $environment->addExtension(new GithubFlavoredMarkdownExtension());
        $environment->addExtension(new AttributesExtension());
        $converter = new MarkdownConverter($environment);
        $comment_start = Core::uuid();
        $comment_end = Core::uuid();
        $string = str_replace(['<!--', '-->'], [$comment_start, $comment_end], $string);
        $string = $converter->convert($string);
        $string =  str_replace([$comment_start, $comment_end], ['<!--', '-->'], $string);
        return str_replace(['<p><!--', '--></p>'], ['<!--', '-->'], $string);


Door de uuid's wordt er een paragraaf van het commentaar gemaakt, daarom vervang ik die op het eind.

de disallowed-raw-html extension houdt trouwens geen rekening met <a onclick, dat kan ook javascript code uitvoeren

Acties:
  • 0 Henk 'm!

  • Groax
  • Registratie: Oktober 2012
  • Laatst online: 18-08 11:58
Sorry, ik snap het nut hier niet van in. Maar als je zo'n last heb van de HTML, kijk hier eens naar.

Verder, leuk dat je dat je wilt spelen met code maar het wiel opnieuw uitvinden kan zonde van je tijd zijn.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Om de code mooier te maken, gebruik ik iets van Google. Deze verwacht commentaar tags, vandaar dat ik die toelaat.

Daarnaast zag ik dit bij je functie staan:

Warning

This function should not be used to try to prevent XSS attacks. Use more appropriate functions like htmlspecialchars() or other means depending on the context of the output.

Voor anchors met id moet ik nog iets maken, dan ben ik er. Want volgens mij in markdown is er niet iets om #id te linken in hetzelfde document zodat ie er naartoe scrollt.

Acties:
  • +3 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Het is echt naar hoe je altijd met een net andere scope reageert of iets uit de hoge hoed tovert.

Voor weghalen html tags gaf @Groax een link om te beginnen.
Tegen XSS moet je inderdaad (ook/vooral) iets anders doen. Let wel: De kans is 0, nada, noppes dat 1 persoon dit goed krijgt. Jouw eigen soloframework zal statistisch gezien hier lekken hebben. Libraries hiervoor zitten vol littekens.

O, en markdown ondersteunt wel ouderwetsche anchor links binnen zelfde doc by default. Voor mij bovenste Google hit, dus je hoeft ook dit niet zelf uit te vinden.

{signature}


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
nou weer wat geleerd:

Markdown:
1
2
### Using Docker {#using-docker}
[docker]: #using-docker "Docker"


kan het anchor element eruit blijven.

Nou ik wil markdown input aan gaan bieden in de toekomst, die barryvdh gebruikt is volgens mij wel goed geprogrammeerd.

Ik weet nog niet alle ins en outs van markdown blijkt, maar heb dus wel een functie voor html commentaar doorlaten gemaakt.

HTML:
1
<!--?prettify lang=bsh linenums=false?-->


deze gebruik ik voor de opmaak van code.

ik wou alleen wellicht dingen aanzetten programmeren, maar dat hoeft verder nu niet...

Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Als je iets met code (highlighting) zou willen doen in markdown, kun je dan niet beter kijken naar https://www.markdownguide...yntax/#fenced-code-blocks ?

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik gebruik fenced code blocks, maar om de javascript prettyfier te activeren heeft het dat commentaarblock nodig.

Maar ik heb vandaag een functie getest (mijn eigen parser parsed de markdown) en het markdown document kan nu bijvoorbeeld de functie {{markdown.read($url, true)}} aan. Hierdoor kan ik markdown blokken die op meerdere pagina's terugkomen hergebruiken. Ik wil ook nog de date functie en wellicht enkele andere functies aanzetten in mijn parser, zodat markdown echt bruikbaar wordt.

Zo kan ik bijvoorbeeld ook alle gedefinieerde links samenvoegen in een bestand of hier zelfs een data bestand van maken en deze onderaan de pagina laten invoegen.

  • Cartman!
  • Registratie: April 2000
  • Niet online
Verwijderd schreef op woensdag 28 augustus 2024 @ 23:13:
Ik gebruik fenced code blocks, maar om de javascript prettyfier te activeren heeft het dat commentaarblock nodig.
Die kun je toch ook genereren als je bijv
code:
1
```php
doet, dan convert je het bij output naar die html comment, dan blijf je puur markdown schrijven zonder vervuiling van andere tools.
Zo kan ik bijvoorbeeld ook alle gedefinieerde links samenvoegen in een bestand of hier zelfs een data bestand van maken en deze onderaan de pagina laten invoegen.
Er zijn best wat plugins inbegrepen bij Commonmark mbt het detecteren/verbouwen/opslaan van links, kun je dat niet gebruiken ipv zelf iets maken?

Verwijderd

Topicstarter
Het is al gemaakt en dit is het documentatie domein en het is een keuze in de functie in die template. True parameter geeft de mogelijkheid van parsen, false, doet alleen markdown.

Ik stap trouwens over op highlight js voor de opmaak van code. Daarmee verlies ik wel regel nummer maar ben ik het commentaar kwijt.

Voorbeeld van een markdown read:
PHP:
1
2
3
4
5
6
7
8
9
{{markdown.read(
config('controller.dir.data') +
'MarkDown' +
'/' +
'En' +
'/' +
'Commands/app/r3m_io/basic/apache2/package.md',
true
)}}


of zal ik de markdown.read beperken tot de huidige directory:

PHP:
1
{{markdown.read('package.md',true)}}

[ Voor 57% gewijzigd door Verwijderd op 30-08-2024 15:06 ]

Pagina: 1