31
31
32
32
from dactyl .config import DactylConfig
33
33
from dactyl .cli import DactylCLIParser
34
+ from dactyl .jinja_loaders import FrontMatterRemoteLoader , FrontMatterFSLoader
34
35
35
36
# These fields are special, and pages don't inherit them directly
36
37
RESERVED_KEYS_TARGET = [
@@ -296,9 +297,11 @@ def get_categories(pages):
296
297
logger .debug ("categories: %s" % categories )
297
298
return categories
298
299
300
+
299
301
def preprocess_markdown (page , target = None , categories = [], page_filters = [],
300
302
mode = "html" , current_time = "TIME_UNKNOWN" ,
301
- bypass_errors = False , skip_preprocessor = "NOT SPECIFIED" ):
303
+ bypass_errors = False , skip_preprocessor = "NOT SPECIFIED" ,
304
+ read_frontmatter = True ):
302
305
"""Read a markdown file, local or remote, and preprocess it, returning the
303
306
preprocessed text."""
304
307
target = get_target (target )
@@ -317,13 +320,27 @@ def preprocess_markdown(page, target=None, categories=[], page_filters=[],
317
320
with open (page ["md" ], "r" , encoding = "utf-8" ) as f :
318
321
md = f .read ()
319
322
323
+ if read_frontmatter :
324
+ try :
325
+ md , frontmatter = parse_frontmatter (md )
326
+ merge_dicts (frontmatter , page )
327
+ except Exception as e :
328
+ traceback .print_tb (e .__traceback__ )
329
+ recoverable_error ("Error reading frontmatter for page %s: %s" %
330
+ (page , repr (e )), bypass_errors )
331
+
320
332
else :
321
333
if config ["preprocessor_allow_undefined" ] == False and not bypass_errors :
322
334
strict_undefined = True
323
335
else :
324
336
strict_undefined = False
325
337
pp_env = setup_pp_env (page , page_filters = page_filters , strict_undefined = strict_undefined )
326
338
md_raw = pp_env .get_template (page ["md" ])
339
+ if "fm_map" in dir (pp_env .loader ):#TODO: this is a hack
340
+ fm_vars = pp_env .loader .fm_map .get (page ["md" ], {})
341
+ else :
342
+ fm_vars = {}
343
+ merge_dicts (fm_vars , page )
327
344
md = md_raw .render (
328
345
currentpage = page ,
329
346
categories = categories ,
@@ -334,7 +351,6 @@ def preprocess_markdown(page, target=None, categories=[], page_filters=[],
334
351
config = config
335
352
)
336
353
337
-
338
354
# Apply markdown-based filters here
339
355
for filter_name in page_filters :
340
356
if "filter_markdown" in dir (config .filters [filter_name ]):
@@ -448,14 +464,14 @@ def setup_pp_env(page=None, page_filters=[], no_loader=False, strict_undefined=F
448
464
if remote :
449
465
logger .debug ("Using remote template loader for page %s" % page )
450
466
pp_env = jinja2 .Environment (undefined = preferred_undefined ,
451
- loader = jinja2 . FunctionLoader ( read_markdown_remote ))
467
+ loader = FrontMatterRemoteLoader ( ))
452
468
elif no_loader :
453
469
logger .debug ("Using a no-loader Jinja environment" )
454
470
pp_env = jinja2 .Environment (undefined = preferred_undefined )
455
471
else :
456
472
logger .debug ("Using FileSystemLoader for page %s" % page )
457
473
pp_env = jinja2 .Environment (undefined = preferred_undefined ,
458
- loader = jinja2 . FileSystemLoader (path ))
474
+ loader = FrontMatterFSLoader (path ))
459
475
460
476
# Add custom "defined_and_" tests
461
477
def defined_and_equalto (a ,b ):
0 commit comments