diff --git a/ChangeLog b/ChangeLog index d576db53d..a32f238e3 100644 --- a/ChangeLog +++ b/ChangeLog @@ -35,6 +35,7 @@ Features + The configuration file now supports JSON encoding of Unicode characters, by specifying \uNNNN. + Now requires libuuid (thanks to Martin Natano). + + New '_get' is a DOM accessor helper command. Bugs + #1196 Now builds on Hurd (thanks to Jakub Wilk). diff --git a/NEWS b/NEWS index 1d0aaca4f..4a3d7e324 100644 --- a/NEWS +++ b/NEWS @@ -7,6 +7,7 @@ New Features in taskwarrior 2.3.0 - Italian translation. - UDA fields now allow default values. - Now requires libuuid. + - New '_get' DOM accessor helper command. New commands in taskwarrior 2.3.0 diff --git a/doc/man/task.1.in b/doc/man/task.1.in index 890937554..feedb78dc 100644 --- a/doc/man/task.1.in +++ b/doc/man/task.1.in @@ -533,6 +533,24 @@ Shows the IDs and descriptions of matching tasks. .B task _zshuuids Shows the UUIDs and descriptions of matching tasks. +.TP +.B task _get [ ...] +Accesses and displays the DOM reference(s). Used to extract individual values +from tasks, or the system. Supported DOM references are: + + rc. + context.program + context.args + context.width + context.height + system.version + system.os + . + . + +Note that the 'rc.' reference may need to be escaped using '--' to prevent +the reference from being interpreted as an override. + .SH ATTRIBUTES AND METADATA .TP diff --git a/src/DOM.cpp b/src/DOM.cpp index e971b70cf..c6f8396a3 100644 --- a/src/DOM.cpp +++ b/src/DOM.cpp @@ -91,8 +91,8 @@ const std::string DOM::get (const std::string& name) { if (name == "context.program") return context.a3[0]._raw; else if (name == "context.args") return context.a3.combine (); - else if (name == "context.width") return format (context.terminal_width); - else if (name == "context.height") return format (context.terminal_height); + else if (name == "context.width") return format (context.terminal_width ? context.terminal_width : context.getWidth ()); + else if (name == "context.height") return format (context.terminal_height ? context.terminal_height : context.getHeight ()); else throw format (STRING_DOM_UNREC, name); } @@ -185,7 +185,7 @@ const std::string DOM::get (const std::string& name, const Task& task) // if (name == "id") return format (task.id); - else if (name == "urgency") return format (task.urgency_c (), 4, 3); + else if (name == "urgency") return format (task.urgency_c ()); else if (A3::is_attribute (name, canonical)) return task.get (canonical); // . @@ -203,7 +203,7 @@ const std::string DOM::get (const std::string& name, const Task& task) n.getUntilEOS (attr); if (attr == "id") return format (ref.id); - else if (attr == "urgency") return format (ref.urgency_c (), 4, 3); + else if (attr == "urgency") return format (ref.urgency_c ()); else if (A3::is_attribute (attr, canonical)) return ref.get (canonical); } } diff --git a/src/commands/CMakeLists.txt b/src/commands/CMakeLists.txt index 451e0724d..6bed6a52e 100644 --- a/src/commands/CMakeLists.txt +++ b/src/commands/CMakeLists.txt @@ -26,6 +26,7 @@ set (commands_SRCS Command.cpp Command.h CmdEdit.cpp CmdEdit.h CmdExec.cpp CmdExec.h CmdExport.cpp CmdExport.h + CmdGet.cpp CmdGet.h CmdHelp.cpp CmdHelp.h CmdHistory.cpp CmdHistory.h CmdIDs.cpp CmdIDs.h diff --git a/src/commands/CmdGet.cpp b/src/commands/CmdGet.cpp new file mode 100644 index 000000000..662734754 --- /dev/null +++ b/src/commands/CmdGet.cpp @@ -0,0 +1,69 @@ +//////////////////////////////////////////////////////////////////////////////// +// taskwarrior - a command line task list manager. +// +// Copyright 2006-2013, Paul Beckingham, Federico Hernandez. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +// +// http://www.opensource.org/licenses/mit-license.php +// +//////////////////////////////////////////////////////////////////////////////// + +#include +#include +#include +#include +#include +#include + +extern Context context; + +//////////////////////////////////////////////////////////////////////////////// +CmdGet::CmdGet () +{ + _keyword = "_get"; + _usage = "task _get [ ...]"; + _description = STRING_CMD_GET_USAGE; + _read_only = true; + _displays_id = false; +} + +//////////////////////////////////////////////////////////////////////////////// +int CmdGet::execute (std::string& output) +{ + // Obtain the arguments from the description. That way, things like '--' + // have already been handled. + std::vector words = context.a3.extract_words (); + if (words.size () == 0) + throw std::string ("Need args!"); + + std::vector results; + std::vector ::iterator word; + for (word = words.begin (); word != words.end (); ++word) + { + Task t; + results.push_back (context.dom.get (*word, t)); + } + + join (output, " ", results); + output += "\n"; + return 0; +} + +//////////////////////////////////////////////////////////////////////////////// diff --git a/src/commands/CmdGet.h b/src/commands/CmdGet.h new file mode 100644 index 000000000..15793429f --- /dev/null +++ b/src/commands/CmdGet.h @@ -0,0 +1,42 @@ +//////////////////////////////////////////////////////////////////////////////// +// taskwarrior - a command line task list manager. +// +// Copyright 2006-2013, Paul Beckingham, Federico Hernandez. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +// +// http://www.opensource.org/licenses/mit-license.php +// +//////////////////////////////////////////////////////////////////////////////// + +#ifndef INCLUDED_CMDGET +#define INCLUDED_CMDGET + +#include +#include + +class CmdGet : public Command +{ +public: + CmdGet (); + int execute (std::string&); +}; + +#endif +//////////////////////////////////////////////////////////////////////////////// diff --git a/src/commands/Command.cpp b/src/commands/Command.cpp index 0cc07d0e0..a713691b8 100644 --- a/src/commands/Command.cpp +++ b/src/commands/Command.cpp @@ -60,6 +60,7 @@ #include #endif #include +#include #include #include #include @@ -131,6 +132,7 @@ void Command::factory (std::map & all) c = new CmdExec (); all[c->keyword ()] = c; #endif c = new CmdExport (); all[c->keyword ()] = c; + c = new CmdGet (); all[c->keyword ()] = c; c = new CmdGHistoryMonthly (); all[c->keyword ()] = c; c = new CmdGHistoryAnnual (); all[c->keyword ()] = c; c = new CmdHelp (); all[c->keyword ()] = c; diff --git a/src/en-US.h b/src/en-US.h index 71ddd5f34..9160b11f9 100644 --- a/src/en-US.h +++ b/src/en-US.h @@ -307,6 +307,7 @@ #define STRING_CMD_SUMMARY_COMPLETE "Complete" #define STRING_CMD_SUMMARY_NONE "(none)" #define STRING_CMD_COUNT_USAGE "Counts matching tasks" +#define STRING_CMD_GET_USAGE "DOM Accessor" #define STRING_CMD_UDAS_NO "No UDAs defined." #define STRING_CMD_UDAS_SUMMARY "{1} UDA defined" diff --git a/src/es-ES.h b/src/es-ES.h index b0a34f08b..d0bce9ea7 100644 --- a/src/es-ES.h +++ b/src/es-ES.h @@ -316,6 +316,7 @@ #define STRING_CMD_SUMMARY_COMPLETE "Completas" #define STRING_CMD_SUMMARY_NONE "(ninguna)" #define STRING_CMD_COUNT_USAGE "Cuenta tareas que coinciden" +#define STRING_CMD_GET_USAGE "DOM Accessor" #define STRING_CMD_UDAS_NO "NingĂșn UDA definido." #define STRING_CMD_UDAS_SUMMARY "{1} UDA definido" diff --git a/src/fr-FR.h b/src/fr-FR.h index e895d4a7b..2fd96f2cf 100644 --- a/src/fr-FR.h +++ b/src/fr-FR.h @@ -307,6 +307,7 @@ #define STRING_CMD_SUMMARY_COMPLETE "Complete" #define STRING_CMD_SUMMARY_NONE "(none)" #define STRING_CMD_COUNT_USAGE "Counts matching tasks" +#define STRING_CMD_GET_USAGE "DOM Accessor" #define STRING_CMD_UDAS_NO "No UDAs defined." #define STRING_CMD_UDAS_SUMMARY "{1} UDA defined" diff --git a/src/it-IT.h b/src/it-IT.h index a51f24b2a..fb27b778e 100644 --- a/src/it-IT.h +++ b/src/it-IT.h @@ -308,6 +308,7 @@ #define STRING_CMD_SUMMARY_COMPLETE "Completi" #define STRING_CMD_SUMMARY_NONE "(nessuno)" #define STRING_CMD_COUNT_USAGE "Conteggia task corrispondenti" +#define STRING_CMD_GET_USAGE "DOM Accessor" #define STRING_CMD_UDAS_NO "Nessun UDA definito." #define STRING_CMD_UDAS_SUMMARY "{1} UDA definito"