Class Webgen::Tag::Menu
In: lib/webgen/tag/menu.rb
Parent: Object
Error RenderError CommandNotFoundError LoadError NodeCreationError ::Rake::TaskLib WebgenTask Node Context\n[lib/webgen/context.rb\nlib/webgen/context/nodes.rb\nlib/webgen/context/render.rb\nlib/webgen/context/tags.rb] Tree FileSystem Sitemap Feed Copy Virtual Sitemap Directory Page Fragment Template Memory Metainfo Coderay Sitemap IncludeFile BreadcrumbTrail Langbar TikZ Menu Tags Fragments Resource Website Tidy Head Less Kramdown Xmllint Blocks Helpers Configuration Comparable Language Path StandardError CmdParse::CommandParser CommandParser CmdParse::Command RunCommand CreateCommand WebguiCommand ApplyCommand WebsiteAccess Main Loggable OutputPathHelpers ExecuteCommand Link Date Relocatable Metainfo ::Kramdown::Converter::Html KramdownHtmlConverter Cache Blackboard WebsiteManager Logger Page ProxyNode Utils Scss RDoc Sass Erb RDiscount Erubis Haml Maruku Builder RedCloth AccessHash TarArchive Stacked FileSystem lib/webgen/cache.rb lib/webgen/error.rb lib/webgen/languages.rb lib/webgen/website.rb lib/webgen/blackboard.rb lib/webgen/tree.rb lib/webgen/websitemanager.rb lib/webgen/logger.rb lib/webgen/context/tags.rb lib/webgen/configuration.rb lib/webgen/path.rb lib/webgen/webgentask.rb lib/webgen/page.rb lib/webgen/node.rb lib/webgen/cli/run_command.rb lib/webgen/cli/utils.rb lib/webgen/cli/apply_command.rb lib/webgen/cli/webgui_command.rb lib/webgen/cli.rb lib/webgen/cli/create_command.rb Color CLI ClassMethods WebsiteAccess LanguageManager lib/webgen/output/filesystem.rb Output lib/webgen/common/sitemap.rb Common lib/webgen/sourcehandler/metainfo.rb lib/webgen/sourcehandler/memory.rb lib/webgen/sourcehandler/copy.rb lib/webgen/sourcehandler/directory.rb lib/webgen/sourcehandler.rb lib/webgen/sourcehandler/page.rb lib/webgen/sourcehandler/template.rb lib/webgen/sourcehandler/fragment.rb lib/webgen/sourcehandler/sitemap.rb lib/webgen/sourcehandler/virtual.rb lib/webgen/sourcehandler/feed.rb OutputPathHelpers Base SourceHandler lib/webgen/tag/coderay.rb lib/webgen/tag/relocatable.rb lib/webgen/tag/menu.rb lib/webgen/tag/langbar.rb lib/webgen/tag/executecommand.rb lib/webgen/tag/breadcrumbtrail.rb lib/webgen/tag/metainfo.rb lib/webgen/tag/link.rb lib/webgen/tag/includefile.rb lib/webgen/tag/date.rb lib/webgen/tag/tikz.rb lib/webgen/tag/sitemap.rb Base Tag lib/webgen/contentprocessor/less.rb lib/webgen/contentprocessor/scss.rb lib/webgen/contentprocessor/blocks.rb lib/webgen/contentprocessor/rdoc.rb lib/webgen/contentprocessor/sass.rb lib/webgen/contentprocessor/erb.rb lib/webgen/contentprocessor/rdiscount.rb lib/webgen/contentprocessor/tags.rb lib/webgen/contentprocessor/erubis.rb lib/webgen/contentprocessor/kramdown/html.rb lib/webgen/contentprocessor/haml.rb lib/webgen/contentprocessor/maruku.rb lib/webgen/contentprocessor/xmllint.rb lib/webgen/contentprocessor/kramdown.rb lib/webgen/contentprocessor/head.rb lib/webgen/contentprocessor/builder.rb lib/webgen/contentprocessor/tidy.rb lib/webgen/contentprocessor/redcloth.rb lib/webgen/contentprocessor/fragments.rb lib/webgen/contentprocessor.rb ContentProcessor lib/webgen/source/tararchive.rb lib/webgen/source/stacked.rb lib/webgen/source/resource.rb lib/webgen/source/filesystem.rb Source Loggable Webgen dot/m_81_0.png

