improvements to the help command, including outputting detailed descriptions
This commit is contained in:
		@@ -10,6 +10,9 @@ namespace cellar {
 | 
				
			|||||||
    namespace help {
 | 
					    namespace help {
 | 
				
			||||||
        extern void set_description(string,string);
 | 
					        extern void set_description(string,string);
 | 
				
			||||||
        extern string get_description(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 "internal/bottles.hpp"
 | 
				
			||||||
#include "commands.hpp"
 | 
					#include "commands.hpp"
 | 
				
			||||||
#include "dll.hpp"
 | 
					#include "dll.hpp"
 | 
				
			||||||
 | 
					#include "help.hpp"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
using namespace std;
 | 
					using namespace std;
 | 
				
			||||||
using namespace cellar::bottles;
 | 
					using namespace cellar::bottles;
 | 
				
			||||||
@@ -14,6 +15,7 @@ DLL_PUBLIC map<string, CommandFunction> cellar::commands::bottles_commands() {
 | 
				
			|||||||
    map<string, CommandFunction> result;
 | 
					    map<string, CommandFunction> result;
 | 
				
			||||||
    /*[[[cog
 | 
					    /*[[[cog
 | 
				
			||||||
         import cog
 | 
					         import cog
 | 
				
			||||||
 | 
					         import os
 | 
				
			||||||
 | 
					
 | 
				
			||||||
         with open("src/bottles/commands.txt") as commandfile:
 | 
					         with open("src/bottles/commands.txt") as commandfile:
 | 
				
			||||||
            for line in commandfile:
 | 
					            for line in commandfile:
 | 
				
			||||||
@@ -30,6 +32,17 @@ DLL_PUBLIC map<string, CommandFunction> cellar::commands::bottles_commands() {
 | 
				
			|||||||
                             .replace("\"", "\\\"")
 | 
					                             .replace("\"", "\\\"")
 | 
				
			||||||
                             .replace("\\", "\\\\")))
 | 
					                             .replace("\\", "\\\\")))
 | 
				
			||||||
                             # the replace methods escape " and \ characters
 | 
					                             # 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]]]
 | 
					    //[[[end]]]
 | 
				
			||||||
    return result;
 | 
					    return result;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -25,6 +25,7 @@ map<string, CommandFunction> cellar::commands::core_commands() {
 | 
				
			|||||||
    map<string, CommandFunction> result;
 | 
					    map<string, CommandFunction> result;
 | 
				
			||||||
    /*[[[cog
 | 
					    /*[[[cog
 | 
				
			||||||
         import cog
 | 
					         import cog
 | 
				
			||||||
 | 
					         import os.path
 | 
				
			||||||
 | 
					
 | 
				
			||||||
         with open("src/commands.txt") as commandfile:
 | 
					         with open("src/commands.txt") as commandfile:
 | 
				
			||||||
            for line in commandfile:
 | 
					            for line in commandfile:
 | 
				
			||||||
@@ -41,6 +42,17 @@ map<string, CommandFunction> cellar::commands::core_commands() {
 | 
				
			|||||||
                             .replace("\"", "\\\"")
 | 
					                             .replace("\"", "\\\"")
 | 
				
			||||||
                             .replace("\\", "\\\\")))
 | 
					                             .replace("\\", "\\\\")))
 | 
				
			||||||
                             # the replace methods escape " and \ characters
 | 
					                             # 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]]]
 | 
					    //[[[end]]]
 | 
				
			||||||
    return result;
 | 
					    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 <string>
 | 
				
			||||||
#include <vector>
 | 
					#include <vector>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <boost/algorithm/string.hpp>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "cellar.hpp"
 | 
					#include "cellar.hpp"
 | 
				
			||||||
#include "internal/core.hpp"
 | 
					#include "internal/core.hpp"
 | 
				
			||||||
#include "help.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
 | 
					    cout << endl; // TODO: cellar::output function for code clarity
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    output::statement("You have these commands:");
 | 
					    if (argc == 1) {
 | 
				
			||||||
    stringstream sstr;
 | 
					        output::statement("You have these commands:");
 | 
				
			||||||
    for (string command : commands) {
 | 
					        stringstream sstr;
 | 
				
			||||||
        sstr << "\t" << command;
 | 
					        for (string command : commands) {
 | 
				
			||||||
        
 | 
					            sstr << "\t" << command;
 | 
				
			||||||
        string desc = help::get_description(command);
 | 
					            
 | 
				
			||||||
        if (!desc.empty()) {
 | 
					            string desc = help::get_description(command);
 | 
				
			||||||
            sstr << " - " << desc;
 | 
					            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 << "no description is available."; }
 | 
				
			||||||
 | 
					        else { sstr << desc; }
 | 
				
			||||||
        output::statement(sstr.str());
 | 
					        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 "internal/launch.hpp"
 | 
				
			||||||
#include "commands.hpp"
 | 
					#include "commands.hpp"
 | 
				
			||||||
#include "dll.hpp"
 | 
					#include "dll.hpp"
 | 
				
			||||||
 | 
					#include "help.hpp"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
using namespace std;
 | 
					using namespace std;
 | 
				
			||||||
using namespace cellar::launch;
 | 
					using namespace cellar::launch;
 | 
				
			||||||
@@ -14,6 +15,7 @@ DLL_PUBLIC map<string, CommandFunction> cellar::commands::launch_commands() {
 | 
				
			|||||||
    map<string, CommandFunction> result;
 | 
					    map<string, CommandFunction> result;
 | 
				
			||||||
    /*[[[cog
 | 
					    /*[[[cog
 | 
				
			||||||
         import cog
 | 
					         import cog
 | 
				
			||||||
 | 
					         import os
 | 
				
			||||||
 | 
					
 | 
				
			||||||
         with open("src/launch/commands.txt") as commandfile:
 | 
					         with open("src/launch/commands.txt") as commandfile:
 | 
				
			||||||
            for line in commandfile:
 | 
					            for line in commandfile:
 | 
				
			||||||
@@ -30,6 +32,17 @@ DLL_PUBLIC map<string, CommandFunction> cellar::commands::launch_commands() {
 | 
				
			|||||||
                             .replace("\"", "\\\"")
 | 
					                             .replace("\"", "\\\"")
 | 
				
			||||||
                             .replace("\\", "\\\\")))
 | 
					                             .replace("\\", "\\\\")))
 | 
				
			||||||
                             # the replace methods escape " and \ characters
 | 
					                             # 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]]]
 | 
					    //[[[end]]]
 | 
				
			||||||
    return result;
 | 
					    return result;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,3 +1,3 @@
 | 
				
			|||||||
launch launch_command
 | 
					launch launch_command Launch a program in WINE.
 | 
				
			||||||
winecfg launch_winecfg
 | 
					winecfg launch_winecfg Launch winecfg.
 | 
				
			||||||
regedit launch_regedit
 | 
					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