35
35
from dactyl .config import DactylConfig
36
36
from dactyl .cli import DactylCLIParser
37
37
from dactyl .openapi import ApiDef
38
+ from dactyl .jinja_loaders import FrontMatterRemoteLoader , FrontMatterFSLoader
38
39
39
40
# These fields are special, and pages don't inherit them directly
40
41
RESERVED_KEYS_TARGET = [
@@ -360,9 +361,11 @@ def get_categories(pages):
360
361
logger .debug ("categories: %s" % categories )
361
362
return categories
362
363
364
+
363
365
def preprocess_markdown (page , target = None , categories = [], page_filters = [],
364
366
mode = "html" , current_time = "TIME_UNKNOWN" ,
365
- bypass_errors = False , skip_preprocessor = "NOT SPECIFIED" ):
367
+ bypass_errors = False , skip_preprocessor = "NOT SPECIFIED" ,
368
+ read_frontmatter = True ):
366
369
"""Read a markdown file, local or remote, and preprocess it, returning the
367
370
preprocessed text."""
368
371
target = get_target (target )
@@ -384,6 +387,15 @@ def preprocess_markdown(page, target=None, categories=[], page_filters=[],
384
387
with open (page ["md" ], "r" , encoding = "utf-8" ) as f :
385
388
md = f .read ()
386
389
390
+ if read_frontmatter :
391
+ try :
392
+ md , frontmatter = parse_frontmatter (md )
393
+ merge_dicts (frontmatter , page )
394
+ except Exception as e :
395
+ traceback .print_tb (e .__traceback__ )
396
+ recoverable_error ("Error reading frontmatter for page %s: %s" %
397
+ (page , repr (e )), bypass_errors )
398
+
387
399
else :
388
400
if config ["preprocessor_allow_undefined" ] == False and not bypass_errors :
389
401
strict_undefined = True
@@ -394,6 +406,13 @@ def preprocess_markdown(page, target=None, categories=[], page_filters=[],
394
406
md_raw = pp_env .get_template ("_" )
395
407
else :
396
408
md_raw = pp_env .get_template (page ["md" ])
409
+
410
+ if "fm_map" in dir (pp_env .loader ): #TODO: this is a hack
411
+ fm_vars = pp_env .loader .fm_map .get (page ["md" ], {})
412
+ else :
413
+ fm_vars = {}
414
+ merge_dicts (fm_vars , page )
415
+
397
416
md = md_raw .render (
398
417
currentpage = page ,
399
418
categories = categories ,
@@ -404,7 +423,6 @@ def preprocess_markdown(page, target=None, categories=[], page_filters=[],
404
423
config = config
405
424
)
406
425
407
-
408
426
# Apply markdown-based filters here
409
427
for filter_name in page_filters :
410
428
if "filter_markdown" in dir (config .filters [filter_name ]):
@@ -525,7 +543,7 @@ def setup_pp_env(page=None, page_filters=[], no_loader=False, strict_undefined=F
525
543
if how == HOW_FROM_URL :
526
544
logger .debug ("Using remote template loader for page %s" % page )
527
545
pp_env = jinja2 .Environment (undefined = preferred_undefined ,
528
- loader = jinja2 . FunctionLoader ( read_markdown_remote ))
546
+ loader = FrontMatterRemoteLoader ( ))
529
547
elif how == HOW_FROM_GENERATOR :
530
548
logger .debug ("Using a generator-loader for page %s" % page )
531
549
pp_env = jinja2 .Environment (undefined = preferred_undefined ,
@@ -536,7 +554,7 @@ def setup_pp_env(page=None, page_filters=[], no_loader=False, strict_undefined=F
536
554
else :
537
555
logger .debug ("Using FileSystemLoader for page %s" % page )
538
556
pp_env = jinja2 .Environment (undefined = preferred_undefined ,
539
- loader = jinja2 . FileSystemLoader (path ))
557
+ loader = FrontMatterFSLoader (path ))
540
558
541
559
# Add custom "defined_and_" tests
542
560
def defined_and_equalto (a ,b ):
0 commit comments