00001 #ifndef menusystem_h 00002 #define menusystem_h 00003 00004 #include <list> 00005 #include "menu.h" 00006 00008 00009 class MenuSystem 00010 { 00011 private: 00012 class Node; 00013 00014 typedef std::list<Node*> node_list; 00015 typedef std::list<Node*>::iterator node_list_it; 00016 00017 std::string current_path; 00018 std::string current_subdir; 00019 00020 bool is_valid; 00021 bool is_sitemap; 00022 public: 00023 00024 typedef enum What 00025 { 00026 ITEM, 00027 MENU, 00028 MENUCLOSE, 00029 UNDEFINED 00030 }; 00031 00032 typedef struct Tag 00033 { 00034 Menu menu; 00035 Item item; 00036 MenuClose menuclose; 00037 00038 What what; 00039 00040 Tag() : what( UNDEFINED ) {} 00041 Tag( Menu menu ) : menu( menu ), what( MENU ) {} 00042 Tag( Item item ) : item( item ), what( ITEM ) {} 00043 Tag( MenuClose menuclose ): menuclose(menuclose), what( MENUCLOSE ) {} 00044 }; 00045 00046 typedef std::list<Tag> tag_list; 00047 typedef tag_list::iterator tag_list_it; 00048 00049 typedef struct Options 00050 { 00051 std::string position; 00052 std::string target; 00053 std::string root; 00054 bool is_local_system; 00055 bool is_block_quote; 00056 std::string nav_up; 00057 std::string nav_down; 00058 int indent_num; 00059 std::string indent_type; 00060 std::string highlight_type; 00061 std::string highlight_active_type; 00062 std::string highlight_menu_type; 00063 std::string highlight_active_menu_type; 00064 std::string blockquote_principe; 00065 std::string title_type; 00066 std::string title_menu_type; 00067 std::string title_highlight_type; 00068 std::string title_highlight_menu_type; 00069 bool override; 00070 }; 00071 00072 private: 00073 tag_list tlist; 00074 00075 Node *root; 00076 Node *root_bak; 00077 00078 node_list nodes; 00079 00080 Options options; 00081 00082 public: 00083 MenuSystem( tag_list tlist, Options options ); 00084 ~MenuSystem(); 00085 00086 bool operator!() const { return !is_valid; } 00087 00089 std::string get_html_menu(); 00090 00092 std::string get_sitemap(); 00093 00095 std::string get_link( std::string path, Options o ); 00096 00097 private: 00099 bool create_tree(); 00100 00102 std::string get_childs( Node *parent ); 00103 00105 bool is_in_position( std::string path ); 00106 00108 bool is_position( std::string path ); 00109 00111 int count_directories( std::string text ); 00112 00114 std::string create_item( Node *node, 00115 std::string highlight_type, 00116 std::string highlight_active_type, 00117 int indent_num, 00118 std::string indent_type ); 00119 00120 00122 std::string get_local_childs( std::string path ); 00123 00125 std::string get_root_dir( Node *node ); 00126 00127 std::string get_pre( Node *node ); 00128 std::string get_pre_forwards( Node *node ); 00129 std::string get_pre_backwards( Node *node ); 00130 00131 std::string get_post( Node *node ); 00132 std::string get_post_forwards( Node *node ); 00133 std::string get_post_backwards( Node *node ); 00134 00135 std::string get_href( Node *node ); 00136 00137 bool is_extern_link( std::string href ); 00138 bool is_local_link( std::string href ); 00139 00140 std::string get_highlight_type( Node* node ); 00141 std::string get_highlight_active_type( Node* node ); 00142 std::string get_highlight_menu_type( Node* node ); 00143 std::string get_highlight_active_menu_type( Node* node ); 00144 int get_indent_num( Node* node ); 00145 std::string get_indent_type( Node* node ); 00146 std::string get_blockquote_principe( Node* node ); 00147 std::string get_title_type( Node* node ); 00148 std::string get_title_menu_type( Node* node ); 00149 std::string get_title_highlight_type( Node* node ); 00150 std::string get_title_highlight_menu_type( Node* node ); 00151 std::string get_target( Node* node ); 00152 }; 00153 00154 #endif