Generates a menu that can be configured extensively.

Methods

Included Modules

Webgen::WebsiteAccess Base

Classes and Modules

Class Webgen::Tag::Menu::MenuNode

Public Instance methods

Generate the menu.

[Source]

    # File lib/webgen/tag/menu.rb, line 57
57:     def call(tag, body, context)
58:       tree = specific_menu_tree_for(context.content_node)
59: 
60:       (context.dest_node.node_info[:tag_menu_menus] ||= {})[[@params.to_a.sort, context.content_node.alcn]] = (tree ? tree.to_lcn_list : nil)
61: 
62:       if !tree || tree.children.empty?
63:         ''
64:       elsif param('tag.menu.nested')
65:         create_output_nested(context, tree)
66:       else
67:         create_output_not_nested(context, tree)
68:       end
69:     end

Protected Instance methods

Build a menu tree for content_node from the tree menu_node.

[Source]

     # File lib/webgen/tag/menu.rb, line 108
108:     def build_specific_menu_tree(content_node, menu_node, level = 1)
109:       if menu_node.nil? \
110:         || level > param('tag.menu.max_levels') + param('tag.menu.start_level') - 1 \
111:         || ((level > param('tag.menu.min_levels') + param('tag.menu.start_level') - 1) \
112:              && (menu_node.node.level >= content_node.level \
113:                   || (param('tag.menu.show_current_subtree_only') && !content_node.in_subtree_of?(menu_node.node))
114:                  )
115:             ) \
116:         || (level == param('tag.menu.start_level') && !content_node.in_subtree_of?(menu_node.node))
117:         return nil
118:       end
119: 
120:       sub_menu_tree = MenuNode.new(nil, menu_node.node)
121:       menu_tree = MenuNode.new(nil, menu_node.node)
122:       menu_node.children.each do |child|
123:         next if param('tag.menu.used_nodes') == 'files' && !child.is_in_tree_of_files?
124:         menu_tree.children << (this_node = MenuNode.new(menu_tree, child.node))
125:         sub_node = child.children.length > 0 ? build_specific_menu_tree(content_node, child, level + 1) : nil
126:         sub_node.children.each {|n| this_node.children << n; sub_menu_tree.children << n} if sub_node
127:       end
128: 
129:       if level < param('tag.menu.start_level')
130:         sub_menu_tree
131:       else
132:         menu_tree
133:       end
134:     end

Create and return a menu tree if at least one node is in the menu or nil otherwise.

[Source]

     # File lib/webgen/tag/menu.rb, line 191
191:     def create_menu_tree(node, parent, lang)
192:       menu_node = MenuNode.new(parent, node)
193: 
194:       node.children.select do |child|
195:         child.lang == lang || child.lang.nil? || child.is_directory?
196:       end.each do |child|
197:         sub_node = create_menu_tree(child, menu_node, lang)
198:         menu_node.children << sub_node unless sub_node.nil?
199:       end
200:       menu_node.is_in_tree_of_files = (!node.is_fragment? && node['in_menu']) || menu_node.children.any? {|c| c.is_in_tree_of_files?}
201: 
202:       menu_node.children.empty? ? (node['in_menu'] ? menu_node : nil) : menu_node
203:     end

Create the nested HTML menu of the tree using the provided context.

[Source]

     # File lib/webgen/tag/menu.rb, line 137
