From b97f55c1e563089ed454744a9bf8850c31ec3416 Mon Sep 17 00:00:00 2001 From: Josh Leder <josh@ha.cr> Date: Thu, 11 Jul 2013 20:04:20 -0600 Subject: [PATCH] parse task list in createTasksFromText --- nag/lib/Nag.php | 87 +++++++++++++++++++++++++++++++++++++++++++++++++------ 1 files changed, 78 insertions(+), 9 deletions(-) diff --git a/nag/lib/Nag.php b/nag/lib/Nag.php index 28a8ee8..078d8ca 100644 --- a/nag/lib/Nag.php +++ b/nag/lib/Nag.php @@ -329,6 +329,8 @@ class Nag * imported. If 'null', the user's default * tasklist will be used. * + * @throws Horde_Exception_PermissionDenied + * @throws Nag_Exception * @return array The UIDs of all tasks that were added. */ static public function createTasksFromText($text, $tasklist = null) @@ -339,17 +341,25 @@ class Nag throw new Horde_Exception_PermissionDenied(); } - $storage = $GLOBALS['injector'] + $defaultStorage = $GLOBALS['injector'] ->getInstance('Nag_Factory_Driver') ->create($tasklist); + $listStorage = array($tasklist => $defaultStorage); + + $listNames = self::listTasklists(false, Horde_Perms::EDIT); + array_walk($listNames, function(&$share) { + $share = $share->get("name"); + }); + $dateParser = Horde_Date_Parser::factory( array('locale' => $GLOBALS['prefs']->getValue('language')) ); $quickParser = new Nag_QuickParser(); - $tasks = $quickParser->parse($text); + $parsedTasks = $quickParser->parse($text); - $uids = array(); - foreach ($tasks as &$task) { + // prepare task data + $addTasks = array(); + foreach ($parsedTasks as &$task) { if (!is_array($task)) { $name = $task; $task = array($name); @@ -375,13 +385,72 @@ class Nag $tags = ''; } - if (isset($task['parent'])) { - $newTask = $storage->add(array('name' => $name, 'due' => $due, 'parent' => $tasks[$task['parent']]['id'], 'tags' => $tags)); - } else { - $newTask = $storage->add(array('name' => $name, 'due' => $due, 'tags' => $tags)); + // Look for an explicit task list prefix + $list = $tasklist; + if (preg_match('/^(.+?)\s*:\s*/', $name, $prefix)) { + $strip = '/' . preg_quote($prefix[0], '/') . '/'; + $name = preg_replace($strip, '', $name, 1); + + $possibleLists = array(); + foreach ($listNames as $id => $listName) { + if (stristr($listName, trim($prefix[1])) !== false) + $possibleLists[] = $id; + } + + if (empty($possibleLists)) { + throw new Nag_Exception(sprintf( + _("No list named like '%s'"), $prefix[1])); + } + elseif (count($possibleLists) > 1) { + Horde::log('Matched ' . count($possibleLists) . + " task lists for '$prefix[1]'", Horde_Log::WARN); + } + + $list = array_shift($possibleLists); + + // cache storage object + if (!isset($listStorage[$list])) { + $listStorage[$list] = $GLOBALS['injector'] + ->getInstance('Nag_Factory_Driver') + ->create($list); + } + } + + $task['tasklist'] = $list; + $addTasks[] = array( + 'name' => $name, + 'due' => $due, + 'tags' => $tags, + 'parent'=> isset($task['parent']) ? $task['parent'] : null + ); + } + + // do the actual adding + $uids = array(); + foreach ($addTasks as $index => &$taskData) { + /** @var Nag_Driver $storage */ + // the storage driver for each tasklist has already been loaded + $storage = $listStorage[$parsedTasks[$index]['tasklist']]; + + // find parent task id + if (!is_null($taskData['parent'])) { + $parentIndex = $taskData['parent']; + $taskData['parent'] = $taskData[$parentIndex]['id']; + // children have the same task list as their parent + $storage = $listStorage[$parsedTasks[$parentIndex]['tasklist']]; + } + else { + unset($taskData['parent']); + } + + if (!isset($storage)) { + throw new Nag_Exception(_("Invalid task list")); } + + $newTask = $storage->add($taskData); + $uids[] = $newTask[1]; - $task['id'] = $newTask[0]; + $taskData['id'] = $newTask[0]; } return $uids; -- 1.7.7.5 (Apple Git-26)