login  Naam:   Wachtwoord: 
Registreer je!
 Forum

Wiki parser (Opgelost)

Offline gerits - 26/04/2012 21:34
Avatar van geritsLid Ik heb mijn projecten gehost op code.google.com en wil dus ook gebruik maken van de bijhorende wiki pagina's. Nu heb ik dus op mijn website een wiki parser die de wiki pagina's uit code.google.com uitleest en omzet naar html. Ik heb dit zo goed als volledig met preg_replace gedaan, alleen lukt het mij maar niet om de lijsten op een correcte manier weer te geven. De bedoeling is dus dan er lijsten met meerdere niveau's mogelijk zijn.
Een voorbeeld:
  1. * item 1
  2. * item 2
  3. # sub item 1
  4. # sub item 2
  5. * item 3

wordt dus:
  1. - item 1
  2. - item 2
  3. 1. sub item 1
  4. 2. sub item 2
  5. - item 3

Momenteel heb ik het volgende, maar dit werkt maar op 1 niveau en geen sublijsten:
  1. // unordened list
  2. $text = preg_replace("/\s\*(.*?)\n/", "<ul><li>$1</li></ul>", $text);
  3. $text = preg_replace("/<\/ul><ul>/", "", $text);
  4. // ordened list
  5. $text = preg_replace("/\s\#(.*?)\n/", "<ol><li>$1</li></ol>", $text);
  6. $text = preg_replace("/<\/ol><ol>/", "", $text);

Iemand enig idee hoe ik dit kan oplossen?

De spaties voor een * of # liggen niet vast, voor niveau 1 is het altijd minstens 2 spaties, verder moet het volledig dynamisch zijn en oneindig aantal subniveaus.

Alvast bedankt.
Ruben

7 antwoorden

Gesponsorde links
Offline dmbekker - 26/04/2012 21:52
Avatar van dmbekker Lid als je een html pagina wil uitlezen kan je eens naar http://simplehtmldom.sourceforge.net/, dit werkt in mijn ogen veel simpeler dan preg_replace.
Offline vinTage - 26/04/2012 22:07
Avatar van vinTage Nieuw lid Beetje offtopic, maar wel de moeite ;-)
Offline gerits - 26/04/2012 22:55
Avatar van gerits Lid Interessant leesvoer maar niet wat ik zoek. Ik probeer net het omgekeerde, van een ongestructureerde wiki pagina naar een html structuur.
Offline vinTage - 26/04/2012 23:46
Avatar van vinTage Nieuw lid Je post nog eens bekeken, en het lijkt wel wat op een probleempje wat ik ooit voorhad, misschien dat je er iets mee kunt..
Offline gerits - 27/04/2012 06:53
Avatar van gerits Lid Wat ik zelf al in gedacht had was de spaties gebruiken om de niveau's te controleren. Maar dat gaat moeilijk tot een oneindige lijst als men met regex werkt. Ook een verschil is of ik het lijn per lijn afhandel of de wiki in een geheel. Ik zal de tips morgen eens rustig bekijken en zien of ik eruit geraak.
Offline Maarten - 27/04/2012 08:50
Avatar van Maarten Erelid Is dat niet gewoon markdown?

https://www.google.be/?q=markdown+parser
Offline gerits - 27/04/2012 16:53 (laatste wijziging 09/05/2012 21:18)
Avatar van gerits Lid Ja, maar dan zelf gemaakt ;) met zo voorgemaakte systemen is het moeilijker om het resultaat te krijgen dat ik wil. En ik wil de wiki in php parsen, en voor de google code wiki is er alleen een methode in javascript.

En zomaar iemands anders code implementeren is niet hoe je iets bereikt, beetje creativiteit mag wel, alleen zit ik vast met dit stukje. Ik wil niet op een generatie afsteven die niet meer kan programmeren omdat altijd maar andermans code gebruikt.

Een aanpassing gedaan, nu werkt het meerdere niveau's al voor unordened lists, doordat ik het lijn per lijn afhandel.
  1. if (preg_match('/\s[\*|\#]\s(.*)/', $text) > 0) {
  2. $this->previousLevel = $this->currentLevel;
  3. preg_match_all('/\s\s/', $text, $matches);
  4. $this->currentLevel = sizeof($matches[0]);
  5.  
  6. if ($this->currentLevel == $this->previousLevel) {
  7. $text = preg_replace("/\s[\*|\#](.*?)\n/", "<li>$1</li>", $text);
  8. } else if ($this->currentLevel < $this->previousLevel) {
  9. for ($i = 0; $i < $this->previousLevel - $this->currentLevel; $i++)
  10. $text = "</ul>" . $text;
  11. $text = preg_replace("/\s[\*|\#](.*?)\n/", "<li>$1</li>", $text);
  12. } else {
  13. $text = preg_replace("/\s[\*|\#](.*?)\n/", "<ul><li>$1</li>", $text);
  14. }
  15. } else {
  16. if ($this->currentLevel != -1)
  17. for ($i = -1; $i < $this->currentLevel; $i++)
  18. $text = "</ul>" . $text;
  19. $this->previousLevel = 0;
  20. $this->currentLevel = -1;
  21. }

Nu moet hier dus nog een controle in voor laatst geopende tag, in een array bijhouden ofzo dus.

Opgelost, code is te vinden op http://code.goo...parser.php
Gesponsorde links
Je moet ingelogd zijn om een reactie te kunnen posten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.231s