- Implemented simple word substitution aliases. This is not the ultimate form
  which will involve the ability to insert arbitrary constructs.  Later.
This commit is contained in:
Paul Beckingham 2014-06-03 00:10:15 -04:00
parent a470e50ee6
commit 1cd09bc87b
7 changed files with 42 additions and 41 deletions

View file

@ -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 <std::string, std::string>::iterator match = context.aliases.find (raw);
if (match != context.aliases.end ())
std::map <std::string, std::string>::iterator a;
if ((*i)->_branches.size ())
{
something = true;
std::vector <std::string> words;
Lexer::word_split (words, context.aliases[raw]);
std::vector <std::string>::iterator word;
for (word = words.begin (); word != words.end (); ++word)
std::vector <Tree*>::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;
}
}
}

View file

@ -39,7 +39,7 @@ public:
void load ();
void resolve (Tree*);
private:
public:
std::map <std::string, std::string> _aliases;
};

View file

@ -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 <std::string> vars;
config.all (vars);
std::vector <std::string>::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,

View file

@ -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 <std::string, std::string> aliases;
Alias aliases2;
Alias alias;
Hooks hooks;
DOM dom;

View file

@ -52,7 +52,7 @@ int CmdCompletionAliases::execute (std::string& output)
std::vector <std::string> aliases;
std::map <std::string, std::string>::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.

View file

@ -97,8 +97,8 @@ int CmdHelp::execute (std::string& output)
view.set (row, 1, " ");
std::map <std::string, std::string>::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 ();

View file

@ -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;