A complete, production-ready compiler for HTMLXIFY - a simplified web markup language that transpiles to clean HTML, CSS, and JavaScript with no configuration needed.
Write cleaner, faster markup. Build modern web pages in seconds.
HTMLXIFY is a lightweight markup language designed to make web development faster and cleaner. Instead of writing verbose HTML, you write simple, intuitive markup that compiles to production-ready HTML, CSS, and JavaScript.
<!DOCTYPE html>
<html>
<head>
<title>My Page</title>
<link rel="stylesheet" href="styles.css">
</head>
<body>
<div id="app" class="container">
<h1 class="title">Welcome</h1>
<p class="subtitle">This is a paragraph</p>
<button class="primary" onclick="trackClick()">Click Me</button>
</div>
<script src="app.js"></script>
</body>
</html>Write this in a file named page.HTMLXIFY:
html {
head {
meta(charset: "UTF-8")
meta(name: "viewport", content: "width=device-width, initial-scale=1.0")
title { My Page }
link(rel: "stylesheet", href: "page.css")
}
body {
div#app.container {
h1.title { Welcome }
p.subtitle { This is a paragraph }
button.primary(β‘-call: "trackClick") { Click Me }
}
script(src: "page.js") { }
}
}
Then compile:
HTMLXIFY page.HTMLXIFY output/Result: Identical output to the "Before" HTML code!
- All the boilerplate (doctype, html, head, meta tags) is generated automatically
- Responsive CSS is auto-generated (7+ KB)
- JavaScript handlers are auto-generated (10+ KB)
71% less code to write. Same semantic HTML output. Zero boilerplate.
- β Simple Syntax - Intuitive markup language easy to learn
- β No Configuration - Works out of the box with sensible defaults
- β Auto-Generated CSS - Comprehensive stylesheet automatically created
- β
API Integration - Built-in support for backend calls with
β‘-call - β
Dynamic Data Binding - Connect UI to data with
β‘-data - β Responsive Design - Mobile-first CSS with breakpoints
- β XSS Protection - Automatic HTML escaping for security
- β Fast Compilation - Single-pass compiler, instant results
- β Production Ready - Generates clean, optimized code
- β
Void Elements - Proper
<br>,<img>,<input>,<meta>, etc. handling - β
Escape Sequences - Support for
/{,/},/(,/) - β
Escape Blocks - Raw content with
escape{ }preserving braces, parentheses - β
Boolean Attributes - HTML5 booleans like
disabled,checked,required - β
@ Alias - Use
@-calland@-dataas alternatives toβ‘-callandβ‘-data - β Language Server - LSP support for all IDEs (VS Code, Neovim, Sublime, etc.)
Option 1: Install from PyPI (Recommended)
pip install htmlxifyThen use the command:
HTMLXIFY myfile.HTMLXIFY output/
HTMLXIFY hello.HTMLXIFY output/ --verbose # With verbose output
HTMLXIFY --version # Check version
HTMLXIFY --help # View helpOption 2: Install from Source (For Development)
# 1. Install dependencies
pip install -r requirements.txt
# 2. Install package in development mode
pip install -e .
# 3. Use the command
HTMLXIFY myfile.HTMLXIFY output/Option 3: Run Python CLI Directly
# 1. Install dependencies
pip install -r requirements.txt
# 2. Run the CLI
python cli.py myfile.HTMLXIFY output/
python cli.py hello.HTMLXIFY output/ --verbose # With verbose outputCreate a file named hello.HTMLXIFY:
div#app.container {
h1 { Hello World }
p { Welcome to HTMLXIFY }
}
Compile it:
# Using installed package (recommended)
HTMLXIFY hello.HTMLXIFY output/
# Or using Python directly
python cli.py hello.HTMLXIFY output/This generates:
output/hello.html- Clean, semantic HTML (20+ KB)output/hello.css- Responsive stylesheet (7.3 KB)output/hello.js- JavaScript handlers (10.6 KB)output/hello.html.map- Source map for debugging
Open output/hello.html in your browser and you're done! π
That's it! No configuration, no build tools. Just HTML, CSS, and JS.
// Single elements
div { Content }
p { Paragraph }
h1 { Heading }
button { Click Me }
// Void elements (no closing tag)
br
img(src: "photo.jpg", alt: "Photo")
input(type: "text")
meta(charset: "UTF-8")
// Single class
div.container { ... }
// Multiple classes
button.primary.large { ... }
// IDs
div#main { ... }
// Classes and IDs together
div.card#featured { ... }
// String attributes
button(onclick: "handleClick") { Click }
a(href: "https://example.com", target: "_blank") { Link }
// Boolean attributes (no value)
input(type: "checkbox", checked)
input(type: "text", disabled)
button(disabled) { Can't Click }
form(novalidate) { ... }
When you need characters that conflict with syntax, use escape sequences:
// Escaped curly braces
p { JSON: /{ "key": "value" /} }
// Escaped parentheses
code { function/(/)/() /{ return true; /} }
// Real-world example
p { Price: $99.99 (50% off) and formula: x^2 }
For larger blocks of raw content with special characters, use escape{ }:
// Code with braces and parentheses
pre {
escape{
function greet() {
console.log("Hello!");
}
}
}
// Preserves everything: {}, (), whitespace, special chars
article {
h3 { Code Example }
pre { escape{
{}
()
β‘-call
@-data
#$%^&*()
Blank lines preserved!
} }
}
The escape{ } block:
- Preserves all special characters literally
- Maintains whitespace and blank lines
- Handles nested braces correctly
- Perfect for code snippets, formulas, JSON
div.container {
h1 { Title }
p { First paragraph }
p { Second paragraph }
button { Action }
}
// Simple text
p { This is a paragraph }
// Multiple lines of text (preserved)
p {
This is a longer
paragraph spanning
multiple lines
}
// Mixed content (elements and text)
div {
h1 { Title }
This is text after heading
p { Another element }
}
// Using β‘ symbol
button(β‘-call: "selectPlan", data-plan: "starter") {
Select Plan
}
// Using @ alias (same functionality)
button(@-call: "selectPlan", data-plan: "starter") {
Select Plan
}
This generates:
- HTML:
<button data-api-call="selectPlan" data-plan="starter"> - JS: Auto-triggers mock API handler with sample response
Available endpoints with mock data:
trackCTAClick- CTA click trackingsubmitForm- Form submission handlerselectPlan- Plan selectioncontactSales- Sales inquirygetData- Generic data retrieval
// Using β‘ symbol
div(β‘-data: "userData") {
p { User information }
}
// Using @ alias
div(@-data: "userData") {
p { User information }
}
In JavaScript, update it dynamically:
updateBinding('userData', 'new value');header.navbar {
nav { Links }
}
main {
article.post { Content }
}
footer { Copyright }
nav.navbar {
div.brand { Logo }
div.menu {
a(href: "/") { Home }
a(href: "/about") { About }
a(href: "/contact") { Contact }
}
}
div.hero {
h1.hero-title { Welcome }
p.hero-subtitle { Get started today }
button.cta(β‘-call: "trackCTAClick") { Learn More }
}
div.feature-grid {
div.feature-card {
h3 { Feature 1 }
p { Description }
}
div.feature-card {
h3 { Feature 2 }
p { Description }
}
div.feature-card {
h3 { Feature 3 }
p { Description }
}
}
div.pricing-grid {
div.pricing-card {
h3 { Starter }
p.price { $9/month }
button(β‘-call: "selectPlan", data-plan: "starter") { Choose }
}
div.pricing-card.featured {
h3 { Pro }
p.price { $29/month }
button(β‘-call: "selectPlan", data-plan: "pro") { Choose }
}
}
table.comparison {
thead {
tr {
th { Feature }
th { Starter }
th { Pro }
}
}
tbody {
tr {
td { Users }
td { Up to 10 }
td { Unlimited }
}
}
}
# Using executable (recommended - no Python needed)
HTMLXIFY.exe input.HTMLXIFY output/
HTMLXIFY.exe input.HTMLXIFY output/ --verbose
HTMLXIFY.exe --version
HTMLXIFY.exe --help
# Or using Python (if you prefer)
python cli.py input.HTMLXIFY output/
python cli.py input.HTMLXIFY output/ --verbose
python cli.py --version
python cli.py --helpNote: Both commands do exactly the same thing. The .exe is faster and doesn't require Python installed.
For input file mypage.HTMLXIFY, the compiler generates:
output/
βββ mypage.html # Semantic HTML structure
βββ mypage.css # Responsive stylesheet (7+ KB)
βββ mypage.js # JavaScript handlers & utilities
βββ mypage.html.map # Source map for debugging
HTMLXIFY/
βββ HTMLXIFY/ # Main compiler package
β βββ cli.py # Command-line interface
β βββ parser/
β β βββ grammar.lark # HTMLXIFY grammar
β β βββ ast_builder.py # Parse tree to AST converter
β β βββ indent_processor.py # Indentation hierarchy
β βββ generators/
β β βββ html_gen.py # HTML output generator
β β βββ css_gen.py # CSS output generator (650+ lines)
β β βββ js_gen.py # JavaScript output generator
β βββ validator/
β β βββ semantic.py # Semantic validation
β βββ utils/
βββ tests/
β βββ unit/test_parser.py # 13 comprehensive tests
βββ example.HTMLXIFY # Full feature demonstration
βββ language_server/ # Future LSP support (planned)
βββ dist/
β βββ HTMLXIFY.exe # Standalone executable (Windows)
βββ build/
β βββ HTMLXIFY/ # Build directory with dependencies
βββ example_backend.py # Example Flask backend
βββ setup.py # Package configuration for PyPI
βββ requirements.txt # Python dependencies
βββ README.md # This file
The compiler includes comprehensive tests:
# Run all tests
pytest tests/unit/test_parser.py -v
# Run specific test
pytest tests/unit/test_parser.py::test_basic_element -v
# Run with coverage report
pytest tests/unit/ --cov=HTMLXIFY --cov-report=htmlTest Coverage:
- Basic elements (div, p, button, etc.)
- Classes (single and multiple)
- IDs
- Attributes
- Special attributes (β‘-call, β‘-data)
- Nesting and hierarchy
- Text content handling
- Mixed content (text + elements)
- Complex real-world structures
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Page</title>
<link rel="stylesheet" href="page.css">
</head>
<body>
<div id="app" class="container">
<h1 class="title">Hello World</h1>
<p>Welcome to HTMLXIFY</p>
</div>
<script src="page.js"></script>
</body>
</html>/* Reset & Base Styles */
* { margin: 0; padding: 0; box-sizing: border-box; }
html { font-size: 16px; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto; }
/* Typography */
h1 { font-size: 2.5rem; font-weight: 600; }
h2 { font-size: 2rem; font-weight: 600; }
/* Responsive Design */
@media (max-width: 768px) {
.feature-grid { grid-template-columns: 1fr; }
body { font-size: 14px; }
}
/* And much more... */// Smart API URL Detection (4-level priority)
const API_BASE_URL = window.API_BASE_URL
|| (function() {
const meta = document.querySelector('meta[name="api-url"]');
if (meta) return meta.getAttribute('content');
if (window.location.hostname !== 'localhost') {
return '/api'; // Same domain backend
}
return 'http://localhost:5000/api'; // Local development
})();
// API Handlers (auto-wired to buttons with β‘-call attribute)
const apiHandlers = {
'trackCTAClick': async function(element) { ... },
'selectPlan': async function(element) { ... },
'submitForm': async function(element) { ... },
// ... more handlers
};
// Data Bindings
const dataBindings = { ... };
// Animation Utilities
const animationUtils = { ... };nav.navbar {
div.brand { MyCompany }
div.nav-links {
a(href: "/") { Home }
a(href: "/features") { Features }
a(href: "/pricing") { Pricing }
}
}
div.hero {
h1 { Build Faster With HTMLXIFY }
p { Write 72% less code. Ship in days, not weeks. }
button.cta(β‘-call: "trackCTAClick") { Get Started }
}
div.features {
div.feature-grid {
div.feature-card {
h3 { Fast }
p { Compiles in milliseconds }
}
div.feature-card {
h3 { Simple }
p { Intuitive syntax anyone can learn }
}
div.feature-card {
h3 { Powerful }
p { Generates production-ready code }
}
}
}
footer.footer {
p { Copyright 2025 }
}
The compiler includes built-in security features:
- XSS Prevention: All user content is HTML-escaped automatically
- Attribute Validation: Prevents malicious attribute values
- Safe Defaults: Strict mode for all generated code
- No Inline Scripts: All JavaScript is external and sandboxed
# Make sure file has .HTMLXIFY extension
python cli.py myfile.HTMLXIFY output/
# Make sure output directory exists or will be created
python cli.py input.HTMLXIFY ./dist/Make sure you're using the correct syntax:
// Correct
div.my-class { ... }
div#my-id { ... }
// Wrong (won't work)
div .my-class { ... }
div #my-id { ... }
Run with --verbose flag:
python cli.py input.HTMLXIFY output/ --verbose- Start Simple: Try the Quick Start above
- Language Syntax: Read the syntax guide section
- Advanced Features: Explore β‘-call and β‘-data attributes
- Real Examples: Check
example.HTMLXIFYfor a complete demo - Test Suite: Review
tests/unit/test_parser.pyfor patterns
- Give users
HTMLXIFY.exefrom thedist/folder - Users can compile ANY
.HTMLXIFYfile with one command:HTMLXIFY.exe mysite.HTMLXIFY output/
- No Python installation, no dependencies, no configuration needed
- Compile your
.HTMLXIFYfile to get HTML, CSS, JS - Configure API URL (3 simple ways):
<!-- Option 1: Meta tag --> <meta name="api-url" content="https://api.yourdomain.com"> <!-- Option 2: Script variable --> <script>window.API_BASE_URL = 'https://api.yourdomain.com';</script> <!-- Option 3: Same domain (automatic) --> <!-- No configuration needed! Uses /api automatically -->
- Upload HTML, CSS, JS to any web server
- Done! Your site is live π
HTMLXIFY includes a professional-grade Language Server Protocol (LSP) implementation that works with any IDE:
Core Features:
- β Real-time error detection (parser diagnostics)
- β Code completion (100+ HTML tags, attributes, escape blocks, snippets)
- β Hover documentation (tags, @-call/@-data, escape blocks)
- β Document outline/symbols (tags, IDs, classes hierarchy)
- β Auto-formatting (smart indentation)
Navigation:
- β Go-to-definition (jump to ID/class definitions)
- β Find all references (locate all usages of ID/class)
- β Workspace symbol search (Ctrl+T to find symbols across files)
Editing:
- β Rename support (rename IDs/classes across document)
- β Code actions (quick fixes for void elements, missing braces)
- β Signature help (attribute hints while typing)
- β Document highlight (highlight matching symbols)
Code Intelligence:
- β Folding ranges (collapse/expand code blocks)
- β Selection range (smart expand/shrink selection)
- β Document links (clickable URLs in code)
// .vscode/settings.json
{
"htmlxify.languageServer.command": "htmlxify-lsp"
}-- init.lua
require('lspconfig').htmlxify.setup{
cmd = { 'htmlxify-lsp' },
filetypes = { 'htmlx', 'htmlxify' },
}The language server works with Sublime Text, Emacs, JetBrains IDEs, Helix, and any editor supporting LSP.
See language_server/README.md for detailed setup instructions.
# After pip install
htmlxify-lsp
# Or directly
python -m language_serverAfter installing and creating your first file:
- Create a portfolio page - Use feature cards and hero section
- Build a landing page - Try navbar, hero, features, pricing, footer
- Make it dynamic - Add β‘-call endpoints for buttons
- Deploy to internet - Upload files and configure API URL
- Share the compiler - Give others
HTMLXIFY.exeto build their own sites
Create template files you can copy and modify:
// pricing-card.HTMLXIFY
div.pricing-card {
h3 { Plan Name }
p.price { $X/month }
ul {
li { Feature 1 }
li { Feature 2 }
}
button(β‘-call: "selectPlan") { Choose }
}
img(
src: "image.jpg",
alt: "Description",
loading: "lazy"
)
form {
input(type: "email", placeholder: "Email", required: true)
input(type: "password", placeholder: "Password", required: true)
button(type: "submit") { Sign In }
}
This project is licensed under the GNU General Public License v3.0 (GPL-3.0).
See the LICENSE file for the full license text and details.
To contribute:
- Create a feature branch
- Write tests in
tests/unit/ - Submit a pull request
For questions or issues:
- Check the troubleshooting section above
- Review the example.HTMLXIFY example
- Check generated HTML/CSS/JS for clues
Happy markup writing! π
Made with β€οΈ for faster web development
HTMLXIFY - Because simpler markup means faster development. π