|
|
@ -658,40 +658,72 @@ def format_address_output(ref_or_data): |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def format_links_output(links_data): |
|
|
def format_links_output(links_data): |
|
|
|
|
|
""" |
|
|
|
|
|
Standardizes links into a list of structured objects: |
|
|
|
|
|
[ |
|
|
|
|
|
{"title": "Dorar", "url": "https://dorar.net/hadith/3420"}, |
|
|
|
|
|
{"title": "IslamWeb", "url": "https://www.islamweb.net/ar/fatwa/1909"} |
|
|
|
|
|
] |
|
|
|
|
|
Handles dict, list of dicts, list of strings, and raw JSON strings cleanly. |
|
|
|
|
|
""" |
|
|
if not links_data: |
|
|
if not links_data: |
|
|
return [] |
|
|
return [] |
|
|
|
|
|
|
|
|
|
|
|
# 1. Parse JSON string if stored as string |
|
|
if isinstance(links_data, str): |
|
|
if isinstance(links_data, str): |
|
|
trimmed = links_data.strip() |
|
|
trimmed = links_data.strip() |
|
|
if trimmed.startswith("[") or trimmed.startswith("{"): |
|
|
|
|
|
|
|
|
if trimmed.startswith(("[", "{")): |
|
|
try: |
|
|
try: |
|
|
import json |
|
|
import json |
|
|
parsed = json.loads(trimmed) |
|
|
parsed = json.loads(trimmed) |
|
|
return format_links_output(parsed) |
|
|
return format_links_output(parsed) |
|
|
except (ValueError, TypeError): |
|
|
|
|
|
|
|
|
except (ValueError, TypeError, json.JSONDecodeError): |
|
|
pass |
|
|
pass |
|
|
return [trimmed] if trimmed else [] |
|
|
|
|
|
elif isinstance(links_data, dict): |
|
|
|
|
|
|
|
|
return [{"title": "Link", "url": trimmed}] if trimmed else [] |
|
|
|
|
|
|
|
|
|
|
|
# 2. Main case: Dict format from React Admin {"Title": "URL"} |
|
|
|
|
|
if isinstance(links_data, dict): |
|
|
out = [] |
|
|
out = [] |
|
|
for k, v in links_data.items(): |
|
|
|
|
|
if isinstance(v, str) and v.strip(): |
|
|
|
|
|
out.append(v.strip()) |
|
|
|
|
|
elif isinstance(v, (list, dict)): |
|
|
|
|
|
out.extend(format_links_output(v)) |
|
|
|
|
|
|
|
|
for title, url_or_obj in links_data.items(): |
|
|
|
|
|
if isinstance(url_or_obj, str) and url_or_obj.strip(): |
|
|
|
|
|
out.append({ |
|
|
|
|
|
"title": str(title).strip(), |
|
|
|
|
|
"url": url_or_obj.strip() |
|
|
|
|
|
}) |
|
|
|
|
|
elif isinstance(url_or_obj, dict): |
|
|
|
|
|
# Nested dict safety: e.g. {"Dorar": {"url": "...", "title": "..."}} |
|
|
|
|
|
url = url_or_obj.get("url") or url_or_obj.get("link") or url_or_obj.get("href") |
|
|
|
|
|
t = url_or_obj.get("title") or title |
|
|
|
|
|
if url and isinstance(url, str) and url.strip(): |
|
|
|
|
|
out.append({ |
|
|
|
|
|
"title": str(t).strip(), |
|
|
|
|
|
"url": url.strip() |
|
|
|
|
|
}) |
|
|
|
|
|
elif isinstance(url_or_obj, list): |
|
|
|
|
|
out.extend(format_links_output(url_or_obj)) |
|
|
return out |
|
|
return out |
|
|
elif isinstance(links_data, list): |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# 3. List case: e.g. [{"title": "...", "url": "..."}, "https://..."] |
|
|
|
|
|
if isinstance(links_data, list): |
|
|
out = [] |
|
|
out = [] |
|
|
for item in links_data: |
|
|
for item in links_data: |
|
|
if isinstance(item, str): |
|
|
|
|
|
s = item.strip() |
|
|
|
|
|
if s: |
|
|
|
|
|
out.append(s) |
|
|
|
|
|
|
|
|
if isinstance(item, str) and item.strip(): |
|
|
|
|
|
out.append({ |
|
|
|
|
|
"title": "Link", |
|
|
|
|
|
"url": item.strip() |
|
|
|
|
|
}) |
|
|
elif isinstance(item, dict): |
|
|
elif isinstance(item, dict): |
|
|
url = item.get('url') or item.get('link') or item.get('href') or item.get('value') |
|
|
|
|
|
|
|
|
url = item.get("url") or item.get("link") or item.get("href") or item.get("value") |
|
|
|
|
|
title = item.get("title") or item.get("name") or "Link" |
|
|
if url and isinstance(url, str) and url.strip(): |
|
|
if url and isinstance(url, str) and url.strip(): |
|
|
out.append(url.strip()) |
|
|
|
|
|
|
|
|
out.append({ |
|
|
|
|
|
"title": str(title).strip(), |
|
|
|
|
|
"url": url.strip() |
|
|
|
|
|
}) |
|
|
elif isinstance(item, list): |
|
|
elif isinstance(item, list): |
|
|
out.extend(format_links_output(item)) |
|
|
out.extend(format_links_output(item)) |
|
|
return out |
|
|
return out |
|
|
|
|
|
|
|
|
return [] |
|
|
return [] |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|