Prty

 view release on metacpan or  search on metacpan

lib/Prty/Html/Tag.pm  view on Meta::CPAN

    noframes=>'m',   # (Frameset-DTD) Inhalt für nicht-framefähige Browser
    noscript=>'m',   # Inhalt für nicht-skriptfähige Browser
    object=>'m',     # einbettetes Objekt
    ol=>'m',         # nummerierte Liste
    optgroup=>'m',   # Gruppe von Optionen einer Selectliste
    option=>'v',     # Option einer Selectliste
    p=>'m',          # Absatz
    param=>'e',      # Parameter eines Object
    pre=>'p',        # Leerraum und Zeilenumbrüche erhalten
    q=>'i',          # Kurzzitat
    samp=>'i',       # Text stellt Ausgabe eines Programms dar
    script=>'c',     # Code, der vom Browser ausgeführt wird
    select=>'v',     # Auswahlmenü
    small=>'i',      # Kleinschrift
    span=>'i',       # allgemeines Inline-Element
    strong=>'i',     # stark hervorgehobener Text
    style=>'v',      # Stylesheet-Regeln
    sub=>'i',        # tiefgestellter Text
    sup=>'i',        # hochgestellter Text
    table=>'M',      # Tabelle
    tbody=>'m',      # Rumpf Tabelle
    td=>'v',         # Tabellenzelle
    textarea=>'p',   # Text-Eingabefeld
    tfoot=>'m',      # Fuß Tabelle (identisch zu tbody)
    th=>'v',         # Tabellenkopfzelle (identisch zu td)
    thead=>'m',      # Kopf Tabelle (identisch zu tbody)
    title=>'v',      # Titel HTML-Dokument
    tr=>'m',         # Tabellenzeile
    tt=>'i',         # Schreibmaschinenschrift
    ul=>'m',         # Ungeordnete Liste
    var=>'i',        # Text ist Variablenname
);

# Default-Optionen

my %DefaultOptions = (
    p => [-ignoreIfNull=>1],
    span => [-ignoreIfNull=>1],
);

# Default-Attribute von Elementen allgemein

my %DefaultAttributes = (
    # form=>[method=>'post',enctype=>'multipart/form-data'],
    img=>[alt=>''],
    script=>[type=>'text/javascript'],
    style=>[type=>'text/css'],
);

# Default-Attribute, nur XHTML

my %DefaultAttributesXhtml = (
    html=>[xmlns=>'http://www.w3.org/1999/xhtml'],
);

# Liste aller Attribute und ihrer Domänen.
# FIXME: anhand DTD überprüfen

