1*1729dd47SHenrik Yllemo<?php 2*1729dd47SHenrik Yllemoclass SkillForge_DokuMarkdownConverter { 3*1729dd47SHenrik Yllemo public function convert($text) { 4*1729dd47SHenrik Yllemo $text = $this->stripMetadataBlocks($text); 5*1729dd47SHenrik Yllemo $text = preg_replace('/^======\s*(.*?)\s*======\s*$/m', '# $1', $text); 6*1729dd47SHenrik Yllemo $text = preg_replace('/^=====\s*(.*?)\s*=====\s*$/m', '## $1', $text); 7*1729dd47SHenrik Yllemo $text = preg_replace('/^====\s*(.*?)\s*====\s*$/m', '### $1', $text); 8*1729dd47SHenrik Yllemo $text = preg_replace('/^===\s*(.*?)\s*===\s*$/m', '#### $1', $text); 9*1729dd47SHenrik Yllemo $text = preg_replace('/^==\s*(.*?)\s*==\s*$/m', '##### $1', $text); 10*1729dd47SHenrik Yllemo $text = preg_replace('/\*\*(.*?)\*\*/s', '**$1**', $text); 11*1729dd47SHenrik Yllemo $text = preg_replace('/\/\/(.*?)\/\//s', '*$1*', $text); 12*1729dd47SHenrik Yllemo $text = preg_replace('/__([^_]+)__/', '<u>$1</u>', $text); 13*1729dd47SHenrik Yllemo $text = preg_replace_callback('/<code(?:\s+([^>]+))?>(.*?)<\/code>/is', function($m) { 14*1729dd47SHenrik Yllemo $lang = isset($m[1]) ? trim($m[1]) : ''; 15*1729dd47SHenrik Yllemo return "```" . $lang . "\n" . trim($m[2]) . "\n```"; 16*1729dd47SHenrik Yllemo }, $text); 17*1729dd47SHenrik Yllemo $text = preg_replace('/<file(?:\s+[^>]*)?>(.*?)<\/file>/is', "```\n$1\n```", $text); 18*1729dd47SHenrik Yllemo $text = preg_replace_callback('/\[\[([^\]|]+)\|([^\]]+)\]\]/', function($m) { 19*1729dd47SHenrik Yllemo return '[' . $m[2] . '](' . $this->pageIdToMd($m[1]) . ')'; 20*1729dd47SHenrik Yllemo }, $text); 21*1729dd47SHenrik Yllemo $text = preg_replace_callback('/\[\[([^\]]+)\]\]/', function($m) { 22*1729dd47SHenrik Yllemo return '[' . $m[1] . '](' . $this->pageIdToMd($m[1]) . ')'; 23*1729dd47SHenrik Yllemo }, $text); 24*1729dd47SHenrik Yllemo $text = preg_replace_callback('/\{\{([^\}|]+)(?:\|([^\}]+))?\}\}/', function($m) { 25*1729dd47SHenrik Yllemo $alt = isset($m[2]) ? trim($m[2]) : ''; 26*1729dd47SHenrik Yllemo return ') . ')'; 27*1729dd47SHenrik Yllemo }, $text); 28*1729dd47SHenrik Yllemo return trim($text) . "\n"; 29*1729dd47SHenrik Yllemo } 30*1729dd47SHenrik Yllemo 31*1729dd47SHenrik Yllemo public function extractMetadata($text) { 32*1729dd47SHenrik Yllemo if (preg_match('/<frontmatter>(.*?)<\/frontmatter>/is', $text, $m)) return trim($m[1]); 33*1729dd47SHenrik Yllemo if (preg_match('/<skillmeta>(.*?)<\/skillmeta>/is', $text, $m)) return trim($m[1]); 34*1729dd47SHenrik Yllemo if (preg_match('/^---\s*\R(.*?)\R---\s*\R/s', $text, $m)) return trim($m[1]); 35*1729dd47SHenrik Yllemo return ''; 36*1729dd47SHenrik Yllemo } 37*1729dd47SHenrik Yllemo 38*1729dd47SHenrik Yllemo private function stripMetadataBlocks($text) { 39*1729dd47SHenrik Yllemo $text = preg_replace('/<frontmatter>.*?<\/frontmatter>\s*/is', '', $text); 40*1729dd47SHenrik Yllemo $text = preg_replace('/<skillmeta>.*?<\/skillmeta>\s*/is', '', $text); 41*1729dd47SHenrik Yllemo $text = preg_replace('/^---\s*\R.*?\R---\s*\R/s', '', $text); 42*1729dd47SHenrik Yllemo return $text; 43*1729dd47SHenrik Yllemo } 44*1729dd47SHenrik Yllemo 45*1729dd47SHenrik Yllemo private function pageIdToMd($id) { 46*1729dd47SHenrik Yllemo if (preg_match('/^https?:\/\//i', $id)) return $id; 47*1729dd47SHenrik Yllemo $id = preg_replace('/#[^#]*$/', '', $id); 48*1729dd47SHenrik Yllemo $id = trim(str_replace(':', '/', $id), '/'); 49*1729dd47SHenrik Yllemo return basename($id) . '.md'; 50*1729dd47SHenrik Yllemo } 51*1729dd47SHenrik Yllemo} 52