diff options
Diffstat (limited to 'src/smp/builtins.py')
-rw-r--r-- | src/smp/builtins.py | 28 |
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" |