- New '_get' is a DOM accessor helper command.
This commit is contained in:
Paul Beckingham 2013-08-25 23:35:32 -07:00
parent b09d928da9
commit 166723e632
12 changed files with 142 additions and 4 deletions

View file

@ -35,6 +35,7 @@ Features
+ The configuration file now supports JSON encoding of Unicode characters, by + The configuration file now supports JSON encoding of Unicode characters, by
specifying \uNNNN. specifying \uNNNN.
+ Now requires libuuid (thanks to Martin Natano). + Now requires libuuid (thanks to Martin Natano).
+ New '_get' is a DOM accessor helper command.
Bugs Bugs
+ #1196 Now builds on Hurd (thanks to Jakub Wilk). + #1196 Now builds on Hurd (thanks to Jakub Wilk).

1
NEWS
View file

@ -7,6 +7,7 @@ New Features in taskwarrior 2.3.0
- Italian translation. - Italian translation.
- UDA fields now allow default values. - UDA fields now allow default values.
- Now requires libuuid. - Now requires libuuid.
- New '_get' DOM accessor helper command.
New commands in taskwarrior 2.3.0 New commands in taskwarrior 2.3.0

View file

@ -533,6 +533,24 @@ Shows the IDs and descriptions of matching tasks.
.B task <filter> _zshuuids .B task <filter> _zshuuids
Shows the UUIDs and descriptions of matching tasks. Shows the UUIDs and descriptions of matching tasks.
.TP
.B task _get <DOM> [<DOM> ...]
Accesses and displays the DOM reference(s). Used to extract individual values
from tasks, or the system. Supported DOM references are:
rc.<name>
context.program
context.args
context.width
context.height
system.version
system.os
<id>.<attribute>
<uuid>.<attribute>
Note that the 'rc.<name>' reference may need to be escaped using '--' to prevent
the reference from being interpreted as an override.
.SH ATTRIBUTES AND METADATA .SH ATTRIBUTES AND METADATA
.TP .TP

View file

@ -91,8 +91,8 @@ const std::string DOM::get (const std::string& name)
{ {
if (name == "context.program") return context.a3[0]._raw; if (name == "context.program") return context.a3[0]._raw;
else if (name == "context.args") return context.a3.combine (); else if (name == "context.args") return context.a3.combine ();
else if (name == "context.width") return format (context.terminal_width); 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); else if (name == "context.height") return format (context.terminal_height ? context.terminal_height : context.getHeight ());
else throw format (STRING_DOM_UNREC, name); else throw format (STRING_DOM_UNREC, name);
} }
@ -185,7 +185,7 @@ const std::string DOM::get (const std::string& name, const Task& task)
// <attr> // <attr>
if (name == "id") return format (task.id); 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); else if (A3::is_attribute (name, canonical)) return task.get (canonical);
// <id>.<name> // <id>.<name>
@ -203,7 +203,7 @@ const std::string DOM::get (const std::string& name, const Task& task)
n.getUntilEOS (attr); n.getUntilEOS (attr);
if (attr == "id") return format (ref.id); 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); else if (A3::is_attribute (attr, canonical)) return ref.get (canonical);
} }
} }

View file

