https://github.com/decodelabs/tagged
PHP markup generation without the fuss
https://github.com/decodelabs/tagged
html markup php tags
Last synced: about 1 year ago
JSON representation
PHP markup generation without the fuss
- Host: GitHub
- URL: https://github.com/decodelabs/tagged
- Owner: decodelabs
- License: mit
- Created: 2019-09-09T20:50:42.000Z (almost 7 years ago)
- Default Branch: develop
- Last Pushed: 2025-04-14T08:49:58.000Z (over 1 year ago)
- Last Synced: 2025-04-14T09:46:33.084Z (over 1 year ago)
- Topics: html, markup, php, tags
- Language: PHP
- Homepage:
- Size: 398 KB
- Stars: 6
- Watchers: 2
- Forks: 2
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- License: LICENSE
Awesome Lists containing this project
README
# Tagged
[](https://packagist.org/packages/decodelabs/tagged)
[](https://packagist.org/packages/decodelabs/tagged)
[](https://packagist.org/packages/decodelabs/tagged)
[](https://github.com/decodelabs/tagged/actions/workflows/integrate.yml)
[](https://github.com/phpstan/phpstan)
[](https://packagist.org/packages/decodelabs/tagged)
### PHP markup generation without the fuss.
Tagged provides a simple, powerful and beautiful way to create HTML markup without the spaghetti.
---
## Installation
```bash
composer require decodelabs/tagged
```
## Usage
Tagged uses [Veneer](https://github.com/decodelabs/veneer) to provide a unified frontage under DecodeLabs\Tagged.
You can access all the primary HTML functionality via this static frontage without compromising testing and dependency injection.
## HTML markup
Generate markup using a simple, flexible interface.
```php
use DecodeLabs\Tagged as Html;
echo Html::{'div.my-class#my-id'}('This is element content', [
'title' => 'This is a title'
]);
```
...creates:
```html
This is element content
```
Create individual tags without content:
```php
use DecodeLabs\Tagged as Html;
$tag = Html::tag('div.my-class');
echo $tag->open();
echo 'Content';
echo $tag->close();
```
Wrap HTML strings to be used where an instance of Markup is needed:
```php
use DecodeLabs\Tagged as Html;
$buffer = Html::raw('My span');
```
Dump script data to Html:
```php
yield Html::script(Html::raw(json_encode( $some_data )), [
'type' => 'application/json'
]);
```
Prepare arbitrary input for Markup output:
```php
use DecodeLabs\Tagged as Html;
$markup = Html::wrap(
function() {
yield Html::h1('My title');
},
[Html::p(['This is ', Html::strong('mixed'), ' content'])]
);
```
### Attributes
Set attributes inline:
```php
use DecodeLabs\Tagged as Html;
echo Html::{'div[data-attr=foo]'}('This is a div with an attribute');
```
Set attributes via an array:
```php
use DecodeLabs\Tagged as Html;
echo Html::{'div'}('This is a div with an attribute', [
'data-attr' => 'foo'
]);
```
Set attributes with named arguments:
```php
use DecodeLabs\Tagged as Html;
echo Html::{'div'}(
'This is a div with an attribute',
dataAttr: 'foo',
class: 'my-class'
);
```
### Nesting
You can nest elements in multiple ways:
```php
use DecodeLabs\Tagged as Html;
// Pass in nested elements via array
echo Html::div([
Html::{'span.inner1'}('Inner 1'),
' ',
Html::{'span.inner2'}('Inner 2')
]);
// Return anything and everything via a generator
echo Html::div(function($el) {
// $el is the root element
$el->addClass('container');
// Nest elements with a single call
yield Html::{'header > h1'}('This is a header');
yield Html::p('This is a paragraph');
// Set attributes inline
yield Html::{'p[data-target=open]'}('Target paragraph');
// Generator return values are rendered too
return Html::{'div.awesome'}('This is awesome!');
});
```
### Time and date
Format and wrap dates and intervals
```php
use DecodeLabs\Tagged as Html;
// Custom format
Html::$time->format('now', 'd/m/Y', 'Europe/London');
// Locale format
// When timezone is true it is fetched from Cosmos::$timezone
Html::$time->locale('now', 'long', 'long', true);
// Locale shortcuts
Html::$time->dateTime('tomorrow'); // medium
Html::$time->longTime('yesterday');
Html::$time->shortDate('yesterday');
// ...etc
// Intervals
Html::$time->since('yesterday'); // 1 day ago
Html::$time->until('tomorrow'); // 1 day from now
Html::$time->sinceAbs('yesterday'); // 1 day
Html::$time->untilAbs('yesterday'); // -1 day
Html::$time->between('yesterday', 'tomorrow'); // 1 day
```
### Media embeds
Normalize embed codes shared from media sites:
```php
use DecodeLabs\Tagged\Embed\Video;
echo Video::parse('https://www.youtube.com/watch?v=RG9TMn1FJzc');
```
## Components
Tagged also supports a higher level component abstraction allowing for more complex markup generation via the same interface. Components are called using an `@name` syntax:
```php
use DecodeLabs\Tagged as Html;
echo Html::{'@list'}($iterable, 'div.container', 'div.item', function($item) {
return Html::{'span'}($item);
});
echo Html::{'@img'}('path/to/image.jpg', 'alt text');
```
See the [components](./src/Tagged/Component) directory for a list of available components.
## Licensing
Tagged is licensed under the MIT License. See [LICENSE](./LICENSE) for the full license text.