aboutsummaryrefslogtreecommitdiff
path: root/src/smp/builtins.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/smp/builtins.py')
-rw-r--r--src/smp/builtins.py28
1 files changed, 28 insertions, 0 deletions
diff --git a/src/smp/builtins.py b/src/smp/builtins.py
index 4cbb0a3..f463a24 100644
--- a/src/smp/builtins.py
+++ b/src/smp/builtins.py
@@ -1,9 +1,12 @@
import smp.exceptions
import subprocess
+import urllib.request
+import urllib.error
import datetime
import markdown
from gfm import AutolinkExtension, TaskListExtension
+
def smp_builtin_define(macro_processor, macro_name, macro_value=None):
macro_name = macro_processor.process_input(macro_name)
if macro_value is not None:
@@ -116,6 +119,7 @@ def smp_builtin_array_each(macro_processor, array_name, template):
out += macro_processor.process_input(macro_processor.expand_macro(template, el))
return out
+
def smp_builtin_explode(macro_processor, array_name, delimiter, input):
if array_name not in macro_processor.macros:
raise Exception(f"{array_name} is not a macro")
@@ -126,11 +130,13 @@ def smp_builtin_explode(macro_processor, array_name, delimiter, input):
macro_processor.macros[array_name].append(el)
return ""
+
def smp_builtin_format_time(macro_processor, format, time):
timestamp = macro_processor.process_input(time)
dobj = datetime.datetime.fromisoformat(timestamp)
return dobj.strftime(format)
+
def smp_builtin_html_from_markdown(macro_processor, text, extensions=list()):
# Get rid of quoting, I don't remember why, but the rust implementation does it like this.
for _ in range(2):
@@ -139,6 +145,28 @@ def smp_builtin_html_from_markdown(macro_processor, text, extensions=list()):
extensions.append(TaskListExtension(max_depth=2))
return markdown.markdown(text, extensions=extensions)
+
+global LINK_CACHE
+LINK_CACHE = dict()
+
+
+def smp_builtin_wodl(macro_processor, link, timeout_seconds=5):
+ if link in LINK_CACHE:
+ return LINK_CACHE[link]
+
+ try:
+ r = urllib.request.urlopen(link, timeout=timeout_seconds)
+ working_link = (r.status == 200) and (r.reason == "OK")
+ LINK_CACHE[link] = (working_link, r.status, r.reason)
+ if not working_link:
+ macro_processor.warnings.append(
+ f"Dead link {link} ({r.status} {r.reason})!"
+ )
+ except urllib.error.URLError as e:
+ macro_processor.warnings.append(f"Dead link {link} ({e})!")
+ return ""
+
+
def smp_builtin_dumpenv(macro_processor):
out = ""
out += "━ Macros ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n"