137:     def create_output_nested(context, tree, level = 1)
138:       out = "<ul>"
139:       tree.children.each do |child|
140:         menu = child.children.length > 0 ? create_output_nested(context, child, level + 1) : ''
141:         style, link = menu_item_details(context.dest_node, child.node, context.content_node.lang, level)
142: 
143:         out << "<li #{style}>#{link}"
144:         out << menu
145:         out << "</li>"
146:       end
147:       out << "</ul>"
148:       out
149:     end

Create the not nested HTML menu of the tree using the provided context.

[Source]

     # File lib/webgen/tag/menu.rb, line 152
152:     def create_output_not_nested(context, tree, level = 1)
153:       submenu = ''
154:       out = "<ul>"
155:       tree.children.each do |child|
156:         submenu << (child.children.length > 0 ? create_output_not_nested(context, child, level + 1) : '')
157:         style, link = menu_item_details(context.dest_node, child.node, context.content_node.lang, level)
158: 
159:         out << "<li #{style}>#{link}</li>"
160:       end
161:       out << "</ul>"
162:       out << submenu
163:       out
164:     end

Return style information (node is selected, …) and a link from dest_node to node.

[Source]

     # File lib/webgen/tag/menu.rb, line 167
167:     def menu_item_details(dest_node, node, lang, level)
168:       styles = ['webgen-menu-level' + level.to_s]
169:       styles << 'webgen-menu-submenu' if node.is_directory? || (node.is_fragment? && node.children.length > 0)
170:       styles << 'webgen-menu-submenu-inhierarchy' if (node.is_directory? || (node.is_fragment? && node.children.length > 0)) &&
171:         dest_node.in_subtree_of?(node)
172:       styles << 'webgen-menu-item-selected' if node == dest_node
173:       style = "class=\"#{styles.join(' ')}\"" if styles.length > 0
174: 
175:       link = dest_node.link_to(node, :lang => lang)
176: 
177:       [style, link]
178:     end

Return the menu tree for the language lang.

[Source]

     # File lib/webgen/tag/menu.rb, line 181
181:     def menu_tree_for_lang(lang, root)
182:       menus = (website.cache.volatile[:menutrees] ||= {})
183:       unless menus[lang]
184:         menus[lang] = create_menu_tree(root, nil, lang)
185:         menus[lang].sort! if menus[lang]
186:       end
187:       menus[lang]
188:     end

Check if the menus for node have changed.

[Source]

    # File lib/webgen/tag/menu.rb, line 76
76:     def node_changed?(node)
77:       return if !node.node_info[:tag_menu_menus]
78: 
79:       node.node_info[:tag_menu_menus].each do |(params, cn_alcn), cached_tree|
80:         cn = node.tree[cn_alcn]
81:         menu_tree = menu_tree_for_lang(cn.lang, cn.tree.root)
82: 
83:         set_params(params.to_hash)
84:         tree = build_specific_menu_tree(cn, menu_tree)
85:         tree_list = tree.to_lcn_list if tree
86:         set_params({})
87: 
88:         if (tree.nil? && !cached_tree.nil?) || (tree_list && tree_list != cached_tree) ||
89:             (tree_list && tree_list.flatten.any? do |alcn|
90:                (n = node.tree[alcn]) && (r = n.routing_node(cn.lang)) && r != node && r.meta_info_changed?
91:              end)
92:           node.flag(:dirty)
93:           break
94:         end
95:       end
96:     end

Wrapper method for returning the specific menu tree for content_node.

[Source]

     # File lib/webgen/tag/menu.rb, line 99
 99:     def specific_menu_tree_for(content_node)
100:       tree = menu_tree_for_lang(content_node.lang, content_node.tree.root)
101:       if param('tag.menu.used_nodes') == 'fragments'
102:         @params['tag.menu.start_level'] = param('tag.menu.start_level') + content_node.level
103:       end
104:       build_specific_menu_tree(content_node, tree)
105:     end

[Validate]