All files / front_matter / _formats.ts

100.00% Branches 0/0
100.00% Lines 39/39
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
 
 
 
 
 
 
 
 
x18
 
x18
x18
 
x18
x18
 
x18
x18
 
x18
x18
 
x18
x18
 
x18
x18
x18
 
x18
x18
x18
 
x18
x18
x18
 
 
x18
x18
x18
 
x18
x18
x18
 
x18
x18
x18
 
 
x18
x72
x72
x54
x18
 
x18
x72
x72
x54
x18




























































// Copyright 2018-2025 the Deno authors. MIT license.

/**
 * Supported format for front matter. `"unknown"` is used when auto format
 * detection logic fails.
 */
export type Format = "yaml" | "toml" | "json";

const BOM = "\\ufeff?";

const YAML_HEADER = `${BOM}(?:---yaml|= yaml =|---)`;
const YAML_FOOTER = `(?:= yaml =|---)`;

const TOML_HEADER = `${BOM}(?:---toml|\\+\\+\\+|= toml =)`;
const TOML_FOOTER = `(?:---|\\+\\+\\+|= toml =)`;

const JSON_HEADER = `${BOM}(?:---json|= json =)`;
const JSON_FOOTER = `(?:---|= json =)`;

const WHITESPACES = "\\s*";
const NEWLINE = "\\r?\\n";

const FRONT_MATTER = "(?<frontMatter>.+?)";
const BODY = "(?:\\r?\\n(?<body>.+))?";

const RECOGNIZE_YAML_REGEXP = new RegExp(
  `^${YAML_HEADER}${WHITESPACES}${NEWLINE}`,
  "i",
);
const RECOGNIZE_TOML_REGEXP = new RegExp(
  `^${TOML_HEADER}${WHITESPACES}${NEWLINE}`,
  "i",
);
const RECOGNIZE_JSON_REGEXP = new RegExp(
  `^${JSON_HEADER}${WHITESPACES}${NEWLINE}`,
  "i",
);

export const EXTRACT_YAML_REGEXP = new RegExp(
  `^${YAML_HEADER}${WHITESPACES}${NEWLINE}${WHITESPACES}(?:${FRONT_MATTER}${WHITESPACES}${NEWLINE})?${YAML_FOOTER}${WHITESPACES}${BODY}$`,
  "is",
);
export const EXTRACT_TOML_REGEXP = new RegExp(
  `^${TOML_HEADER}${WHITESPACES}${NEWLINE}${WHITESPACES}(?:${FRONT_MATTER}${WHITESPACES}${NEWLINE})?${TOML_FOOTER}${WHITESPACES}${BODY}$`,
  "is",
);
export const EXTRACT_JSON_REGEXP = new RegExp(
  `^${JSON_HEADER}${WHITESPACES}${NEWLINE}${WHITESPACES}(?:${FRONT_MATTER}${WHITESPACES}${NEWLINE})?${JSON_FOOTER}${WHITESPACES}${BODY}$`,
  "is",
);

export const RECOGNIZE_REGEXP_MAP = new Map([
  ["yaml", RECOGNIZE_YAML_REGEXP],
  ["toml", RECOGNIZE_TOML_REGEXP],
  ["json", RECOGNIZE_JSON_REGEXP],
]);

export const EXTRACT_REGEXP_MAP = new Map([
  ["yaml", EXTRACT_YAML_REGEXP],
  ["toml", EXTRACT_TOML_REGEXP],
  ["json", EXTRACT_JSON_REGEXP],
]);