improvements to the help command, including outputting detailed descriptions
This commit is contained in:
		@@ -10,6 +10,9 @@ namespace cellar {
 | 
			
		||||
    namespace help {
 | 
			
		||||
        extern void set_description(string,string);
 | 
			
		||||
        extern string get_description(string);
 | 
			
		||||
        
 | 
			
		||||
        extern void set_details(string,string);
 | 
			
		||||
        extern string get_details(string);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -5,6 +5,7 @@
 | 
			
		||||
#include "internal/bottles.hpp"
 | 
			
		||||
#include "commands.hpp"
 | 
			
		||||
#include "dll.hpp"
 | 
			
		||||
#include "help.hpp"
 | 
			
		||||
 | 
			
		||||
using namespace std;
 | 
			
		||||
using namespace cellar::bottles;
 | 
			
		||||
@@ -14,6 +15,7 @@ DLL_PUBLIC map<string, CommandFunction> cellar::commands::bottles_commands() {
 | 
			
		||||
    map<string, CommandFunction> result;
 | 
			
		||||
    /*[[[cog
 | 
			
		||||
         import cog
 | 
			
		||||
         import os
 | 
			
		||||
 | 
			
		||||
         with open("src/bottles/commands.txt") as commandfile:
 | 
			
		||||
            for line in commandfile:
 | 
			
		||||
@@ -30,6 +32,17 @@ DLL_PUBLIC map<string, CommandFunction> cellar::commands::bottles_commands() {
 | 
			
		||||
                             .replace("\"", "\\\"")
 | 
			
		||||
                             .replace("\\", "\\\\")))
 | 
			
		||||
                             # the replace methods escape " and \ characters
 | 
			
		||||
                else:
 | 
			
		||||
                    print("-- No description is available for the {0} command.".format(name))
 | 
			
		||||
 | 
			
		||||
                if os.path.exists("src/bottles/help/" + name):
 | 
			
		||||
                    cog.out("cellar::help::set_details(\"{0}\", R\"(".format(name))
 | 
			
		||||
                    with open("src/bottles/help/" + name) as detailsfile:
 | 
			
		||||
                        for detail in detailsfile:
 | 
			
		||||
                            cog.out(detail)
 | 
			
		||||
                    cog.out(")\");")
 | 
			
		||||
                else:
 | 
			
		||||
                    print("-- No details are available for the {0} command.".format(name))
 | 
			
		||||
      ]]]*/
 | 
			
		||||
    //[[[end]]]
 | 
			
		||||
    return result;
 | 
			
		||||
 
 | 
			
		||||
@@ -25,6 +25,7 @@ map<string, CommandFunction> cellar::commands::core_commands() {
 | 
			
		||||
    map<string, CommandFunction> result;
 | 
			
		||||
    /*[[[cog
 | 
			
		||||
         import cog
 | 
			
		||||
         import os.path
 | 
			
		||||
 | 
			
		||||
         with open("src/commands.txt") as commandfile:
 | 
			
		||||
            for line in commandfile:
 | 
			
		||||
@@ -41,6 +42,17 @@ map<string, CommandFunction> cellar::commands::core_commands() {
 | 
			
		||||
                             .replace("\"", "\\\"")
 | 
			
		||||
                             .replace("\\", "\\\\")))
 | 
			
		||||
                             # the replace methods escape " and \ characters
 | 
			
		||||
                else:
 | 
			
		||||
                    print("-- No description is available for the {0} command.".format(name))
 | 
			
		||||
 | 
			
		||||
                if os.path.exists("src/help/" + name):
 | 
			
		||||
                    cog.out("cellar::help::set_details(\"{0}\", R\"(".format(name))
 | 
			
		||||
                    with open("src/help/" + name) as detailsfile:
 | 
			
		||||
                        for detail in detailsfile:
 | 
			
		||||
                            cog.out(detail)
 | 
			
		||||
                    cog.out(")\");")
 | 
			
		||||
                else:
 | 
			
		||||
                    print("-- No details are available for the {0} command.".format(name))
 | 
			
		||||
      ]]]*/
 | 
			
		||||
    //[[[end]]]
 | 
			
		||||
    return result;
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										26
									
								
								src/help/details.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								src/help/details.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,26 @@
 | 
			
		||||
#include <map>
 | 
			
		||||
#include <string>
 | 
			
		||||
 | 
			
		||||
#include "help.hpp"
 | 
			
		||||
 | 
			
		||||
map<string,string> details_map;
 | 
			
		||||
 | 
			
		||||
void cellar::help::set_details(string command, string details) {
 | 
			
		||||
    if (details.empty()) {
 | 
			
		||||
        if (details_map.find(command) == details_map.end()) { // not found
 | 
			
		||||
            return; // no details no cry
 | 
			
		||||
        } else {
 | 
			
		||||
            details_map.erase(command);
 | 
			
		||||
        }
 | 
			
		||||
    } else { // setting details
 | 
			
		||||
        details_map[command] = details;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
string cellar::help::get_details(string command) {
 | 
			
		||||
    if (details_map.find(command) == details_map.end()) { // not found
 | 
			
		||||
        return "";
 | 
			
		||||
    } else {
 | 
			
		||||
        return details_map.at(command);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -3,6 +3,8 @@
 | 
			
		||||
#include <string>
 | 
			
		||||
#include <vector>
 | 
			
		||||
 | 
			
		||||
#include <boost/algorithm/string.hpp>
 | 
			
		||||
 | 
			
		||||
#include "cellar.hpp"
 | 
			
		||||
#include "internal/core.hpp"
 | 
			
		||||
#include "help.hpp"
 | 
			
		||||
@@ -17,16 +19,41 @@ void cellar::commands::help_command(int argc, vector<string> argv) {
 | 
			
		||||
 | 
			
		||||
    cout << endl; // TODO: cellar::output function for code clarity
 | 
			
		||||
 | 
			
		||||
    output::statement("You have these commands:");
 | 
			
		||||
    stringstream sstr;
 | 
			
		||||
    for (string command : commands) {
 | 
			
		||||
        sstr << "\t" << command;
 | 
			
		||||
    if (argc == 1) {
 | 
			
		||||
        output::statement("You have these commands:");
 | 
			
		||||
        stringstream sstr;
 | 
			
		||||
        for (string command : commands) {
 | 
			
		||||
            sstr << "\t" << command;
 | 
			
		||||
            
 | 
			
		||||
            string desc = help::get_description(command);
 | 
			
		||||
            if (!desc.empty()) {
 | 
			
		||||
                sstr << " - " << desc;
 | 
			
		||||
            }
 | 
			
		||||
            output::statement(sstr.str());
 | 
			
		||||
            sstr.str("");
 | 
			
		||||
        }
 | 
			
		||||
    } else {
 | 
			
		||||
        string command = argv[1];
 | 
			
		||||
        stringstream sstr;
 | 
			
		||||
        sstr << "cellar " << command << " - ";
 | 
			
		||||
 | 
			
		||||
        string desc = help::get_description(command);
 | 
			
		||||
        if (!desc.empty()) {
 | 
			
		||||
            sstr << " - " << desc;
 | 
			
		||||
        }
 | 
			
		||||
        if (desc.empty()) { sstr << "no description is available."; }
 | 
			
		||||
        else { sstr << desc; }
 | 
			
		||||
        output::statement(sstr.str());
 | 
			
		||||
        sstr.str("");
 | 
			
		||||
 | 
			
		||||
        cout << endl;
 | 
			
		||||
 | 
			
		||||
        string details = help::get_details(command);
 | 
			
		||||
        if (details.empty()) { output::statement("no details available."); }
 | 
			
		||||
        else {
 | 
			
		||||
            vector<string> detaillines;
 | 
			
		||||
            boost::split(detaillines, details, boost::is_any_of("\n"));
 | 
			
		||||
 | 
			
		||||
            for (string line : detaillines) { 
 | 
			
		||||
                if (!line.empty()) { output::statement(line); }
 | 
			
		||||
                else { cout << endl; }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										1
									
								
								src/help/version
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								src/help/version
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
			
		||||
No, really, that's all it does.
 | 
			
		||||
@@ -5,6 +5,7 @@
 | 
			
		||||
#include "internal/launch.hpp"
 | 
			
		||||
#include "commands.hpp"
 | 
			
		||||
#include "dll.hpp"
 | 
			
		||||
#include "help.hpp"
 | 
			
		||||
 | 
			
		||||
using namespace std;
 | 
			
		||||
using namespace cellar::launch;
 | 
			
		||||
@@ -14,6 +15,7 @@ DLL_PUBLIC map<string, CommandFunction> cellar::commands::launch_commands() {
 | 
			
		||||
    map<string, CommandFunction> result;
 | 
			
		||||
    /*[[[cog
 | 
			
		||||
         import cog
 | 
			
		||||
         import os
 | 
			
		||||
 | 
			
		||||
         with open("src/launch/commands.txt") as commandfile:
 | 
			
		||||
            for line in commandfile:
 | 
			
		||||
@@ -30,6 +32,17 @@ DLL_PUBLIC map<string, CommandFunction> cellar::commands::launch_commands() {
 | 
			
		||||
                             .replace("\"", "\\\"")
 | 
			
		||||
                             .replace("\\", "\\\\")))
 | 
			
		||||
                             # the replace methods escape " and \ characters
 | 
			
		||||
                else:
 | 
			
		||||
                    print("-- No description is available for the {0} command.".format(name))
 | 
			
		||||
 | 
			
		||||
                if os.path.exists("src/launch/help/" + name):
 | 
			
		||||
                    cog.out("cellar::help::set_details(\"{0}\", R\"(".format(name))
 | 
			
		||||
                    with open("src/launch/help/" + name) as detailsfile:
 | 
			
		||||
                        for detail in detailsfile:
 | 
			
		||||
                            cog.out(detail)
 | 
			
		||||
                    cog.out(")\");")
 | 
			
		||||
                else:
 | 
			
		||||
                    print("-- No details are available for the {0} command.".format(name))
 | 
			
		||||
      ]]]*/
 | 
			
		||||
    //[[[end]]]
 | 
			
		||||
    return result;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,3 +1,3 @@
 | 
			
		||||
launch launch_command
 | 
			
		||||
winecfg launch_winecfg
 | 
			
		||||
regedit launch_regedit
 | 
			
		||||
launch launch_command Launch a program in WINE.
 | 
			
		||||
winecfg launch_winecfg Launch winecfg.
 | 
			
		||||
regedit launch_regedit Launch regedit.
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										1
									
								
								src/launch/help/regedit
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								src/launch/help/regedit
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
			
		||||
This is an alias for "cellar launch regedit".
 | 
			
		||||
							
								
								
									
										1
									
								
								src/launch/help/winecfg
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								src/launch/help/winecfg
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
			
		||||
This is an alias for "cellar launch winecfg".
 | 
			
		||||
		Reference in New Issue
	
	Block a user