100 lines
No EOL
3.4 KiB
Text
100 lines
No EOL
3.4 KiB
Text
# Frontmatter Processing Utilities
|
|
# Functions for extracting and processing YAML frontmatter from markdown files
|
|
|
|
# Extract frontmatter from markdown file
|
|
export def extract_frontmatter [input_file: string] {
|
|
try {
|
|
# --raw: `open` auto-applies `from md` on .md by extension, yielding a
|
|
# markdown AST instead of text — which makes the `---` fence check fail
|
|
# and silently drops all frontmatter. Read raw bytes so the YAML survives.
|
|
let content = (open --raw $input_file | lines)
|
|
if ($content | first) == "---" {
|
|
mut frontmatter = []
|
|
mut in_frontmatter = false
|
|
mut line_count = 0
|
|
|
|
for line in $content {
|
|
$line_count = ($line_count + 1)
|
|
if $line_count == 1 and $line == "---" {
|
|
$in_frontmatter = true
|
|
continue
|
|
}
|
|
if $in_frontmatter and $line == "---" {
|
|
break
|
|
}
|
|
if $in_frontmatter and not ($line | str starts-with "#") { # Skip comment lines
|
|
$frontmatter = ($frontmatter | append $line)
|
|
}
|
|
}
|
|
|
|
$frontmatter | str join "\n"
|
|
} else {
|
|
""
|
|
}
|
|
} catch {
|
|
""
|
|
}
|
|
}
|
|
|
|
# Extract value from frontmatter
|
|
export def extract_from_frontmatter [frontmatter: string, key: string, default: string] {
|
|
if ($frontmatter | is-empty) {
|
|
return $default
|
|
}
|
|
|
|
let lines = ($frontmatter | lines)
|
|
for line in $lines {
|
|
# Simple approach: look for "key: value" pattern
|
|
if ($line | str starts-with $"($key):") {
|
|
let value_part = ($line | str replace $"($key):" "" | str trim)
|
|
# Remove quotes if present
|
|
let clean_value = ($value_part | str replace -a '"' '' | str replace -a "'" '')
|
|
return $clean_value
|
|
}
|
|
}
|
|
|
|
$default
|
|
}
|
|
|
|
# Extract YAML array from frontmatter (for tags)
|
|
export def extract_yaml_array [frontmatter: string, key: string] {
|
|
let tags_str = extract_from_frontmatter $frontmatter $key "[]"
|
|
if $tags_str == "[]" or ($tags_str | is-empty) {
|
|
return []
|
|
}
|
|
|
|
# Parse YAML array format: ["item1", "item2", "item3"]
|
|
let tags = ($tags_str | str replace -a '[' '' | str replace -a ']' '' | str replace -a '"' '' | split row ',' | each { |tag| $tag | str trim })
|
|
$tags | where $it != ""
|
|
}
|
|
|
|
# Collect all categories and tags from markdown files
|
|
export def collect_categories_and_tags [source_dir: string] {
|
|
mut all_categories = []
|
|
mut all_tags = []
|
|
|
|
let md_files = (glob $"($source_dir)/**/*.md")
|
|
for md_file in $md_files {
|
|
let frontmatter = extract_frontmatter $md_file
|
|
let published = (extract_from_frontmatter $frontmatter "published" "true")
|
|
|
|
if ($published | str downcase) == "true" {
|
|
# Extract category (singular)
|
|
let category = (extract_from_frontmatter $frontmatter "category" "")
|
|
if not ($category | is-empty) {
|
|
$all_categories = ($all_categories | append $category)
|
|
}
|
|
|
|
# Extract tags (array)
|
|
let tags = extract_yaml_array $frontmatter "tags"
|
|
for tag in $tags {
|
|
$all_tags = ($all_tags | append $tag)
|
|
}
|
|
}
|
|
}
|
|
|
|
{
|
|
categories: ($all_categories | uniq),
|
|
tags: ($all_tags | uniq)
|
|
}
|
|
} |