| | <?php |
| |
|
| | namespace Kanboard\Core; |
| |
|
| | use Parsedown; |
| | use Pimple\Container; |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | class Markdown extends Parsedown |
| | { |
| | |
| | |
| | |
| | |
| | |
| | |
| | private $isPublicLink = false; |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | private $container; |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | public function __construct(Container $container, $isPublicLink) |
| | { |
| | $this->isPublicLink = $isPublicLink; |
| | $this->container = $container; |
| | $this->BlockTypes['#'][0] = 'CustomHeader'; |
| | $this->InlineTypes['#'][] = 'TaskLink'; |
| | $this->InlineTypes['@'][] = 'UserLink'; |
| | $this->inlineMarkerList .= '#@'; |
| | } |
| |
|
| | protected function blockCustomHeader($Line) |
| | { |
| | if (preg_match('!#(\d+)!i', $Line['text'], $matches)) |
| | { |
| | $link = $this->buildTaskLink($matches[1]); |
| |
|
| | if (! empty($link)) { |
| | return [ |
| | 'extent' => strlen($matches[0]), |
| | 'element' => [ |
| | 'name' => 'a', |
| | 'text' => $matches[0], |
| | 'attributes' => ['href' => $link], |
| | ], |
| | ]; |
| | } |
| | } |
| |
|
| | return $this->blockHeader($Line); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | protected function inlineTaskLink(array $Excerpt) |
| | { |
| | if (preg_match('!#(\d+)!i', $Excerpt['text'], $matches)) { |
| | $link = $this->buildTaskLink($matches[1]); |
| |
|
| | if (! empty($link)) { |
| | return array( |
| | 'extent' => strlen($matches[0]), |
| | 'element' => array( |
| | 'name' => 'a', |
| | 'text' => $matches[0], |
| | 'attributes' => array('href' => $link), |
| | ), |
| | ); |
| | } |
| | } |
| |
|
| | return null; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | protected function inlineUserLink(array $Excerpt) |
| | { |
| | if (! $this->isPublicLink && preg_match('/^@([^\s,!:?]+)/', $Excerpt['text'], $matches)) { |
| | $username = rtrim($matches[1], '.'); |
| | $user = $this->container['userCacheDecorator']->getByUsername($username); |
| |
|
| | if (! empty($user)) { |
| | $url = $this->container['helper']->url->to('UserViewController', 'profile', array('user_id' => $user['id'])); |
| | $name = $user['name'] ?: $user['username']; |
| |
|
| | return array( |
| | 'extent' => strlen($username) + 1, |
| | 'element' => array( |
| | 'name' => 'a', |
| | 'text' => '@' . $username, |
| | 'attributes' => array( |
| | 'href' => $url, |
| | 'class' => 'user-mention-link', |
| | 'title' => $name, |
| | 'aria-label' => $name, |
| | ), |
| | ), |
| | ); |
| | } |
| | } |
| |
|
| | return null; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | private function buildTaskLink($task_id) |
| | { |
| | if ($this->isPublicLink) { |
| | $token = $this->container['memoryCache']->proxy($this->container['taskFinderModel'], 'getProjectToken', $task_id); |
| |
|
| | if (! empty($token)) { |
| | return $this->container['helper']->url->to( |
| | 'TaskViewController', |
| | 'readonly', |
| | array( |
| | 'token' => $token, |
| | 'task_id' => $task_id, |
| | ), |
| | '', |
| | true |
| | ); |
| | } |
| |
|
| | return ''; |
| | } |
| |
|
| | return $this->container['helper']->url->to( |
| | 'TaskViewController', |
| | 'show', |
| | array('task_id' => $task_id) |
| | ); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | protected function inlineLink($Excerpt) |
| | { |
| | $Inline = parent::inlineLink($Excerpt); |
| | if (is_array($Inline)) { |
| | array_push($Inline['element']['nonNestables'], 'TaskLink', 'UserLink'); |
| | } |
| | return $Inline; |
| | } |
| | } |
| |
|