Skip to content

ui-awesome/html-helper

UI Awesome

Html Helper


PHPUnit Mutation Testing PHPStan

A powerful PHP library to simplify HTML element creation
Generate attributes, encode content, sanitize HTML, and manage CSS classes with ease.

✨ Features

Feature Overview

πŸ“¦ Installation

composer require ui-awesome/html-helper:^0.7

⚑ Quick start

Attribute key normalization

Ensures attribute keys have the correct prefix (like aria-, data-, or on), supporting strings, Enums, and Stringables.

<?php

declare(strict_types=1);

namespace App;

use UIAwesome\Html\Helper\AttributeBag;

// normalize string key (adds prefix if missing)
echo AttributeBag::normalizeKey('label', 'aria-');
// aria-label

// normalize Enum key
echo AttributeBag::normalizeKey(Data::ACTION, 'data-');
// data-action

// normalize event (flexible prefixing)
echo AttributeBag::normalizeKey('click', 'on');
// onclick

Attribute bag operations

Use AttributeBag to query and mutate an attribute array in-place with a minimal API (get(), merge(), remove(), set(), setMany()).

<?php

declare(strict_types=1);

namespace App;

use UIAwesome\Html\Helper\AttributeBag;

$attributes = ['id' => 'submit'];

// merge arrays (later values override; merge is raw β€” no key normalization or `null` filtering)
AttributeBag::merge(
    $attributes,
    [
        'class' => ['btn', 'btn-primary'],
        'type' => 'submit',
    ],
);

// get with fallback default
$type = AttributeBag::get($attributes, 'type', 'button');

// get with prefix normalization
$label = AttributeBag::get($attributes, 'label', null, 'aria-');

// remove unwanted keys
AttributeBag::remove($attributes, 'readonly');

// set values (closures are resolved)
AttributeBag::set($attributes, 'disabled', true);
AttributeBag::set($attributes, 'id', static fn () => 'submit');

// set one key (raw value)
AttributeBag::set($attributes, 'aria-label', 'Save');

// booleans for `aria`, `data`, and `on*` attributes are stored as literal strings
AttributeBag::set($attributes, 'expanded', true, 'aria-');
// $attributes['aria-expanded'] === 'true'

// set many keys at once (useful for trait-driven prefixed attributes)
AttributeBag::setMany(
    $attributes,
    [
        'data-toggle' => 'modal',
        'onclick' => 'handleClick()',
    ],
);

// remove a key explicitly
AttributeBag::remove($attributes, 'id');

Universal Stringable support

Pass your domain objects directly to helpers like Encode, Attributes, or CSSClass. The library automatically handles __toString().

<?php

declare(strict_types=1);

namespace App;

use UIAwesome\Html\Helper\Encode;

class User implements \Stringable
{
    public function __construct(private string $name) {}

    public function __toString(): string
    {
        return $this->name;
    }
}

$user = new User('<John Doe>');

// automatically casts and safely encodes
echo Encode::content($user);
// &lt;John Doe&gt;

Rendering HTML attributes

Use Attributes::render() to generate a safe, escaped HTML attribute string from an array. It automatically handles class arrays, style arrays, and data-* expansions.

<?php

declare(strict_types=1);

namespace App;

use UIAwesome\Html\Helper\Attributes;
?>

<?= Attributes::render(
    [
        'id' => 'submit-btn',
        // automatically joined
        'class' => ['btn', 'btn-primary'],
        // `true` booleans are rendered as valueless attributes
        'disabled' => true,
        // `false` booleans are skipped
        'readonly' => false,
        // JSON encoded automatically
        'data' => [
            'id' => 42,
            'options' => ['modal' => true],
        ],
        'style' => [
            'color' => '#fff',
            'margin-top' => '10px'
        ],
    ]
) ?>
// class="btn btn-primary" id="submit-btn" disabled data-id="42" data-options='{"modal":true}' style='color: #fff; margin-top: 10px;'

Advanced: DOM & SVG Integration

When working with DOMDocument, SimpleXMLElement, or other XML/SVG builders, you should not use pre-escaped strings to avoid "double escaping" (for example, &amp;lt;).

Use Attributes::normalizeAttributes() with encode: false to get a flat array of raw values ready for insertion.

use UIAwesome\Html\Helper\Attributes;

$attributes = [
    'class' => ['icon', ButtonType::PRIMARY],
    'data-config' => ['key' => '<val>'],
    'title' => '<Safe Title>',
];

