diff options
-rw-r--r-- | ChangeLog | 1 | ||||
-rw-r--r-- | app/ExternalLink/FileLink.php | 26 | ||||
-rw-r--r-- | app/ExternalLink/FileLinkProvider.php | 74 | ||||
-rw-r--r-- | app/ServiceProvider/ExternalLinkProvider.php | 2 | ||||
-rw-r--r-- | tests/units/ExternalLink/FileLinkProviderTest.php | 43 | ||||
-rw-r--r-- | tests/units/ExternalLink/FileLinkTest.php | 28 |
6 files changed, 174 insertions, 0 deletions
@@ -3,6 +3,7 @@ Version 1.0.27 (unreleased) Improvements: +* Added local file link provider * Show configuration in settings page * Added "?" to display list of keyboard shortcuts * Added new keyboard shortcuts for task view diff --git a/app/ExternalLink/FileLink.php b/app/ExternalLink/FileLink.php new file mode 100644 index 00000000..ea13ece8 --- /dev/null +++ b/app/ExternalLink/FileLink.php @@ -0,0 +1,26 @@ +<?php + +namespace Kanboard\ExternalLink; + +use Kanboard\Core\ExternalLink\ExternalLinkInterface; + +/** + * File Link + * + * @package externalLink + * @author Frederic Guillot + */ +class FileLink extends BaseLink implements ExternalLinkInterface +{ + /** + * Get link title + * + * @access public + * @return string + */ + public function getTitle() + { + $path = parse_url($this->url, PHP_URL_PATH); + return basename(str_replace('\\', '/', $path)); + } +} diff --git a/app/ExternalLink/FileLinkProvider.php b/app/ExternalLink/FileLinkProvider.php new file mode 100644 index 00000000..901f78f8 --- /dev/null +++ b/app/ExternalLink/FileLinkProvider.php @@ -0,0 +1,74 @@ +<?php + +namespace Kanboard\ExternalLink; + +use Kanboard\Core\ExternalLink\ExternalLinkProviderInterface; + +/** + * File Link Provider + * + * @package externalLink + * @author Frederic Guillot + */ +class FileLinkProvider extends BaseLinkProvider implements ExternalLinkProviderInterface +{ + /** + * Get provider name + * + * @access public + * @return string + */ + public function getName() + { + return t('Local File'); + } + + /** + * Get link type + * + * @access public + * @return string + */ + public function getType() + { + return 'file'; + } + + /** + * Get a dictionary of supported dependency types by the provider + * + * @access public + * @return array + */ + public function getDependencies() + { + return array( + 'related' => t('Related'), + ); + } + + /** + * Return true if the provider can parse correctly the user input + * + * @access public + * @return boolean + */ + public function match() + { + return strpos($this->userInput, 'file://') === 0; + } + + /** + * Get the link found with the properties + * + * @access public + * @return \Kanboard\Core\ExternalLink\ExternalLinkInterface + */ + public function getLink() + { + $link = new FileLink($this->container); + $link->setUrl($this->userInput); + + return $link; + } +} diff --git a/app/ServiceProvider/ExternalLinkProvider.php b/app/ServiceProvider/ExternalLinkProvider.php index c4bbc4cf..8b71ec81 100644 --- a/app/ServiceProvider/ExternalLinkProvider.php +++ b/app/ServiceProvider/ExternalLinkProvider.php @@ -7,6 +7,7 @@ use Pimple\ServiceProviderInterface; use Kanboard\Core\ExternalLink\ExternalLinkManager; use Kanboard\ExternalLink\WebLinkProvider; use Kanboard\ExternalLink\AttachmentLinkProvider; +use Kanboard\ExternalLink\FileLinkProvider; /** * External Link Provider @@ -28,6 +29,7 @@ class ExternalLinkProvider implements ServiceProviderInterface $container['externalLinkManager'] = new ExternalLinkManager($container); $container['externalLinkManager']->register(new WebLinkProvider($container)); $container['externalLinkManager']->register(new AttachmentLinkProvider($container)); + $container['externalLinkManager']->register(new FileLinkProvider($container)); return $container; } diff --git a/tests/units/ExternalLink/FileLinkProviderTest.php b/tests/units/ExternalLink/FileLinkProviderTest.php new file mode 100644 index 00000000..8cef82f8 --- /dev/null +++ b/tests/units/ExternalLink/FileLinkProviderTest.php @@ -0,0 +1,43 @@ +<?php + +require_once __DIR__.'/../Base.php'; + +use Kanboard\ExternalLink\FileLinkProvider; + +class FileLinkProviderTest extends Base +{ + public function testGetName() + { + $attachmentLinkProvider = new FileLinkProvider($this->container); + $this->assertEquals('Local File', $attachmentLinkProvider->getName()); + } + + public function testGetType() + { + $attachmentLinkProvider = new FileLinkProvider($this->container); + $this->assertEquals('file', $attachmentLinkProvider->getType()); + } + + public function testGetDependencies() + { + $attachmentLinkProvider = new FileLinkProvider($this->container); + $this->assertEquals(array('related' => 'Related'), $attachmentLinkProvider->getDependencies()); + } + + public function testMatch() + { + $attachmentLinkProvider = new FileLinkProvider($this->container); + + $attachmentLinkProvider->setUserTextInput('file:///tmp/test.txt'); + $this->assertTrue($attachmentLinkProvider->match()); + + $attachmentLinkProvider->setUserTextInput(''); + $this->assertFalse($attachmentLinkProvider->match()); + } + + public function testGetLink() + { + $attachmentLinkProvider = new FileLinkProvider($this->container); + $this->assertInstanceOf('\Kanboard\ExternalLink\FileLink', $attachmentLinkProvider->getLink()); + } +} diff --git a/tests/units/ExternalLink/FileLinkTest.php b/tests/units/ExternalLink/FileLinkTest.php new file mode 100644 index 00000000..b83000cd --- /dev/null +++ b/tests/units/ExternalLink/FileLinkTest.php @@ -0,0 +1,28 @@ +<?php + +require_once __DIR__.'/../Base.php'; + +use Kanboard\ExternalLink\FileLink; + +class FileLinkTest extends Base +{ + public function testGetTitleFromUrlWithUnixPath() + { + $url = 'file:///tmp/test.txt'; + + $link = new FileLink($this->container); + $link->setUrl($url); + $this->assertEquals($url, $link->getUrl()); + $this->assertEquals('test.txt', $link->getTitle()); + } + + public function testGetTitleFromUrlWithWindowsPath() + { + $url = 'file:///c:\temp\test.txt'; + + $link = new FileLink($this->container); + $link->setUrl($url); + $this->assertEquals($url, $link->getUrl()); + $this->assertEquals('test.txt', $link->getTitle()); + } +} |