gen_structure

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