my %Attribute = (
    'accept-charset'=>'charsets', # form
    'http-equiv'=>'cdata',        # meta
    'xml:lang'=>'languageCode',   # I18N (XHTML)
    'xml:space'=>'space',         # ENUM pre,script,style(XHTML)
    abbr=>'text',                 # Cell
    accept=>'contentTypes',       # form,input
    accesskey=>'character',       # Focus,legend
    action=>'uri',                # form
    align=>'cellAlign',           # ENUM CellAlign
    alt=>'cdata',                 # input(cdata);area,img(text)
    archive=>'uriList',           # object
    axis=>'cdata',                # Cell
    border=>'pixels',             # table
    cellpadding=>'length',        # table
    cellspacing=>'length',        # table
    char=>'character',            # CellAlign
    charoff=>'length',            # CellAlign
    charset=>'charset',           # a,link,script
    checked=>'bool',              # input
    cite=>'uri',                  # blockquote,del,ins,q
    class=>'class',               # Core
    classid=>'uri',               # object
    codebase=>'uri',              # object
    codetype=>'contentType',      # object
    cols=>'multiLengths',         # frameset(multiLengths),textarea(number)
    colspan=>'number',            # Cell
    content=>'cdata',             # meta
    coords=>'coords',             # a, area
    data=>'uri',                  # object
    datetime=>'datetime',         # del, ins
    declare=>'bool',              # object
    defer=>'bool',                # script
    dir=>'dir',                   # ENUM I18N
    disabled=>'bool',             # button,input,optgroup,option,select,
                                  # textarea
    enctype=>'contentType',       # form
    frame=>'tframe',              # ENUM table
    frameborder=>'frameBorder',   # ENUM frame, iframe
    headers=>'idrefs',            # Cell
    height=>'length',             # iframe,img,object
    href=>'uri',                  # a,area,base,link
    hreflang=>'languageCode',     # a,link
    id=>'id',                     # Core
    ismap=>'bool',                # img,input
    label=>'text',                # optgroup,option
    lang=>'languageCode',         # I18N
    longdesc=>'uri',              # frame,iframe,img
    marginheight=>'pixels',       # frame,iframe
    marginwidth=>'pixels',        # frame,iframe
    maxlength=>'number',          # input
    media=>'mediaDesc',           # ENUM link,style
    method=>'method',             # ENUM form
    multiple=>'bool',             # select
    name=>'nmtoken',              # button,input,meta,param,select,textarea,
                                  # object;form,frame,map(HTML)
    nohref=>'bool',               # area
    noresize=>'bool',             # frame
    onblur=>'script',             # Focus,select
    onchange=>'script',           # input,select,textarea
    onclick=>'script',            # Event
    ondblclick=>'script',         # Event
    onfocus=>'script',            # Focus,select
    onkeydown=>'script',          # Event
    onkeypress=>'script',         # Event
    onkeyup=>'script',            # Event
    onload=>'script',             # body,frameset
    onmousedown=>'script',        # Event
    onmousemove=>'script',        # Event
    onmouseout=>'script',         # Event
    onmouseover=>'script',        # Event
    onmouseup=>'script',          # Event
    onreset=>'script',            # form
    onselect=>'script',           # input,textarea
    onsubmit=>'script',           # form
    onunload=>'script',           # body,frameset
    profile=>'uri',               # head
    readonly=>'bool',             # input,textarea
    rel=>'linkTypes',             # ENUM a,link
    rev=>'linkTypes',             # ENUM a,link
    rows=>'multiLengths',         # frameset(multiLengths);textarea(number)
    rowspan=>'number',            # Cell
    rules=>'trules',              # ENUM table
    scheme=>'cdata',              # meta
    scope=>'scope',               # ENUM Cell
    scoped=>'bool',               # style
    scrolling=>'scrolling',       # ENUM frame,iframe
    selected=>'bool',             # option
    shape=>'shape',               # ENUM a,area
    size=>'number',               # input,select
    span=>'number',               # col,colgroup
    src=>'uri',                   # frame,iframe,img,input,script
    standby=>'text',              # object
    style=>'styleSheet',          # Core
    summary=>'text',              # table
    tabindex=>'number',           # Focus,object,select
    target=>'frameTarget',        # a,area,base,form,link
    title=>'text',                # Core,style
    type=>'ContentType',          # button(ENUM);a,link,object,param,script,
                                  # style;input(ENUM)
    usemap=>'uri',                # img,input,object
    valign=>'cellValign',         # ENUM CellAlign
    value=>'cdata',               # button,input,option,param
    valuetype=>'valueType',       # ENUM param
    width=>'length',              # iframe,img,object,table(length);
                                  # col,colgroup(multiLength)
    xmlns=>'uri',                 # html (XHTML)
);

# Attribut-Domänen (werden aktuell nicht geprüft)

my %Domain = (
    bool=>1,
    buttonType=>[qw/button reset submit/],
    cdata=>1,
    cellAlign=>[qw/center char justify left right/],
    cellValign=>[qw/baseline bottom middle top/],
    character=>1,
    charset=>1,
    charsets=>1,
    class=>1,
    contentType=>1,
    contentTypes=>1,
    coords=>1,
    datetime=>1,
    dir=>[qw/ltr rtl/],
    frameBorder=>[0,1],
    frameTarget=>1,
    id=>1,
    idrefs=>1,
    inputType=>[qw/checkbox file hidden password radio reset submit text/],
    languageCode=>1,
    length=>1,
    linkTypes=>[qw/stylesheet next prev copyright index glossary/], # unv.
    mediaDesc=>[qw/all aural braille handheld print projection screen tty tv/],
    method=>[qw/get post/],
    multiLength=>1,
    multiLengths=>1,
    nmtoken=>1,
    number=>1,
    pixels=>1,
    scope=>[qw/col colgroup row rowgroup/],
    script=>1,
    scrolling=>[qw/no yes auto/],
    shape=>[qw/circle default poly rect/],
    space=>['preserve'],
    styleSheet=>1,
    text=>1,
    tframe=>[qw/above below border box hsides lhs rhs void vsides/],
    trules=>[qw/all cols groups none rows/],
    uri=>1,
    uriList=>1,
    valueType=>[qw/data object ref/],
);