// Get raw values (encode: `false`)
$rawAttributes = Attributes::normalizeAttributes($attributes, encode: false);
// [
//    'class' => 'icon btn-primary',
//    'data-config' => '{"key":"<val>"}'
//    'title' => '<Safe Title>',
// ]

// Perfect for DOMDocument
foreach ($rawAttributes as $name => $value) {
    // DOMDocument handles the escaping automatically here
    $domElement->setAttribute($name, $value);
}

Managing CSS classes

Allows you to merge, add, or override CSS classes within an attributes array smartly.

<?php

declare(strict_types=1);

namespace App;

use UIAwesome\Html\Helper\CSSClass;

$attributes = ['class' => 'base-class'];

// add new classes (merges efficiently)
CSSClass::add($attributes, ['text-center', 'mt-5']);

// override existing classes
CSSClass::add($attributes, 'alert alert-danger', true);

echo $attributes['class'];
// alert alert-danger

Encoding

Ensures your content and attribute values are safe from XSS.

<?php

declare(strict_types=1);

namespace App;

use UIAwesome\Html\Helper\Encode;

// safe Content
echo Encode::content('<script>alert("xss")</script>');
// &lt;script&gt;alert("xss")&lt;/script&gt;

// safe Attribute Value
echo Encode::value('Name "Quote"');
// Name &quot;Quote&quot;

Enum normalization

Normalizes values against a predefined set, supporting both arrays and Enums.

<?php

declare(strict_types=1);

namespace App;

use App\Enums\Status;
use UIAwesome\Html\Helper\Enum;

// normalize array of Enums
$result = Enum::normalizeArray([Status::ACTIVE, Status::INACTIVE]);
// ['active', 'inactive']

// normalize mixed array
$result = Enum::normalizeArray(['foo', Status::ACTIVE, 42]);
// ['foo', 'active', 42]

// normalize value from Enum
Enum::normalizeValue(Status::ACTIVE);
// 'active'

// normalize value from mixed
Enum::normalizeValue('foo');
// 'foo'

Form naming & IDs

Generates standard PHP form names and valid HTML IDs, handling arrayable and nested properties effortlessly.

<?php

declare(strict_types=1);

namespace App;

use UIAwesome\Html\Helper\Naming;

// generate input name (Nested)
echo Naming::generateInputName('User', 'profile[0][email]');
// User[profile][0][email]

// generate input ID (Sanitized)
echo Naming::generateInputId('User', 'profile[0][email]');
// user-profile-0-email

// convert regex to pattern
echo Naming::convertToPattern('/^[a-z]+$/i');
// ^[a-z]+$

Template rendering

Performs clean token replacement with normalized line endings.

<?php

declare(strict_types=1);

namespace App;

use UIAwesome\Html\Helper\Template;

echo Template::render("Hello, {name}!", ['{name}' => 'Yii3']);
// Hello, Yii3!

Line break normalization

Collapses multiple line breaks into a single \n, useful for cleaning up user input or generated text.

<?php

declare(strict_types=1);

namespace App;

use UIAwesome\Html\Helper\LineBreakNormalizer;

echo LineBreakNormalizer::normalize("Hello\n\n\nWorld");
// Hello\nWorld

Validation

Enforces strict types and approved values for your HTML logic.

<?php

declare(strict_types=1);

namespace App;

use UIAwesome\Html\Helper\Validator;

// validate integer-like string
$isValid = Validator::intLike('123', 0, 1000);

// validate against allowed list (supports Enums)
Validator::oneOf('sm', ['sm', 'md', 'lg'], 'size');
// passes

// validate positive-like number
$isPositive = Validator::positiveLike('42.5', 0, 100);
// true

// validate SVG offset-like values (ratio: 0..1, percent: 0%..100%)
$isOffsetValid = Validator::offsetLike('50%');
// true

πŸ“– Documentation

For detailed configuration options and advanced usage.

πŸ“‹ Package information

PHP Latest Stable Version Total Downloads

πŸ† Quality code

Codecov PHPStan Level Max Super-Linter StyleCI

🌐 Our social networks

Follow on X

πŸ“„ License

License

About

HTML helpers for PHP: attribute rendering, CSS class management, content encoding, sanitization, and template normalization.

Topics

Resources

License

Code of conduct

Contributing

Security policy

Stars

Watchers

Forks

Sponsor this project

 

Packages

 
 
 

Contributors

Languages

Generated from yii-tools/template