383 lines
No EOL
9.8 KiB
Text
383 lines
No EOL
9.8 KiB
Text
#!/usr/bin/env nu
|
|
# KCL configuration processor for the Web Builder Framework
|
|
# Integrates KCL files for structured data and configuration
|
|
|
|
# Main KCL processing function
|
|
export def process_kcl_data [page_dir: string, config: record, verbose: bool] {
|
|
if $verbose { print "🔧 Processing KCL data files..." }
|
|
|
|
mut kcl_data = {}
|
|
|
|
# Check for KCL plugin availability
|
|
let has_kcl_plugin = (check_kcl_plugin_available $verbose)
|
|
|
|
if not $has_kcl_plugin {
|
|
if $verbose { print " ⚠️ KCL plugin not available, skipping KCL processing" }
|
|
return $kcl_data
|
|
}
|
|
|
|
# Find KCL files in page directory
|
|
let kcl_files = (find_kcl_files $page_dir $verbose)
|
|
|
|
if ($kcl_files | length) == 0 {
|
|
if $verbose { print " ⚠️ No KCL files found" }
|
|
return $kcl_data
|
|
}
|
|
|
|
# Process each KCL file
|
|
for kcl_file in $kcl_files {
|
|
let file_data = (process_kcl_file $kcl_file $verbose)
|
|
let file_key = ($kcl_file | path basename | str replace '.k' '')
|
|
$kcl_data = ($kcl_data | insert $file_key $file_data)
|
|
}
|
|
|
|
if $verbose {
|
|
print $" ✅ Processed ($kcl_files | length) KCL files"
|
|
print $" 📊 KCL data keys: ($kcl_data | columns | str join ', ')"
|
|
}
|
|
|
|
$kcl_data
|
|
}
|
|
|
|
# Check if KCL plugin is available
|
|
def check_kcl_plugin_available [verbose: bool] {
|
|
try {
|
|
# Try to run a simple KCL command
|
|
kcl version | complete | get exit_code == 0
|
|
} catch {
|
|
if $verbose { print " 💡 KCL plugin not available, install with: cargo install nu_plugin_kcl" }
|
|
false
|
|
}
|
|
}
|
|
|
|
# Find KCL files in page directory
|
|
def find_kcl_files [page_dir: string, verbose: bool] {
|
|
mut kcl_files = []
|
|
|
|
# Look for KCL files in common locations
|
|
let search_paths = [
|
|
$"($page_dir)/data",
|
|
$"($page_dir)/config",
|
|
$"($page_dir)/kcl",
|
|
$"($page_dir)"
|
|
]
|
|
|
|
for search_path in $search_paths {
|
|
if ($search_path | path exists) {
|
|
let found_files = (ls $"($search_path)/*.k" | get name | default [])
|
|
$kcl_files = ($kcl_files | append $found_files)
|
|
}
|
|
}
|
|
|
|
$kcl_files | uniq
|
|
}
|
|
|
|
# Process individual KCL file
|
|
def process_kcl_file [kcl_file: string, verbose: bool] {
|
|
if $verbose {
|
|
let relative_path = ($kcl_file | str replace (pwd) ".")
|
|
print $" 📄 Processing KCL file: ($relative_path)"
|
|
}
|
|
|
|
try {
|
|
# Use KCL plugin to compile and get JSON output
|
|
let kcl_output = (kcl run $kcl_file --format json)
|
|
$kcl_output | from json
|
|
} catch {
|
|
if $verbose { print $" ❌ Failed to process KCL file: ($kcl_file)" }
|
|
{}
|
|
}
|
|
}
|
|
|
|
# Generate example KCL files for a page
|
|
export def generate_kcl_examples [page_dir: string, page_name: string] {
|
|
let kcl_dir = $"($page_dir)/data"
|
|
mkdir $kcl_dir
|
|
|
|
# Generate site configuration KCL
|
|
let site_kcl = generate_site_kcl_example $page_name
|
|
$site_kcl | save $"($kcl_dir)/site.k"
|
|
|
|
# Generate content data KCL
|
|
let content_kcl = generate_content_kcl_example $page_name
|
|
$content_kcl | save $"($kcl_dir)/content.k"
|
|
|
|
# Generate navigation KCL
|
|
let nav_kcl = generate_navigation_kcl_example
|
|
$nav_kcl | save $"($kcl_dir)/navigation.k"
|
|
|
|
print $"✅ Generated KCL example files in ($kcl_dir)"
|
|
}
|
|
|
|
# Generate site configuration KCL example
|
|
def generate_site_kcl_example [page_name: string] {
|
|
$'# Site Configuration Schema
|
|
schema SiteConfig:
|
|
title: str
|
|
description: str
|
|
author?: str
|
|
lang: str = "en"
|
|
base_url?: str
|
|
meta: {
|
|
keywords: [str]
|
|
og_image?: str
|
|
twitter_card?: str
|
|
}
|
|
analytics?: {
|
|
google_analytics?: str
|
|
plausible?: str
|
|
}
|
|
|
|
# Site data for ($page_name)
|
|
site: SiteConfig = {
|
|
title = "($page_name | str title-case) - Web Builder Framework"
|
|
description = "Built with the Web Builder Framework using KCL for configuration"
|
|
author = "Web Builder Framework"
|
|
lang = "en"
|
|
base_url = "https://example.com"
|
|
meta = {
|
|
keywords = ["web", "framework", "kcl", "rust", "nushell"]
|
|
og_image = "/images/og-image.jpg"
|
|
twitter_card = "summary_large_image"
|
|
}
|
|
analytics = {
|
|
google_analytics = "UA-XXXXXXXX-X"
|
|
}
|
|
}'
|
|
}
|
|
|
|
# Generate content data KCL example
|
|
def generate_content_kcl_example [page_name: string] {
|
|
$'# Content Data Schema
|
|
schema ContentItem:
|
|
title: str
|
|
description?: str
|
|
image?: str
|
|
url?: str
|
|
tags?: [str]
|
|
featured?: bool = False
|
|
|
|
schema ContentSection:
|
|
heading: str
|
|
subtitle?: str
|
|
items: [ContentItem]
|
|
layout: str = "grid"
|
|
|
|
# Content data for ($page_name)
|
|
hero_section = {
|
|
title = "Welcome to ($page_name | str title-case)"
|
|
subtitle = "Powered by KCL configuration and Tera templates"
|
|
background_image = "/images/hero-bg.jpg"
|
|
cta = {
|
|
text = "Get Started"
|
|
url = "/getting-started"
|
|
style = "primary"
|
|
}
|
|
}
|
|
|
|
features: ContentSection = {
|
|
heading = "Framework Features"
|
|
subtitle = "Built with modern web technologies"
|
|
layout = "grid"
|
|
items = [
|
|
{
|
|
title = "KCL Configuration"
|
|
description = "Type-safe configuration with KCL"
|
|
image = "/icons/config.svg"
|
|
tags = ["config", "type-safe"]
|
|
featured = True
|
|
}
|
|
{
|
|
title = "Tera Templates"
|
|
description = "Powerful Jinja2-inspired templating"
|
|
image = "/icons/template.svg"
|
|
tags = ["template", "tera"]
|
|
}
|
|
{
|
|
title = "Rust Processing"
|
|
description = "Fast Markdown processing with Rust"
|
|
image = "/icons/rust.svg"
|
|
tags = ["rust", "performance"]
|
|
featured = True
|
|
}
|
|
]
|
|
}
|
|
|
|
testimonials = [
|
|
{
|
|
quote = "The Web Builder Framework makes building static sites a joy!"
|
|
author = "Jane Developer"
|
|
role = "Frontend Engineer"
|
|
avatar = "/images/avatars/jane.jpg"
|
|
}
|
|
{
|
|
quote = "KCL configuration gives me confidence in my site structure."
|
|
author = "John Architect"
|
|
role = "Solutions Architect"
|
|
avatar = "/images/avatars/john.jpg"
|
|
}
|
|
]'
|
|
}
|
|
|
|
# Generate navigation KCL example
|
|
def generate_navigation_kcl_example [] {
|
|
$'# Navigation Schema
|
|
schema NavItem:
|
|
title: str
|
|
url: str
|
|
icon?: str
|
|
external?: bool = False
|
|
children?: [NavItem]
|
|
|
|
schema Navigation:
|
|
primary: [NavItem]
|
|
secondary?: [NavItem]
|
|
footer?: [NavItem]
|
|
|
|
# Navigation configuration
|
|
navigation: Navigation = {
|
|
primary = [
|
|
{
|
|
title = "Home"
|
|
url = "/"
|
|
icon = "home"
|
|
}
|
|
{
|
|
title = "Features"
|
|
url = "/features"
|
|
icon = "star"
|
|
children = [
|
|
{ title = "KCL Integration", url = "/features/kcl" }
|
|
{ title = "Tera Templates", url = "/features/templates" }
|
|
{ title = "Rust Processing", url = "/features/rust" }
|
|
]
|
|
}
|
|
{
|
|
title = "Documentation"
|
|
url = "/docs"
|
|
icon = "book"
|
|
}
|
|
{
|
|
title = "GitHub"
|
|
url = "https://github.com/web-builder-framework"
|
|
icon = "github"
|
|
external = True
|
|
}
|
|
]
|
|
|
|
footer = [
|
|
{ title = "Privacy Policy", url = "/privacy" }
|
|
{ title = "Terms of Service", url = "/terms" }
|
|
{ title = "Contact", url = "/contact" }
|
|
]
|
|
}'
|
|
}
|
|
|
|
# Integration with template system
|
|
export def merge_kcl_with_template_data [template_data: record, kcl_data: record, verbose: bool] {
|
|
if $verbose { print "🔗 Merging KCL data with template context..." }
|
|
|
|
mut merged_data = $template_data
|
|
|
|
# Merge each KCL file data
|
|
for key in ($kcl_data | columns) {
|
|
let kcl_file_data = ($kcl_data | get $key)
|
|
|
|
# Merge at top level, KCL data takes precedence
|
|
for kcl_key in ($kcl_file_data | columns) {
|
|
$merged_data = ($merged_data | insert $kcl_key ($kcl_file_data | get $kcl_key))
|
|
}
|
|
}
|
|
|
|
if $verbose {
|
|
print $" ✅ Merged data keys: ($merged_data | columns | str join ', ')"
|
|
}
|
|
|
|
$merged_data
|
|
}'
|
|
}
|
|
|
|
# Generate KCL schema files for validation
|
|
export def generate_kcl_schemas [framework_dir: string] {
|
|
let schema_dir = $"($framework_dir)/schemas"
|
|
mkdir $schema_dir
|
|
|
|
# Page configuration schema
|
|
let page_schema = generate_page_schema
|
|
$page_schema | save $"($schema_dir)/page.k"
|
|
|
|
# Site configuration schema
|
|
let site_schema = generate_site_schema
|
|
$site_schema | save $"($schema_dir)/site.k"
|
|
|
|
print $"✅ Generated KCL schemas in ($schema_dir)"
|
|
}
|
|
|
|
def generate_page_schema [] {
|
|
$'# Page Configuration Schema for Web Builder Framework
|
|
|
|
schema PageMeta:
|
|
title: str
|
|
description?: str
|
|
author?: str
|
|
keywords?: [str]
|
|
lang?: str = "en"
|
|
published_date?: str
|
|
modified_date?: str
|
|
tags?: [str]
|
|
category?: str
|
|
reading_time?: int
|
|
|
|
schema PageTemplate:
|
|
template: str = "default.html"
|
|
layout?: str = "single-column"
|
|
theme?: str = "default"
|
|
|
|
schema PageFeatures:
|
|
toc?: bool = False
|
|
comments?: bool = False
|
|
sharing?: bool = False
|
|
related_posts?: bool = False
|
|
|
|
schema PageConfig:
|
|
meta: PageMeta
|
|
template: PageTemplate
|
|
features?: PageFeatures
|
|
custom?: {str:} # Allow custom fields'
|
|
}
|
|
|
|
def generate_site_schema [] {
|
|
$'# Site Configuration Schema for Web Builder Framework
|
|
|
|
schema SiteIdentity:
|
|
title: str
|
|
tagline?: str
|
|
description: str
|
|
logo?: str
|
|
favicon?: str
|
|
|
|
schema SiteUrls:
|
|
base_url: str
|
|
canonical_url?: str
|
|
feed_url?: str
|
|
sitemap_url?: str
|
|
|
|
schema SiteOwner:
|
|
name: str
|
|
email?: str
|
|
bio?: str
|
|
avatar?: str
|
|
social?: {str: str}
|
|
|
|
schema SiteFeatures:
|
|
search?: bool = False
|
|
analytics?: bool = False
|
|
comments?: bool = False
|
|
newsletter?: bool = False
|
|
|
|
schema SiteConfig:
|
|
identity: SiteIdentity
|
|
urls: SiteUrls
|
|
owner?: SiteOwner
|
|
features?: SiteFeatures'
|
|
} |