1<?php 2if(!defined('DOKU_INC')) die(); 3 4class syntax_plugin_kanban extends DokuWiki_Syntax_Plugin { 5 public function getType() { return 'substition'; } 6 public function getSort() { return 150; } 7 public function connectTo($mode) { 8 $this->Lexer->addSpecialPattern('\{\{kanban>.*?\}\}', $mode, 'plugin_kanban'); 9 } 10 11 public function handle($match, $state, $pos, Doku_Handler $handler) { 12 return [substr($match, 9, -2)]; 13 14 } 15 16 public function render($mode, Doku_Renderer $renderer, $data) { 17 if ($mode != 'xhtml') return false; 18 global $conf; 19 //$mydata = str_split("||",$data); 20 list($boardName) = $data; 21 //echo $boardName;//debugging line 22 //list($boardName) = $mydata[0]; 23 //list($boardList) = $mydata[1]; 24 list($var1, $var2) = explode("+", $boardName); //added - 5-8-2026 25 //Change the variable back to boardName 26 $boardName = $var1;//added - 5-8-2026 27 // Path to individual card files: data/kanban/[boardName]/*.json 28 // $kanbanDir = $conf['savedir'] . '/kanban/' . $boardName . '/'; //WORKS!! 29 $kanbanDir = $conf['savedir'] . '/kanban/' . $boardName . '/'; //added - 5-8-2026 30 31 // Dynamically create the directory if it doesn't exist 32 if (!is_dir($kanbanDir)) io_makeFileDir($kanbanDir . 'placeholder.txt'); 33 34 $renderer->doc .= '<div class="kanban-board" data-board="' . hsc($boardName) . '">'; 35 // $columns = ['Projects', 'WIP', 'On Hold', 'Done']; // WORKS!! 36 // echo $var2; 37 $headers = explode(",",$var2); //added - 5-8-2026 38 $outpea = [];//added - 5-8-2026 39 $thankee = count($headers);//added - 5-8-2026 40 for($x=0;$x<$thankee;$x++){//added - 5-8-2026 41 if($headers[$x] && $headers[$x] != "" && !is_null($headers[$x])){//added - 5-8-2026 42 $outpea[$x] = $headers[$x];//added - 5-8-2026 43 }else{//added - 5-8-2026 44 continue;//added - 5-8-2026 45 }//added - 5-8-2026 46 }//added - 5-8-2026 47 $columns = $outpea;//added - 5-8-2026 48 $colVal=0;//added - 5-8-2026 49 50 // Load all .json files in the board directory 51 $savedCards = []; 52 foreach (glob($kanbanDir . "*.json") as $file) { 53 $card = json_decode(io_readFile($file), true); 54 if ($card) $savedCards[] = $card; 55 } 56 57 foreach ($columns as $col) { 58 59 $id = strtolower(str_replace(' ', '-', $col)); 60 $renderer->doc .= '<div class="kanban-col" data-id="' . $id . '">'; 61 $renderer->doc .= ' <h3>' . hsc($col) . '</h3>'; 62 $renderer->doc .= ' <div class="cards-container"><div class="kanban-card-locked" data-id=0"><div class="triple-lines"></div></div>'; 63 64 foreach ($savedCards as $card) { 65 if ($card['column'] === $id) { 66 $renderer->doc .= $this->_renderCardHtml($card); 67 } 68 } 69 if($colVal!==0){//added - 5-8-2026 70 $renderer->doc .= ' </div></div>';//added - 5-8-2026 71 }else{//added - 5-8-2026 72 $renderer->doc .= ' </div><button class="add-card-btn">+ Add Card</button></div>'; 73 //$renderer->doc .= ' </div><button class="add-col-btn">+ Add Column</button> <button class="add-card-btn">+ Add Card</button></div>';//added - 5-8-2026 74 }//added - 5-8-2026 75 $colVal = ($colVal + 1);//added - 5-8-2026 76 } 77 $renderer->doc .= '<div>My name goes here</div></div>'; 78 79 return true; 80 } 81 82 private function _renderCardHtml($card) { 83 $currNote = hsc($card['note']); 84 $imp = hsc($card['importance'] ?? 'medium'); 85 if(hsc($card['checked']) !== "true"){ 86 $dat = ""; 87 }else{ 88 $dat = "checked"; 89 } 90 $fullNotes = ''; 91 $notes=hsc($card['note']); 92 $notif = explode("+",$notes); 93 array_map('trim', $notif); 94 foreach($notif as $note){ 95 if($note == ""){ 96 continue; 97 }else{ 98 $fullNotes = $fullNotes . "+ " . $note . "<br>"; 99 } 100 } 101 102 //return the card data only if the card has not been checked complete 103 if($dat != "checked"){ 104 return '<div class="kanban-card '.$imp.'" data-id="'.hsc($card['id']).'">' 105 . '<input type="checkbox" ' . $dat . '>' 106 . '<strong class="card-title">'.hsc($card['name']).'</strong><div id="noteDiv" class="noteDiv">Content</div>' 107 . '<div class="card-desc">'.hsc($card['desc'] ?? '').'</div>' 108 . '<input class="btn-notes" value="+Add Note">' 109 . '<div class="card-note">' . $fullNotes . '</div></div>'; 110 } 111 } 112} 113