@ -26,6 +26,7 @@ set (commands_SRCS Command.cpp Command.h
CmdEdit.cpp CmdEdit.h CmdEdit.cpp CmdEdit.h
CmdExec.cpp CmdExec.h CmdExec.cpp CmdExec.h
CmdExport.cpp CmdExport.h CmdExport.cpp CmdExport.h
CmdGet.cpp CmdGet.h
CmdHelp.cpp CmdHelp.h CmdHelp.cpp CmdHelp.h
CmdHistory.cpp CmdHistory.h CmdHistory.cpp CmdHistory.h
CmdIDs.cpp CmdIDs.h CmdIDs.cpp CmdIDs.h

69
src/commands/CmdGet.cpp Normal file
View file

@ -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 <cmake.h>
#include <Context.h>
#include <main.h>
#include <text.h>
#include <i18n.h>
#include <CmdGet.h>
extern Context context;
////////////////////////////////////////////////////////////////////////////////
CmdGet::CmdGet ()
{
_keyword = "_get";
_usage = "task _get <DOM> [<DOM> ...]";
_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 <std::string> words = context.a3.extract_words ();
if (words.size () == 0)
throw std::string ("Need args!");
std::vector <std::string> results;
std::vector <std::string>::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;
}
////////////////////////////////////////////////////////////////////////////////

42
src/commands/CmdGet.h Normal file
View file

@ -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 <string>
#include <Command.h>
class CmdGet : public Command
{
public:
CmdGet ();
int execute (std::string&);
};
#endif
////////////////////////////////////////////////////////////////////////////////

View file

@ -60,6 +60,7 @@
#include <CmdExec.h> #include <CmdExec.h>
#endif #endif
#include <CmdExport.h> #include <CmdExport.h>
#include <CmdGet.h>
#include <CmdHelp.h> #include <CmdHelp.h>
#include <CmdHistory.h> #include <CmdHistory.h>
#include <CmdIDs.h> #include <CmdIDs.h>
@ -131,6 +132,7 @@ void Command::factory (std::map <std::string, Command*>& all)
c = new CmdExec (); all[c->keyword ()] = c; c = new CmdExec (); all[c->keyword ()] = c;
#endif #endif
c = new CmdExport (); all[c->keyword ()] = c; c = new CmdExport (); all[c->keyword ()] = c;
c = new CmdGet (); all[c->keyword ()] = c;
c = new CmdGHistoryMonthly (); all[c->keyword ()] = c; c = new CmdGHistoryMonthly (); all[c->keyword ()] = c;
c = new CmdGHistoryAnnual (); all[c->keyword ()] = c; c = new CmdGHistoryAnnual (); all[c->keyword ()] = c;
c = new CmdHelp (); all[c->keyword ()] = c; c = new CmdHelp (); all[c->keyword ()] = c;

View file

@ -307,6 +307,7 @@
#define STRING_CMD_SUMMARY_COMPLETE "Complete" #define STRING_CMD_SUMMARY_COMPLETE "Complete"
#define STRING_CMD_SUMMARY_NONE "(none)" #define STRING_CMD_SUMMARY_NONE "(none)"
#define STRING_CMD_COUNT_USAGE "Counts matching tasks" #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_NO "No UDAs defined."
#define STRING_CMD_UDAS_SUMMARY "{1} UDA defined" #define STRING_CMD_UDAS_SUMMARY "{1} UDA defined"

View file

@ -316,6 +316,7 @@
#define STRING_CMD_SUMMARY_COMPLETE "Completas" #define STRING_CMD_SUMMARY_COMPLETE "Completas"
#define STRING_CMD_SUMMARY_NONE "(ninguna)" #define STRING_CMD_SUMMARY_NONE "(ninguna)"
#define STRING_CMD_COUNT_USAGE "Cuenta tareas que coinciden" #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_NO "Ningún UDA definido."
#define STRING_CMD_UDAS_SUMMARY "{1} UDA definido" #define STRING_CMD_UDAS_SUMMARY "{1} UDA definido"

View file

@ -307,6 +307,7 @@
#define STRING_CMD_SUMMARY_COMPLETE "Complete" #define STRING_CMD_SUMMARY_COMPLETE "Complete"
#define STRING_CMD_SUMMARY_NONE "(none)" #define STRING_CMD_SUMMARY_NONE "(none)"
#define STRING_CMD_COUNT_USAGE "Counts matching tasks" #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_NO "No UDAs defined."
#define STRING_CMD_UDAS_SUMMARY "{1} UDA defined" #define STRING_CMD_UDAS_SUMMARY "{1} UDA defined"

View file

@ -308,6 +308,7 @@
#define STRING_CMD_SUMMARY_COMPLETE "Completi" #define STRING_CMD_SUMMARY_COMPLETE "Completi"
#define STRING_CMD_SUMMARY_NONE "(nessuno)" #define STRING_CMD_SUMMARY_NONE "(nessuno)"
#define STRING_CMD_COUNT_USAGE "Conteggia task corrispondenti" #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_NO "Nessun UDA definito."
#define STRING_CMD_UDAS_SUMMARY "{1} UDA definito" #define STRING_CMD_UDAS_SUMMARY "{1} UDA definito"