Quiq

 view release on metacpan or  search on metacpan

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

    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
    summary => 'm',    # Kurzbeschreibung zu Details (<details>)
    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
    download => 'filename',         # a
    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/Quiq/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 => 'c'|'e'|'E'|'m'|'M'|'p'|'P'|'v'|'i' (Default: gemäß $elem)

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.602 second using v1.01-cache-2.11-cpan-d06a3f9ecfd )