xref: /plugin/skillforge/classes/DokuMarkdownConverter.php (revision 1729dd472fd5524951126802d13bd2e76b84b680)
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 '![' . $alt . '](media/' . basename(trim($m[1])) . ')';
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