summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog1
-rw-r--r--app/ExternalLink/FileLink.php26
-rw-r--r--app/ExternalLink/FileLinkProvider.php74
-rw-r--r--app/ServiceProvider/ExternalLinkProvider.php2
-rw-r--r--tests/units/ExternalLink/FileLinkProviderTest.php43
-rw-r--r--tests/units/ExternalLink/FileLinkTest.php28
6 files changed, 174 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index 02f4b889..ed777dfe 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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());
+ }
+}