[](https://github.com/nyarla/p5-Text-HyperScript/actions)
# NAME
Text::HyperScript - The HyperScript like library for Perl.
# SYNOPSIS
    use feature qw(say);
    use Text::HyperScript qw(h true);
    # tag only
    say h('hr');          # => '
'
    say h(script => q{}); # => ''
    # tag with content
    say h('p', 'hi,');    # => 'hi,
'
    say h('p', ['hi,']);  # => 'hi,
'
    say h('p', 'hi', h('b', ['anonymous']));  # => 'hi,anonymous
'
    say h('p', 'foo', ['bar'], 'baz');        # => 'foobarbarz
'
    # tag with attributes
    say h('hr', { id => 'foo' });                     # => '
'
    say h('hr', { id => 'foo', class => 'bar'});      # => '
'
    say h('hr', { class => ['foo', 'bar', 'baz'] });  # => '
' 
    # tag with prefixed attributes
    say h('hr', { data => { foo => 'bar' } });              # => '
'
    say h('hr', { data => { foo => [qw(foo bar baz)] } });  # => '
'
    # tag with value-less attribute
    say h('script', { crossorigin => true }, ""); # 
# DESCRIPTION
This module is a html/xml string generator like as hyperscirpt.
The name of this module contains **HyperScript**,
but this module features isn't same of another language or original implementation.
This module has submodule for some tagset:
HTML5: [Text::HyperScript::HTML5](https://metacpan.org/pod/Text%3A%3AHyperScript%3A%3AHTML5)
# FUNCTIONS
## h
This function makes html/xml text by perl code. 
This function is complex. but it's powerful.
**Arguments**:
    h($tag, [ \%attrs, $content, ...])
- `$tag`
    Tag name of element.
    This value should be `Str` value.
- `\%attrs` 
    Attributes of element.
    Result of attributes sorted by alphabetical according.
    You could pass to theses types as attribute values:
    - `Str`
        If you passed to this type, attribute value became a `Str` value.
        For example:
            h('hr', { id => 'id' }); # => '
'
    - `Text::HyperScript::Boolean`
        If you passed to this type, attribute value became a value-less attribute.
        For example:
            # `true()` returns Text::HyperScript::Boolean value as !!1 (true)
            h('script', { crossorigin => true }); # => ''
    - `ArrayRef[Str]`
        If you passed to this type, attribute value became a **sorted** (alphabetical according),
        delimited by whitespace `Str` value,
        For example:
            h('hr', { class => [qw( foo bar baz )] });
            # => '
'
    - `HashRef[ Str | ArrayRef[Str] | Text::HyperScript::Boolean ]`
        This type is a shorthand of prefixed attributes.
        For example:
            h('hr', { data => { id => 'foo', flags => [qw(bar baz)], enabled => true } });
            # => '
'
- `$contnet`
    Contents of element.
    You could pass to these types:
    - `Str`
        Plain text as content.
        This value always applied html/xml escape by [HTML::Escape#escape\_html](https://metacpan.org/pod/HTML%3A%3AEscape%23escape_html).
    - `Text::HyperScript::Element`
        Raw html/xml string as content.
        **This value does not applied html/xml escape**,
        **you should not use this type for untrusted text**.
    - `ArrayRef[ Str | Text::HyperScript::Element ]`
        The ArrayRef of `$content`.
        This type value is flatten of other `$content` value.
## text
This function returns a html/xml escaped text.
If you use untrusted stirng for display,
you should use this function for wrapping untrusted content.
## raw
This function makes a instance of `Text::HyperScript::Element`.
Instance of `Text::HyperScript::Element` has `markup` method,
that return text with html/xml markup.
The value of `Text::HyperScript::Element` is not escaped by [HTML::Escape::escape\_html](https://metacpan.org/pod/HTML%3A%3AEscape%3A%3Aescape_html),
you should not use this function for display untrusted content. 
Please use `text` instead of this function.
## true / false
This functions makes instance of `Text::HyperScript::Boolean` value.
Instance of `Text::HyperScript::Boolean` has two method like as `is_true` and `is_false`,
these method returns that value pointed `true` or `false` values.
Usage of these functions for make html5 value-less attribute.
For example:
    h('script', { crossorigin => true }, ''); # => ''
# QUESTION AND ANSWERS
## How do I get element of empty content like as \`script\`?
This case you chould gets element string by pass to empty string.
For example:
    h('script', ''); # 
## Why all attributes and attribute values sorted by alphabetical according?
This reason that gets same result on randomized orderd hash keys. 
# LICENSE
Copyright (C) OKAMURA Naoki a.k.a nyarla.
This library is free software; you can redistribute it and/or modify
it under the same terms as Perl itself.
# AUTHOR
OKAMURA Naoki a.k.a nyarla: 
# SEE ALSO
[Text::HyperScript::HTML5](https://metacpan.org/pod/Text%3A%3AHyperScript%3A%3AHTML5)