in _plugins/site_structure.rb [203:386]
def gen_structure(site, item, parent, breadcrumb_pages_in, breadcrumb_paths_in, structure_processed_pages)
puts "gen_structure #{item} from #{parent ? parent.path : 'root'} (#{breadcrumb_paths_in})" if @@verbose
breadcrumb_pages = breadcrumb_pages_in.dup
breadcrumb_paths = breadcrumb_paths_in.dup
if (item.is_a? String)
item = { 'path' => item }
end
if (item['path'])
puts "looking for #{item['path']} under parent #{parent ? parent.path : 'root'}" if @@verbose
page = find_page_with_path_absolute_or_relative_to(site, render_liquid_with_page(site, parent, item['path']), parent, structure_processed_pages)
return nil unless page
if (item.length==1 && !page['menu_processed'])
puts "setting up #{item} from #{page.path} as original" if @@verbose
data = page.data
result = page
else
puts "setting up #{item} from #{page.path} as copy" if @@verbose
unless page['menu_processed']
puts "making copy of #{page.path}" if @@verbose
page = gen_structure(site, "/"+page.path, parent, breadcrumb_pages_in, breadcrumb_paths_in, structure_processed_pages)
puts "copy is #{page.path}" if @@verbose
end
data = page.data.dup
data['data'] = data
result = data
end
if page['check_directory_for_children'] == true
$childPages = PageStructureUtils::ChildPage.parseChildYAMLFromParent(page)
for $childPage in $childPages
if $childPage.yaml() != nil && $childPage.yaml() != false
if data['children'] == nil
data['children'] = []
end
data['children'] << $childPage.yaml()
end
end
end
if data['children']
data['children'] = PageStructureUtils::ChildPage.sortYAMLSectionPositions(data['children'])
end
data['path'] = page.path
if item['href_path']
puts "finding from href #{item['href_path']}" if @@verbose
href_page = find_page_with_path_absolute_or_relative_to(site, render_liquid_with_page(site, page, item['href_path']), parent, structure_processed_pages)
else
href_page = page
end
data['url'] = href_page.url
data['final_url'] = relative_url( data['url'] )
puts "data is #{data}" if @@verbose
data['page'] = page
breadcrumb_pages << page
breadcrumb_paths << page.path
elsif (item['section'])
puts "setting up #{item} as section" if @@verbose
section = item['section']
section_cleaned = section.gsub(%r{[^A-Za-z0-9]+}, "-").downcase;
section_cleaned.slice!(1) if section_cleaned.start_with?("-")
section_cleaned.chomp!("-")
link = (parent ? parent.url : "") + '#' + section_cleaned
data = { 'link' => link, 'url' => link, 'final_url' => relative_url(link), 'section' => section_cleaned, 'section_title' => section }
data['title'] = item['title'] if item['title']
data['title'] = section unless data['title']
data['data'] = data
result = data
elsif (item['link'])
puts "setting up #{item} as link" if @@verbose
link = render_liquid_with_page(site, parent, item['link'])
data = { 'link' => link, 'url' => link, 'final_url' => relative_url(link), 'external' => true }
data['title'] = item['title'] if item['title']
breadcrumb_pages << data
breadcrumb_paths << data['link']
data['data'] = data
result = data
else
raise "Link to #{item} in #{parent ? parent.path : nil} must have path or section or link"
end
data['menu_customization'] = {}.merge(data['menu_customization'] || {}).merge(item['menu_customization'] || {})
data['breadcrumb_pages'] ||= breadcrumb_pages
data['breadcrumb_paths'] ||= breadcrumb_paths
data['menu_parent'] ||= parent
data['title_in_menu'] = render_liquid_with_page(site, parent, item['title_in_menu'] || item['title'] || data['title_in_menu'] || data['title'])
data['title'] ||= data['title_in_menu']
return result if data['menu']
data['menu_path'] = page.path if page
if data['menu_proxy_for']
menu_proxy_for = gen_structure(site, { 'path' => data['menu_proxy_for'], 'no_copy' => "because breadcrumbs won't be right" }, page, [], [], structure_processed_pages)
raise "missing menu_proxy_for #{data['menu_proxy_for']} in #{page.path}" unless menu_proxy_for
data['menu_path'] = menu_proxy_for['path']
data.merge!(menu_proxy_for.select {|key, value| ['breadcrumb_paths', 'breadcrumb_pages', 'menu', 'title_in_menu', 'menu_parent', 'menu_customization'].include?(key) })
end
if data['breadcrumbs']
breadcrumb_pages = data['breadcrumb_pages'] = data['breadcrumbs'].collect { |path|
puts "finding from breadcrumb #{path}" if @@verbose
result = find_page_with_path_absolute_or_relative_to(site, render_liquid_with_page(site, parent, path), page, structure_processed_pages)
raise "missing breadcrumb #{path} in #{page.path}" unless result
result
}
breadcrumb_paths = data['breadcrumb_paths'] = data['breadcrumb_pages'].collect { |p| p.path }
end
if data['menu_parent']
if data['menu_parent'].is_a? String
puts "finding from menu #{data['menu_parent']}" if @@verbose
parent_result = find_page_with_path_absolute_or_relative_to(site, render_liquid_with_page(site, parent, data['menu_parent']), page, structure_processed_pages)
raise "missing parent #{data['menu_parent']} in #{page['path']}" unless parent_result
data['menu_parent'] = parent_result
if !data['breadcrumbs']
end
end
else
data['menu_parent'] = page['breadcrumb_pages'][-1]
end
if (data['children'])
data['menu'] = []
puts "children of #{data['path']} - #{data['children']}" if @@verbose
data['children'].each do |child|
sub = gen_structure(site, child, page, breadcrumb_pages, breadcrumb_paths, structure_processed_pages)
if sub
if (!(child.is_a? String) && child.has_key?('menu'))
sub['menu'] = child['menu']
if (sub['menu'] != nil)
if sub['menu'].is_a? String
puts "yaml child paths either #{data['path']} or #{page.path}" if @@verbose
sub['menu'] = YAML.load(render_liquid_with_page(site, page, sub['menu'])) if sub['menu'].is_a? String
end
sub['menu'] = sub['menu'].collect { |mi|
gen_structure(site, mi, page, breadcrumb_pages, breadcrumb_paths, structure_processed_pages)
}
sub['menu'].compact!
end
end
data['menu'] << sub unless @config['exclude'] && @config['exclude'].any? { |ex| File.fnmatch?(ex, sub['url']) }
puts "sub is #{sub['url']}" if @@verbose
else
raise "could not find #{child} in #{page.path}"
end
end
puts "end children of #{data['path']}" if @@verbose
end
data['menu_processed']=true
puts "done #{item}" if @@verbose
result
end