{# Evaluates the priority of a particular setting across different scopes. The priority is as follows: page > section > config. Parameters: - setting: The name of the setting to evaluate. - page: The page object containing settings. - default_global_value: The setting's default value. #} {% macro evaluate_setting_priority(setting, page, section="", default_global_value="") %} {%- if section -%} {%- set current_section = section -%} {%- elif page -%} {%- set current_section = "" -%} {#- Retrieve last ancestor to determine current section, if applicable -#} {%- if page.ancestors | length > 0 -%} {%- set last_ancestor = page.ancestors | slice(start=-1) -%} {%- set_global current_section = get_section(path=last_ancestor.0, metadata_only=true) -%} {%- else -%} {#- We're likely in a nested page. Try to find the parent page or nearest section. -#} {%- set components = page.components -%} {%- for i in range(start=1, end=components | length) -%} {%- if lang == config.default_language -%} {%- set potential_path = components | slice(end=components | length - i) | join(sep="/") -%} {%- set potential_page = potential_path ~ "/index.md" -%} {%- set potential_section = potential_path ~ "/_index.md" -%} {%- else -%} {%- set potential_path = components | slice(start=1, end=components | length - i) | join(sep="/") -%} {%- set potential_page = potential_path ~ "/index." ~ lang ~ ".md" -%} {%- set potential_section = potential_path ~ "/_index." ~ lang ~ ".md" -%} {%- endif -%} {#- Check for parent page first. -#} {%- set page_data = load_data(path=potential_page, required=false) -%} {%- if page_data -%} {%- set_global current_section = get_page(path=potential_page) -%} {%- break -%} {%- endif -%} {#- No parent page, check for section. -#} {%- set section_data = load_data(path=potential_section, required=false) -%} {%- if section_data -%} {%- set_global current_section = get_section(path=potential_section, metadata_only=true) -%} {%- break -%} {%- endif -%} {%- endfor -%} {%- endif -%} {%- endif -%} {%- set priority_order = [ page.extra[setting] | default(value=""), current_section.extra[setting] | default(value=""), config.extra[setting] | default(value="") ] -%} {%- set output = default_global_value -%} {%- for value in priority_order -%} {%- if value != "" -%} {%- set_global output = value -%} {%- break -%} {%- endif -%} {%- endfor -%} {{- output -}} {% endmacro %}