Skip to content
Snippets Groups Projects
link.html 3.99 KiB
{%- import 'macros/content_renderer.html' as content_renderer with context -%}
{%- import 'macros/getters.html' as get with context -%}

{%- macro render(url, content, lang, attr = None, title = None) -%}
	{%- call(parsedurl, anchor, reflang, is_external, reftype, refid, refpage, tagcattitle, tagcatcolor) parse_url(url, lang) -%}
		{%- set ns = namespace(relation=None, fullurl=parsedurl) -%}
		{%- if anchor -%}
			{%- set ns.fullurl = [parsedurl, anchor]|join('#') -%}
		{%- endif -%}
		{%- if is_external -%}
			{%- set ns.relation = "external" -%}
		{%- else -%}
			{%- set ns.relation = "internal" -%}
		{%- endif -%}
		{%- set target = config.theme.link_target[ns.relation] -%}
		<a {{ content_renderer.render_attr(attr, lang, extra_classes=[ns.relation], extra={"href": ns.fullurl, "title": {"value":title, "escape": true}, "target": target}) }}>
			{%- if content is string or content is none -%}
				{%- if content is string and content|length -%}
					{{ content|e }}
				{%- else -%}
					{%- if reftype == "tag" -%}
						{{ tagcattitle|e }}
					{%- elif reftype == "slug" -%}
						{{ refpage.title|e }}
					{%- endif -%}
				{%- endif -%}
			{%- else -%}
				{{ content_renderer.render_blocks_or_inlines(content, lang) }}
			{%- endif -%}
		</a>
	{%- endcall -%}
{%- endmacro -%}


{#- returns: (url, anchor, reflang, is_external, reftype, refid, refpage, tagcattitle, tagcatcolor)-#}
{%- macro parse_url(rawurl, lang) -%}
	{%- set urlsplit = rawurl.split('#') -%}
	{%- set ns = namespace(anchor=urlsplit[1]|d(None), url=None, page=None, tagcattitle=None, tagcatcolor=None, tagpage=None, reftype=None, refid=None, reflang=None, is_external = False) -%}
	{%- set urlwoa = urlsplit[0] -%} {#- url without ns.anchor -#}
	{%- if not urlwoa|length -%}
		{{- caller("", ns.anchor, lang, False, None, None, None, None, None) -}}
	{%- else -%}

		{%- set components = urlwoa.split(':') -%}

		{%- if components|length == 1 -%}
			{%- set ns.url = ['https://', urlwoa]|join('') -%}
			{{- caller(ns.url, ns.anchor, lang, True, None, None, None, None, None) -}}
		{%- else -%}
			{%- set ns.reftype = components[0] -%}
			{%- set ns.refid = components[1] -%}
			{%- set ns.reflang = components[2]|d(lang) -%}
			{%- if ns.reftype == "slug" -%}
				{%- call(page) get.page_by_slug(ns.refid, ns.reflang) -%}
					{%- set ns.url = [siteurl, page.url]|join('/') -%}
					{%- set ns.page = page -%}
					{%- call(tagcattitle, tagcatcolor, caturl, catpage, catpages) get.tag_by_name(page.category, ns.reflang) -%}
						{%- set ns.tagcattitle = tagcattitle -%}
						{%- set ns.tagcatcolor = tagcatcolor -%}
					{%- endcall -%}
				{%- endcall -%}
				{%- if 'link' in ns.page.metadata -%}
					{%- call(parsedurl, anchor, reflang, is_external, reftype, refid, refpage, tagcattitle, tagcatcolor) parse_url(ns.page.metadata['link'], ns.reflang) -%}
						{%- set ns.url = parsedurl -%}
						{%- set ns.anchor = anchor -%}
						{%- set ns.reflang = reflang -%}
						{%- set ns.is_external = is_external -%}
						{%- set ns.reftype = reftype -%}
						{%- if not is_external -%}
							{%- set ns.refid = refid -%}
							{%- set ns.refpage = refpage -%}
							{%- set ns.tagcattitle = tagcattitle -%}
							{%- set ns.tagcatcolor = tagcatcolor -%}
						{%- endif -%}
					{%- endcall -%}
				{%- endif -%}
				{{- caller(ns.url, ns.anchor, ns.reflang, ns.is_external, ns.reftype, ns.refid, ns.page, ns.tagcattitle, ns.tagcatcolor) -}}
			{%- elif ns.reftype == "tag" -%}
				{%- call(tagcattitle, tagcatcolor, tagurl, tagpage, tagpages) get.tag_by_name(ns.refid, ns.reflang) -%}
					{%- set ns.url = [siteurl, tagurl]|join('/') -%}
					{%- set ns.tagcattitle = tagcattitle -%}
					{%- set ns.tagcatcolor = tagcatcolor -%}
					{%- set ns.tagpage = tagpage -%}
				{%- endcall -%}
				{{- caller(ns.url, ns.anchor, ns.reflang, False, ns.reftype, ns.refid, ns.tagpage, ns.tagcattitle, ns.tagcatcolor) -}}
			{%- else -%}
				{{- caller(urlwoa, ns.anchor, ns.reflang, True, None, None, None, None, None) -}}
			{%- endif -%}
		{%- endif -%}
	{%- endif -%}
{%- endmacro -%}