From 1cd09bc87b9b250f6ab0e3e55ed011bd1903728b Mon Sep 17 00:00:00 2001 From: Paul Beckingham Date: Tue, 3 Jun 2014 00:10:15 -0400 Subject: [PATCH] Alias - Implemented simple word substitution aliases. This is not the ultimate form which will involve the ability to insert arbitrary constructs. Later. --- src/Alias.cpp | 36 +++++++++++++++++++++++------------- src/Alias.h | 2 +- src/Context.cpp | 19 ++----------------- src/Context.h | 4 +--- src/commands/CmdAliases.cpp | 2 +- src/commands/CmdHelp.cpp | 4 ++-- test/alias.t | 16 ++++++++++++---- 7 files changed, 42 insertions(+), 41 deletions(-) diff --git a/src/Alias.cpp b/src/Alias.cpp index 0f86e7f16..4bfdc4141 100644 --- a/src/Alias.cpp +++ b/src/Alias.cpp @@ -35,7 +35,7 @@ extern Context context; -// Alias expansion limit. Any more indicates some kind of error. +// Alias expansion limit. Any more indicates some kind of error. const int safetyValveDefault = 10; //////////////////////////////////////////////////////////////////////////////// @@ -64,6 +64,9 @@ void Alias::load () //////////////////////////////////////////////////////////////////////////////// // An alias must be a distinct word on the command line. +// +// TODO This is straight word substitution. What this really needs is node +// insertion, for more advanced aliases. void Alias::resolve (Tree* tree) { bool something; @@ -85,20 +88,27 @@ void Alias::resolve (Tree* tree) if (! (*i)->hasTag ("?")) continue; - std::string raw = (*i)->attribute ("raw"); - std::map ::iterator match = context.aliases.find (raw); - if (match != context.aliases.end ()) + std::map ::iterator a; + if ((*i)->_branches.size ()) { - something = true; - - std::vector words; - Lexer::word_split (words, context.aliases[raw]); - - std::vector ::iterator word; - for (word = words.begin (); word != words.end (); ++word) + std::vector ::iterator b; + for (b = (*i)->_branches.begin (); b != (*i)->_branches.end (); ++b) { - // TODO Insert branch (words) in place of (*i). - std::cout << "# alias word '" << *word << "'\n"; + a = _aliases.find ((*b)->attribute ("raw")); + if (a != _aliases.end ()) + { + (*b)->attribute ("raw", a->second); + something = true; + } + } + } + else + { + a = _aliases.find ((*i)->attribute ("raw")); + if (a != _aliases.end ()) + { + (*i)->attribute ("raw", a->second); + something = true; } } } diff --git a/src/Alias.h b/src/Alias.h index 757016e50..8fe2b387f 100644 --- a/src/Alias.h +++ b/src/Alias.h @@ -39,7 +39,7 @@ public: void load (); void resolve (Tree*); -private: +public: std::map _aliases; }; diff --git a/src/Context.cpp b/src/Context.cpp index e54359571..9d7028e28 100644 --- a/src/Context.cpp +++ b/src/Context.cpp @@ -145,9 +145,8 @@ int Context::initialize (int argc, const char** argv) createDefaultConfig (); // Handle Aliases. - loadAliases (); - aliases2.load (); - aliases2.resolve (parser.tree ()); + alias.load (); + alias.resolve (parser.tree ()); // Initialize the color rules, if necessary. if (color ()) @@ -669,20 +668,6 @@ void Context::createDefaultConfig () config.createDefaultData (data_dir); } -//////////////////////////////////////////////////////////////////////////////// -void Context::loadAliases () -{ - aliases.clear (); - - std::vector vars; - config.all (vars); - - std::vector ::iterator var; - for (var = vars.begin (); var != vars.end (); ++var) - if (var->substr (0, 6) == "alias.") - aliases[var->substr (6)] = config.get (*var); -} - //////////////////////////////////////////////////////////////////////////////// void Context::decomposeSortField ( const std::string& field, diff --git a/src/Context.h b/src/Context.h index c7e88738b..7f9c31501 100644 --- a/src/Context.h +++ b/src/Context.h @@ -77,7 +77,6 @@ private: void staticInitialization (); void assumeLocations (); void createDefaultConfig (); - void loadAliases (); void updateXtermTitle (); void updateVerbosity (); @@ -90,8 +89,7 @@ public: Config config; TDB2 tdb2; - std::map aliases; - Alias aliases2; + Alias alias; Hooks hooks; DOM dom; diff --git a/src/commands/CmdAliases.cpp b/src/commands/CmdAliases.cpp index 098e70762..52420bbd2 100644 --- a/src/commands/CmdAliases.cpp +++ b/src/commands/CmdAliases.cpp @@ -52,7 +52,7 @@ int CmdCompletionAliases::execute (std::string& output) std::vector aliases; std::map ::iterator it; - for (it = context.aliases.begin (); it != context.aliases.end (); ++it) + for (it = context.alias._aliases.begin (); it != context.alias._aliases.end (); ++it) aliases.push_back (it->first); // Sort alphabetically. diff --git a/src/commands/CmdHelp.cpp b/src/commands/CmdHelp.cpp index ae2b88a07..25fcc1213 100644 --- a/src/commands/CmdHelp.cpp +++ b/src/commands/CmdHelp.cpp @@ -97,8 +97,8 @@ int CmdHelp::execute (std::string& output) view.set (row, 1, " "); std::map ::iterator alias; - for (alias = context.aliases.begin (); - alias != context.aliases.end (); + for (alias = context.alias._aliases.begin (); + alias != context.alias._aliases.end (); ++alias) { row = view.addRow (); diff --git a/test/alias.t b/test/alias.t index 5229ed8c0..2f4d901db 100755 --- a/test/alias.t +++ b/test/alias.t @@ -27,7 +27,7 @@ use strict; use warnings; -use Test::More tests => 3; +use Test::More tests => 5; # Ensure environment has no influence. delete $ENV{'TASKDATA'}; @@ -38,22 +38,30 @@ if (open my $fh, '>', 'alias.rc') { print $fh "data.location=.\n", "alias.foo=_projects\n", - "alias.bar=foo\n"; + "alias.bar=foo\n", + "alias.baz=bar\n", + "alias.qux=baz\n"; close $fh; } -# Add a task with certain project, then access that task via aliases. +# Add a task with a certain project, then access that task via aliases. qx{../src/task rc:alias.rc add project:ALIAS foo 2>&1}; my $output = qx{../src/task rc:alias.rc _projects 2>&1}; like ($output, qr/ALIAS/, 'task _projects -> ALIAS'); -$output = qx{../src/task rc:alias.rc foo 2>&1}; +$output = qx{../src/task rc:alias.rc qux 2>&1}; like ($output, qr/ALIAS/, 'task foo -> _projects -> ALIAS'); $output = qx{../src/task rc:alias.rc bar 2>&1}; like ($output, qr/ALIAS/, 'task bar -> foo -> _projects -> ALIAS'); +$output = qx{../src/task rc:alias.rc baz 2>&1}; +like ($output, qr/ALIAS/, 'task baz -> bar -> foo -> _projects -> ALIAS'); + +$output = qx{../src/task rc:alias.rc qux 2>&1}; +like ($output, qr/ALIAS/, 'task qux -> baz -> bar -> foo -> _projects -> ALIAS'); + # Cleanup. unlink qw(pending.data completed.data undo.data backlog.data alias.rc); exit 0;