# # den Platzbdearf der Hashes ausgeben
# 
# use Devel::Size;
# my @arr = (
#     Default=>\%Default,
#     Element=>\%Element,
#     Attribute=>\%Attribute,
#     DefaultAttributes=>\%DefaultAttributes,
#     DefaultAttributesXhtml=>\%DefaultAttributesXhtml,
# );
# my $bytes = 0;
# my $str = '';
# while (@arr) {
#     my $name = shift @arr;
#     my $ref = shift @arr;
#     my $n = Devel::Size::total_size($ref);
#     $bytes += $n;
#     $str .= ', ' if $str;
#     $str .= "%$name: $n";
# }

lib/Prty/Html/Tag.pm  view on Meta::CPAN

Bette im Falle eines <img>-Tag das Bild in den HTML-Code ein.

=item -endTagOnly => $bool (Default: 0)

Erzeuge nur den Content und den End-Tag. Diese Option ist nützlich,
wenn der HTML-Code inkrementell geschrieben wird und z.B. im Fehlerfall
nur der Rest mit schließenden Tags generiert werden soll.

    my $html = $h->tag('html',
        -endTagOnly=>1,
        $h->tag('body',
            -endTagOnly=>1,
            '-',
            $h->tag('h1','Fatal Error'),
            $h->tag('pre',$msg),
        )
    );
    $http->append($html);

=item -fmt => 'e'|'m'|'p'|'v'|'i' (Default: richtet sich nach $tag)

Art der Content-Formatierung.

=over 4

=item 'e' (empty)

Element hat keinen Content (br, hr, ...)

<TAG ... />\n

=item 'E' (empty, kein NEWLINE)

Wie 'e', nur ohne NEWLINE am Ende (img, input, ...)

<TAG ... />

=item 'm' (multiline)

Content wird auf eigene Zeile(n) zwischen Begin- und End-Tag
gesetzt und um -ind=>$n Leerzeichen eingerückt. Ist der Content
leer, wird der End-Tag direkt hinter den Begin-Tag gesetzt.
(html, head, body, form, p, div, script, style, ...)

    <TAG ...>
      CONTENT
    </TAG>\n

Ist der Content leer:

    <TAG ...></TAG>

=item 'M' (multiline, ohne Einrückung)

Wie 'm', nur ohne Einrückung (html, ...)

    <TAG ...>
    CONTENT
    </TAG>\n

=item 'c' (cdata)

Wie 'm', nur dass der Content in CDATA eingefasst wird:

    <TAG ...>
      // <![CDATA[
      CONTENT
      // ]]>
    </TAG>

Der W3 HTML Validator bemängelt die Zeichen & und > dann nicht
im Content. (script)

=item 'p' (protect)

Der Content wird geschützt, indem dieser einzeilig gemacht
(LF und CR werden durch &#10; und &#13; ersetzt) und unmittelbar
zwischen Begin- und End-Tag gesetzt wird (pre, textarea, ...).

    <TAG ...>CONTENT</TAG>\n

=item 'P' (protect, Einrückung entfernen)

Wie 'p', nur dass die Einrückung des Content entfernt wird.

=item 'v' (variable)

Ist der Content einzeilig, wird er unmittelbar zwischen Begin-
und End-Tag gesetzt:

    <TAG ...>CONTENT</TAG>\n

Ist der Content mehrzeilig, wird er eingerückt:

    <TAG ...>
      CONTENT
    </TAG>\n

(title, h1-h6, ...)

=item 'i' (inline)

Der Content wird belassen wie er ist. Dies ist der Default für Tags,
die in Fließtext eingesetzt werden. Ein NEWLINE wird nicht angehängt.

    Text Text <TAG ...>Text Text
    Text</TAG> Text Text

(a, b, span, ...)

=back

Bei Wert 0 generiere keinen End-Tag bei leerem Content, sondern

    <TAG .../>

=item -ignoreIf => $bool (Default: 0)

Liefere Leerstring, wenn Bedingung $bool erfüllt ist.

=item -ignoreIfNull => $bool (Default: 0)



( run in 1.115 second using v1.01-cache-2.11-cpan-aadc1410aed )