use DateTimeZone;
use Exception;
use Katzgrau\KLogger\Logger;
+use Psr\Http\Message\UploadedFileInterface;
use Psr\Log\LogLevel;
use Shaarli\Bookmark\Bookmark;
use Shaarli\Bookmark\BookmarkServiceInterface;
/**
* Utilities to import and export bookmarks using the Netscape format
- * TODO: Not static, use a container.
*/
class NetscapeBookmarkUtils
{
+ /** @var BookmarkServiceInterface */
+ protected $bookmarkService;
+
+ /** @var ConfigManager */
+ protected $conf;
+
+ /** @var History */
+ protected $history;
+
+ public function __construct(BookmarkServiceInterface $bookmarkService, ConfigManager $conf, History $history)
+ {
+ $this->bookmarkService = $bookmarkService;
+ $this->conf = $conf;
+ $this->history = $history;
+ }
/**
* Filters bookmarks and adds Netscape-formatted fields
* - timestamp link addition date, using the Unix epoch format
* - taglist comma-separated tag list
*
- * @param BookmarkServiceInterface $bookmarkService Link datastore
* @param BookmarkFormatter $formatter instance
* @param string $selection Which bookmarks to export: (all|private|public)
* @param bool $prependNoteUrl Prepend note permalinks with the server's URL
* @param string $indexUrl Absolute URL of the Shaarli index page
*
* @return array The bookmarks to be exported, with additional fields
- *@throws Exception Invalid export selection
*
+ * @throws Exception Invalid export selection
*/
- public static function filterAndFormat(
- $bookmarkService,
+ public function filterAndFormat(
$formatter,
$selection,
$prependNoteUrl,
$indexUrl
) {
// see tpl/export.html for possible values
- if (!in_array($selection, array('all', 'public', 'private'))) {
+ if (!in_array($selection, ['all', 'public', 'private'])) {
throw new Exception(t('Invalid export selection:') . ' "' . $selection . '"');
}
- $bookmarkLinks = array();
- foreach ($bookmarkService->search([], $selection) as $bookmark) {
+ $bookmarkLinks = [];
+ foreach ($this->bookmarkService->search([], $selection) as $bookmark) {
$link = $formatter->format($bookmark);
$link['taglist'] = implode(',', $bookmark->getTags());
if ($bookmark->isNote() && $prependNoteUrl) {
- $link['url'] = $indexUrl . $link['url'];
+ $link['url'] = rtrim($indexUrl, '/') . '/' . ltrim($link['url'], '/');
}
$bookmarkLinks[] = $link;
return $bookmarkLinks;
}
- /**
- * Generates an import status summary
- *
- * @param string $filename name of the file to import
- * @param int $filesize size of the file to import
- * @param int $importCount how many bookmarks were imported
- * @param int $overwriteCount how many bookmarks were overwritten
- * @param int $skipCount how many bookmarks were skipped
- * @param int $duration how many seconds did the import take
- *
- * @return string Summary of the bookmark import status
- */
- private static function importStatus(
- $filename,
- $filesize,
- $importCount = 0,
- $overwriteCount = 0,
- $skipCount = 0,
- $duration = 0
- ) {
- $status = sprintf(t('File %s (%d bytes) '), $filename, $filesize);
- if ($importCount == 0 && $overwriteCount == 0 && $skipCount == 0) {
- $status .= t('has an unknown file format. Nothing was imported.');
- } else {
- $status .= vsprintf(
- t(
- 'was successfully processed in %d seconds: '
- . '%d bookmarks imported, %d bookmarks overwritten, %d bookmarks skipped.'
- ),
- [$duration, $importCount, $overwriteCount, $skipCount]
- );
- }
- return $status;
- }
-
/**
* Imports Web bookmarks from an uploaded Netscape bookmark dump
*
- * @param array $post Server $_POST parameters
- * @param array $files Server $_FILES parameters
- * @param BookmarkServiceInterface $bookmarkService Loaded LinkDB instance
- * @param ConfigManager $conf instance
- * @param History $history History instance
+ * @param array $post Server $_POST parameters
+ * @param UploadedFileInterface $file File in PSR-7 object format
*
* @return string Summary of the bookmark import status
*/
- public static function import($post, $files, $bookmarkService, $conf, $history)
+ public function import($post, UploadedFileInterface $file)
{
$start = time();
- $filename = $files['filetoupload']['name'];
- $filesize = $files['filetoupload']['size'];
- $data = file_get_contents($files['filetoupload']['tmp_name']);
+ $filename = $file->getClientFilename();
+ $filesize = $file->getSize();
+ $data = (string) $file->getStream();
if (preg_match('/<!DOCTYPE NETSCAPE-Bookmark-file-1>/i', $data) === 0) {
- return self::importStatus($filename, $filesize);
+ return $this->importStatus($filename, $filesize);
}
// Overwrite existing bookmarks?
// Add tags to all imported bookmarks?
if (empty($post['default_tags'])) {
- $defaultTags = array();
+ $defaultTags = [];
} else {
- $defaultTags = preg_split(
- '/[\s,]+/',
- escape($post['default_tags'])
+ $defaultTags = tags_str2array(
+ escape($post['default_tags']),
+ $this->conf->get('general.tags_separator', ' ')
);
}
true, // nested tag support
$defaultTags, // additional user-specified tags
strval(1 - $defaultPrivacy), // defaultPub = 1 - defaultPrivacy
- $conf->get('resource.data_dir') // log path, will be overridden
+ $this->conf->get('resource.data_dir') // log path, will be overridden
);
$logger = new Logger(
- $conf->get('resource.data_dir'),
- !$conf->get('dev.debug') ? LogLevel::INFO : LogLevel::DEBUG,
+ $this->conf->get('resource.data_dir'),
+ !$this->conf->get('dev.debug') ? LogLevel::INFO : LogLevel::DEBUG,
[
'prefix' => 'import.',
'extension' => 'log',
$private = 0;
}
- $link = $bookmarkService->findByUrl($bkm['uri']);
+ $link = $this->bookmarkService->findByUrl($bkm['uri']);
$existingLink = $link !== null;
if (! $existingLink) {
$link = new Bookmark();
}
$link->setTitle($bkm['title']);
- $link->setUrl($bkm['uri'], $conf->get('security.allowed_protocols'));
+ $link->setUrl($bkm['uri'], $this->conf->get('security.allowed_protocols'));
$link->setDescription($bkm['note']);
$link->setPrivate($private);
- $link->setTagsString($bkm['tags']);
+ $link->setTags($bkm['tags']);
- $bookmarkService->addOrSet($link, false);
+ $this->bookmarkService->addOrSet($link, false);
$importCount++;
}
- $bookmarkService->save();
- $history->importLinks();
+ $this->bookmarkService->save();
+ $this->history->importLinks();
$duration = time() - $start;
- return self::importStatus(
+
+ return $this->importStatus(
$filename,
$filesize,
$importCount,
$duration
);
}
+
+ /**
+ * Generates an import status summary
+ *
+ * @param string $filename name of the file to import
+ * @param int $filesize size of the file to import
+ * @param int $importCount how many bookmarks were imported
+ * @param int $overwriteCount how many bookmarks were overwritten
+ * @param int $skipCount how many bookmarks were skipped
+ * @param int $duration how many seconds did the import take
+ *
+ * @return string Summary of the bookmark import status
+ */
+ protected function importStatus(
+ $filename,
+ $filesize,
+ $importCount = 0,
+ $overwriteCount = 0,
+ $skipCount = 0,
+ $duration = 0
+ ) {
+ $status = sprintf(t('File %s (%d bytes) '), $filename, $filesize);
+ if ($importCount == 0 && $overwriteCount == 0 && $skipCount == 0) {
+ $status .= t('has an unknown file format. Nothing was imported.');
+ } else {
+ $status .= vsprintf(
+ t(
+ 'was successfully processed in %d seconds: '
+ . '%d bookmarks imported, %d bookmarks overwritten, %d bookmarks skipped.'
+ ),
+ [$duration, $importCount, $overwriteCount, $skipCount]
+ );
+ }
+ return $status;
+ }
}