Skip to content

Aquib489/htmlxify

Repository files navigation

HTMLXIFY - Web Markup Compiler

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.

🌟 What is HTMLXIFY?

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.

Before (Regular HTML):

<!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>

After (HTMLXIFY):

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.

✨ Key Features

  • βœ… 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 @-call and @-data as alternatives to ⚑-call and ⚑-data
  • βœ… Language Server - LSP support for all IDEs (VS Code, Neovim, Sublime, etc.)

πŸš€ Quick Start

Installation

Option 1: Install from PyPI (Recommended)

pip install htmlxify

Then use the command:

HTMLXIFY myfile.HTMLXIFY output/
HTMLXIFY hello.HTMLXIFY output/ --verbose  # With verbose output
HTMLXIFY --version                   # Check version
HTMLXIFY --help                      # View help

Option 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 output

Your First HTMLXIFY File

Create 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.

πŸ“– Language Syntax Guide

Basic Elements

// 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")

Classes & IDs

// Single class
div.container { ... }

// Multiple classes
button.primary.large { ... }

// IDs
div#main { ... }

// Classes and IDs together
div.card#featured { ... }

Attributes

// 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) { ... }

Escape Sequences

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 }

Escape Blocks

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

Nesting

div.container {
  h1 { Title }
  p { First paragraph }
  p { Second paragraph }
  button { Action }
}

Text Content

// 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 }
}

πŸ”₯ Advanced Features

Backend Integration

// 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 tracking
  • submitForm - Form submission handler
  • selectPlan - Plan selection
  • contactSales - Sales inquiry
  • getData - Generic data retrieval

Dynamic Data Binding

// 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');

Semantic HTML

header.navbar {
  nav { Links }
}

main {
  article.post { Content }
}

footer { Copyright }

Common Patterns

Navigation Bar

nav.navbar {
  div.brand { Logo }
  div.menu {
    a(href: "/") { Home }
    a(href: "/about") { About }
    a(href: "/contact") { Contact }
  }
}

Hero Section

div.hero {
  h1.hero-title { Welcome }
  p.hero-subtitle { Get started today }
  button.cta(⚑-call: "trackCTAClick") { Learn More }
}

Feature Grid

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 }
  }
}

Pricing Cards

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 }
  }
}

Comparison Table

table.comparison {
  thead {
    tr {
      th { Feature }
      th { Starter }
      th { Pro }
    }
  }
  tbody {
    tr {
      td { Users }
      td { Up to 10 }
      td { Unlimited }
    }
  }
}

πŸ’» CLI Usage

Basic Compilation

# 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 --help

Note: Both commands do exactly the same thing. The .exe is faster and doesn't require Python installed.

Output Files

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

πŸ“‚ Project Structure

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

πŸ§ͺ Testing

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=html

Test 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

πŸ“Š Output Examples

Generated HTML

<!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>

Generated CSS (650+ lines of defaults)

/* 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... */

Generated JavaScript

// 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 = { ... };

🎯 Real-World Examples

Complete Landing Page

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 }
}

πŸ”’ Security

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

πŸ› Troubleshooting

Issue: "File not found" error

# 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/

Issue: Classes or IDs not styling

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 { ... }

Issue: Verbose mode not showing errors

Run with --verbose flag:

python cli.py input.HTMLXIFY output/ --verbose

πŸ“š Learning Resources

  1. Start Simple: Try the Quick Start above
  2. Language Syntax: Read the syntax guide section
  3. Advanced Features: Explore ⚑-call and ⚑-data attributes
  4. Real Examples: Check example.HTMLXIFY for a complete demo
  5. Test Suite: Review tests/unit/test_parser.py for patterns

πŸš€ Distribution & Deployment

Share the Executable

  1. Give users HTMLXIFY.exe from the dist/ folder
  2. Users can compile ANY .HTMLXIFY file with one command:
    HTMLXIFY.exe mysite.HTMLXIFY output/
  3. No Python installation, no dependencies, no configuration needed

Deploy Generated Files

  1. Compile your .HTMLXIFY file to get HTML, CSS, JS
  2. 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 -->
  3. Upload HTML, CSS, JS to any web server
  4. Done! Your site is live πŸš€

πŸ–₯️ IDE Support (Language Server)

HTMLXIFY includes a professional-grade Language Server Protocol (LSP) implementation that works with any IDE:

Features (18+ LSP capabilities)

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)

VS Code Setup

// .vscode/settings.json
{
  "htmlxify.languageServer.command": "htmlxify-lsp"
}

Neovim Setup

-- init.lua
require('lspconfig').htmlxify.setup{
  cmd = { 'htmlxify-lsp' },
  filetypes = { 'htmlx', 'htmlxify' },
}

Other IDEs

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.

Running the Server

# After pip install
htmlxify-lsp

# Or directly
python -m language_server

🎯 Next Steps

After installing and creating your first file:

  1. Create a portfolio page - Use feature cards and hero section
  2. Build a landing page - Try navbar, hero, features, pricing, footer
  3. Make it dynamic - Add ⚑-call endpoints for buttons
  4. Deploy to internet - Upload files and configure API URL
  5. Share the compiler - Give others HTMLXIFY.exe to build their own sites

πŸ’‘ Tips & Tricks

Reusable Components

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 }
}

Responsive Images

img(
  src: "image.jpg",
  alt: "Description",
  loading: "lazy"
)

Form Patterns

form {
  input(type: "email", placeholder: "Email", required: true)
  input(type: "password", placeholder: "Password", required: true)
  button(type: "submit") { Sign In }
}

πŸ“„ License

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.

🀝 Contributing

To contribute:

  1. Create a feature branch
  2. Write tests in tests/unit/
  3. Submit a pull request

πŸ“ž Support

For questions or issues:

  1. Check the troubleshooting section above
  2. Review the example.HTMLXIFY example
  3. Check generated HTML/CSS/JS for clues

Happy markup writing! πŸŽ‰

Made with ❀️ for faster web development


HTMLXIFY - Because simpler markup means faster development. πŸš€

About

No description, website, or topics provided.

Resources

License

Contributing

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages