<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;"># Encode/Plain.pm

# ====================================================
# Autor: n.d.p. / 2001-01-07
# lm   : n.d.p. / 2001-02-25
# ====================================================
# Funktion:
#      Codierung von non-ASCII-Zeichen fuer
#      HTML
# ====================================================

use strict;

package Encode::Plain;

require 5.6.0;

use vars qw(@EXPORT %sonder %unimap $utf8);

# ====================================================
# Funktionsexport
# ====================================================

use base qw(Exporter);
@EXPORT = qw(plain multiline toUTF8);

################################
# sub plain
#
# einfache Sonderzeichen -&gt;
# Entity-Codierung
################################

sub plain ($;$) {
  my ($old,$ref)=@_;
  my $exreg;

  return \'' unless (defined $old);

  my $new=(ref ($old))?$$old:$old;;
  $ref=($ref or {});

  # Ausnahmen
  my $except=exists($ref-&gt;{-except});
  if ($except) {

    # Referenz, also Liste uebergeben -&gt; umwandeln in Regex
    if (ref ($ref -&gt; {-except})) {
      $exreg = join ('|',map {quotemeta $_} @{$ref -&gt; {-except}});}

    # keine Referenz, also Regex angegeben
    else {
      $exreg = $ref -&gt; {-except};
      $exreg =~ s/\//\\\//g;}}      # LTS :-)

  if (lc($ref-&gt;{-amp}) eq 'soft') {

    if ($except) {
      $new=~s/($exreg)|(?:\&amp;(?!(?:#[Xx][\da-fA-F]+|#\d+|[a-zA-Z]+);))/(length($1))?$1:'&amp;amp;'/eg;}

    else {
      $new=~s/\&amp;(?!(?:#[Xx][\da-fA-F]+|#\d+|[a-zA-Z]+);)/&amp;amp;/g;}}

  elsif (lc($ref-&gt;{-amp}) ne 'no') {

    if ($except) {
      $new=~s/($exreg)|\&amp;/(length($1))?$1:'&amp;amp;'/eg;}

    else {
      $new=~s/\&amp;/&amp;amp;/g;}}

    #  Weitere Zeichen
  if ($except) {
    $new =~ s/($exreg)|&lt;/(length($1))?$1:'&amp;lt;'/eg;     # HTML ausschalten
    $new =~ s/($exreg)|&gt;/(length($1))?$1:'&amp;gt;'/eg;
    $new =~ s/($exreg)|\|/(length($1))?$1:'&amp;#124;'/eg;  # nich wahr
    $new =~ s/($exreg)|"/(length($1))?$1:'&amp;quot;'/eg;   # Diese Zeile wird den Bannerklickern
                                                        # zu schaffen machen, sowas aber auch...

    # Der grosse Hash
    if ($utf8 or $ref -&gt; {-utf8}) {
      my $x;
      $new =~ s/($exreg)|([\300-\337][\200-\277]|[\340-\357][\200-\277][\200-\277])/
                length($1)?$1:(exists($unimap{$x = unpack('U',$2)})?$unimap{$x}:"&amp;#$x;")/eg;}

    $new =~ s/($exreg)|([\177-\377])/(length($1))?$1:$sonder{$2}/eg;}

  else {
    $new =~ s/&lt;/&amp;lt;/g;
    $new =~ s/&gt;/&amp;gt;/g;
    $new =~ s/\|/&amp;#124;/g;
    $new =~ s/"/&amp;quot;/g;

    # Der grosse Hash
    if ($utf8 or $ref -&gt; {-utf8}) {
      my $x;
      $new =~ s/([\300-\337][\200-\277]|[\340-\357][\200-\277][\200-\277])/
                exists($unimap{$x = unpack('U',$1)})?$unimap{$x}:"&amp;#$x;"/eg;}

    $new =~ s/([\177-\377])/$sonder{$1}/g;}

  # Zeichen &lt;= 31
  $new=~s/([\001-\010\013\014\016-\037])/'&amp;#'.ord($1).';'/eg;
  $new=~s/\000/ /g;

  # Rueckgabe
  ref($old)?\$new:$new;
}

################################
# sub multiline
#
# Whitespacecodierung
# fuer Leerzeilen
################################

sub multiline {
  my $old=shift;
  my $string=(ref ($old))?$$old:$old;

  # Zeilenumbrueche normalisieren
  $string=~s/\015\012|\015|\012/\n/g;

  # Zeilenumbrueche in &lt;br&gt; umwandeln
  $string=~s/\n/&lt;br&gt;/g;

  # mehr als ein aufeinanderfolgendes
  # Leerzeichen in feste Leerzeichen umwandeln
  $string=~s/(\s\s+)/('&amp;nbsp;' x (length($1)-1)) . ' '/eg;

  # Leerzeichen nach einem &lt;br&gt; in feste
  # Spaces umwandeln
  $string=~s/(?:^|(&lt;br&gt;))\s/$1&amp;nbsp;/g;

  # Rueckgabe
  \$string;
}

sub toUTF8 ($) {
  my $ref = shift;
  my $string = ref($ref)?$$ref:$ref;
  no warnings 'utf8';

  $string =~ tr/\x80-\xff//CU;

  ref($ref)?\$string:$string;
}

# ====================================================
# Modulinitialisierung
# ====================================================

BEGIN {
  $utf8 = 0;

  # Latin 1 + geraten
  %sonder=("\177" =&gt; '&amp;#127;',    # Delete-Zeichen
           "\200" =&gt; '&amp;#8364;',   # Euro-Zeichen
           "\201" =&gt; '&amp;uuml;',    # ue - DOS-Zeichensatz
           "\202" =&gt; '&amp;#8218;',   # einfaches Anfuehrungszeichen unten
           "\203" =&gt; '&amp;#402;',    # forte
           "\204" =&gt; '&amp;#8222;',   # doppelte Anfuehrungszeichen unten
           "\205" =&gt; '&amp;#8230;',   # drei punkte
           "\206" =&gt; '&amp;#8224;',   # dagger
           "\207" =&gt; '&amp;#8225;',   # Dagger
           "\210" =&gt; '&amp;#710;',    # circ
           "\211" =&gt; '&amp;#8240;',   # Promille
           "\212" =&gt; '&amp;#352;',    # so ein S mit Haken drueber :-)
           "\213" =&gt; '&amp;#8249;',   # lsaquo
           "\214" =&gt; '&amp;#338;',    # OE (so verhakelt - daenisch?) wer weiss das schon
           "\215" =&gt; '&amp;igrave;',  # Codepage 850;
           "\216" =&gt; '&amp;#381;',    # Z mit Haken drueber (Latin Extended B)
           "\217" =&gt; '&amp;Aring;',   # Codepage 850 (Win)
           "\220" =&gt; '&amp;uuml;',    # ue - Mac-Zeichensatz
           "\221" =&gt; "'",         # einfache Anfuehrungszeichen oben
           "\222" =&gt; "'",         # dito
           "\223" =&gt; '&amp;#8220;',   # doppelte Anfuehrungszeichen oben
           "\224" =&gt; '&amp;#8220;',   # dito
           "\225" =&gt; '&amp;#8226;',   # Bullet
           "\226" =&gt; '-',         # Bindestrich
           "\227" =&gt; '-',         # dito
           "\230" =&gt; '&amp;#732;',    # tilde...?
           "\231" =&gt; '&amp;#8482;',   # Trade-Mark
           "\232" =&gt; '&amp;#353;',    # kleines s mit Haken drueber
           "\233" =&gt; '&amp;#8250;',   # rsaquo;
           "\234" =&gt; '&amp;#339;',    # oe verhakelt
           "\235" =&gt; '&amp;#216;',    # Codepage 850 (Win)
           "\236" =&gt; '&amp;#215;',    # Codepage 850 (Win)
           "\237" =&gt; '&amp;#376;',    # Y mit Punkten drueber
           "\240" =&gt; '&amp;nbsp;',    # nbsp;
           "\241" =&gt; '&amp;#161;',    # umgedrehtes !
           "\242" =&gt; '&amp;#162;',    # cent-Zeichen
           "\243" =&gt; '&amp;pound;',   # (engl.)Pfund-Zeichen
           "\244" =&gt; '&amp;#164;',    # Waehrungszeichen
           "\245" =&gt; '&amp;yen;',     # Yen halt :-)
           "\246" =&gt; '&amp;#166;',    # eigentlich soll es wohl ein | sein .-)
           "\247" =&gt; '&amp;sect;',    # Paragraph
           "\250" =&gt; '&amp;#168;',    # zwei Punkte oben
           "\251" =&gt; '&amp;copy;',    # (C)
           "\252" =&gt; '&amp;#170;',    # hochgestelltes unterstrichenes a
           "\253" =&gt; '&amp;laquo;',   # left-pointing double angle quotation mark (besser koennte ichs auch nicht beschreiben...)
           "\254" =&gt; '&amp;#172;',    # Negationszeichen
           "\255" =&gt; '-',         # Bindestrich
           "\256" =&gt; '&amp;reg;',     # (R)
           "\257" =&gt; '&amp;szlig;',   # sz, was auch immer fuern Zeichensatz (DOS?)
           "\260" =&gt; '&amp;#176;',    # Grad-Zeichen
           "\261" =&gt; '&amp;#177;',    # Plusminus
           "\262" =&gt; '&amp;#178;',    # hoch 2
           "\263" =&gt; '&amp;#179;',    # hoch 3
           "\264" =&gt; '&amp;#8218;',   # einf. anfuehrungszeichen unten
           "\265" =&gt; '&amp;#181;',    # my-Zeichen (griech)
           "\266" =&gt; '&amp;#182;',    # Absatzzeichen
           "\267" =&gt; '&amp;#183;',    # Mal-Zeichen
           "\270" =&gt; '&amp;cedil;',
           "\271" =&gt; '&amp;sup1;',    # hoch 1
           "\272" =&gt; '&amp;#186;',    # masculine ordinal indicator (spanish)
           "\273" =&gt; '&amp;raquo;',   # right-pointing double angle quotation mark
           "\274" =&gt; '&amp;#188;',    # 1/4
           "\275" =&gt; '&amp;#189;',    # 1/2
           "\276" =&gt; '&amp;#190;',    # 3/4
           "\277" =&gt; '&amp;#191;',    # umgedrehtes ?
           "\300" =&gt; '&amp;Agrave;',
           "\301" =&gt; '&amp;Aacute;',
           "\302" =&gt; '&amp;Acirc;',
           "\303" =&gt; '&amp;Atilde;',
           "\304" =&gt; '&amp;Auml;',
           "\305" =&gt; '&amp;Aring;',
           "\306" =&gt; '&amp;AElig;',
           "\307" =&gt; '&amp;Ccedil;',
           "\310" =&gt; '&amp;Egrave;',
           "\311" =&gt; '&amp;Eacute;',
           "\312" =&gt; '&amp;Ecirc;',
           "\313" =&gt; '&amp;Euml;',
           "\314" =&gt; '&amp;Igrave;',
           "\315" =&gt; '&amp;Iacute;',
           "\316" =&gt; '&amp;Icirc;',
           "\317" =&gt; '&amp;Iuml;',
           "\320" =&gt; '&amp;ETH;',     # keine Ahnung, was das wohl sein soll, auf jeden Fall was islaendisches...
           "\321" =&gt; '&amp;Ntilde;',
           "\322" =&gt; '&amp;Ograve;',
           "\323" =&gt; '&amp;Oacute;',
           "\324" =&gt; '&amp;Ocirc;',
           "\325" =&gt; '&amp;Otilde;',
           "\326" =&gt; '&amp;Ouml;',
           "\327" =&gt; '&amp;#215;',    # eigentlich &amp;times; funzt afaik aber nicht aufm Mac (ob das hier funktioniert, weiss ich nicht)
           "\330" =&gt; '&amp;Oslash;',
           "\331" =&gt; '&amp;Ugrave;',
           "\332" =&gt; '&amp;Uacute;',
           "\333" =&gt; '&amp;Ucirc;',
           "\334" =&gt; '&amp;Uuml;',
           "\335" =&gt; '&amp;Yacute;',
           "\336" =&gt; '&amp;THORN;',
           "\337" =&gt; '&amp;szlig;',
           "\340" =&gt; '&amp;agrave;',
           "\341" =&gt; '&amp;aacute;',
           "\342" =&gt; '&amp;acirc;',
           "\343" =&gt; '&amp;atilde;',
           "\344" =&gt; '&amp;auml;',
           "\345" =&gt; '&amp;aring;',
           "\346" =&gt; '&amp;aelig;',
           "\347" =&gt; '&amp;ccedil;',
           "\350" =&gt; '&amp;egrave;',
           "\351" =&gt; '&amp;eacute;',
           "\352" =&gt; '&amp;ecirc;',
           "\353" =&gt; '&amp;euml;',
           "\354" =&gt; '&amp;igrave;',
           "\355" =&gt; '&amp;iacute;',
           "\356" =&gt; '&amp;icirc;',
           "\357" =&gt; '&amp;iuml;',
           "\360" =&gt; '&amp;eth;',
           "\361" =&gt; '&amp;ntilde;',
           "\362" =&gt; '&amp;ograve;',
           "\363" =&gt; '&amp;oacute;',
           "\364" =&gt; '&amp;ocirc;',
           "\365" =&gt; '&amp;otilde;',
           "\366" =&gt; '&amp;ouml;',
           "\367" =&gt; '&amp;divide;',
           "\370" =&gt; '&amp;oslash;',
           "\371" =&gt; '&amp;ugrave;',
           "\372" =&gt; '&amp;uacute;',
           "\373" =&gt; '&amp;ucirc;',
           "\374" =&gt; '&amp;uuml;',
           "\375" =&gt; '&amp;yacute;',
           "\376" =&gt; '&amp;thorn;',
           "\377" =&gt; '&amp;yuml;');

  # Unicode-Mapping
  %unimap=(128 =&gt; '&amp;#8364;',
           129 =&gt; '&amp;uuml;',
           130 =&gt; '&amp;#8218;',
           131 =&gt; '&amp;#402;',
           132 =&gt; '&amp;#8222;',
           133 =&gt; '&amp;#8230;',
           134 =&gt; '&amp;#8224;',
           135 =&gt; '&amp;#8225;',
           136 =&gt; '&amp;#710;',
           137 =&gt; '&amp;#8240;',
           138 =&gt; '&amp;#352;',
           139 =&gt; '&amp;#8249;',
           140 =&gt; '&amp;#338;',
           141 =&gt; '&amp;igrave;',
           142 =&gt; '&amp;#381;',
           143 =&gt; '&amp;Aring;',
           144 =&gt; '&amp;uuml;',
           145 =&gt; "'",
           146 =&gt; "'",
           147 =&gt; '&amp;#8220;',
           148 =&gt; '&amp;#8220;',
           149 =&gt; '&amp;#8226;',
           150 =&gt; '-',
           151 =&gt; '-',
           152 =&gt; '&amp;#732;',
           153 =&gt; '&amp;#8482;',
           154 =&gt; '&amp;#353;',
           155 =&gt; '&amp;#8250;',
           156 =&gt; '&amp;#339;',
           157 =&gt; '&amp;#216;',
           158 =&gt; '&amp;#215;',
           159 =&gt; '&amp;#376;',
           160 =&gt; '&amp;nbsp;',
           163 =&gt; '&amp;pound;',
           165 =&gt; '&amp;yen;',
           167 =&gt; '&amp;sect;',
           169 =&gt; '&amp;copy;',
           171 =&gt; '&amp;laquo;',
           173 =&gt; '-',
           174 =&gt; '&amp;reg;',
           175 =&gt; '&amp;szlig;',
           180 =&gt; '&amp;#8218;',
           184 =&gt; '&amp;cedil;',
           185 =&gt; '&amp;sup1;',
           187 =&gt; '&amp;raquo;',
           192 =&gt; '&amp;Agrave;',
           193 =&gt; '&amp;Aacute;',
           194 =&gt; '&amp;Acirc;',
           195 =&gt; '&amp;Atilde;',
           196 =&gt; '&amp;Auml;',
           197 =&gt; '&amp;Aring;',
           198 =&gt; '&amp;AElig;',
           199 =&gt; '&amp;Ccedil;',
           200 =&gt; '&amp;Egrave;',
           201 =&gt; '&amp;Eacute;',
           202 =&gt; '&amp;Ecirc;',
           203 =&gt; '&amp;Euml;',
           204 =&gt; '&amp;Igrave;',
           205 =&gt; '&amp;Iacute;',
           206 =&gt; '&amp;Icirc;',
           207 =&gt; '&amp;Iuml;',
           208 =&gt; '&amp;ETH;',
           209 =&gt; '&amp;Ntilde;',
           210 =&gt; '&amp;Ograve;',
           211 =&gt; '&amp;Oacute;',
           212 =&gt; '&amp;Ocirc;',
           213 =&gt; '&amp;Otilde;',
           214 =&gt; '&amp;Ouml;',
           216 =&gt; '&amp;Oslash;',
           217 =&gt; '&amp;Ugrave;',
           218 =&gt; '&amp;Uacute;',
           219 =&gt; '&amp;Ucirc;',
           220 =&gt; '&amp;Uuml;',
           221 =&gt; '&amp;Yacute;',
           222 =&gt; '&amp;THORN;',
           223 =&gt; '&amp;szlig;',
           224 =&gt; '&amp;agrave;',
           225 =&gt; '&amp;aacute;',
           226 =&gt; '&amp;acirc;',
           227 =&gt; '&amp;atilde;',
           228 =&gt; '&amp;auml;',
           229 =&gt; '&amp;aring;',
           230 =&gt; '&amp;aelig;',
           231 =&gt; '&amp;ccedil;',
           232 =&gt; '&amp;egrave;',
           233 =&gt; '&amp;eacute;',
           234 =&gt; '&amp;ecirc;',
           235 =&gt; '&amp;euml;',
           236 =&gt; '&amp;igrave;',
           237 =&gt; '&amp;iacute;',
           238 =&gt; '&amp;icirc;',
           239 =&gt; '&amp;iuml;',
           240 =&gt; '&amp;eth;',
           241 =&gt; '&amp;ntilde;',
           242 =&gt; '&amp;ograve;',
           243 =&gt; '&amp;oacute;',
           244 =&gt; '&amp;ocirc;',
           245 =&gt; '&amp;otilde;',
           246 =&gt; '&amp;ouml;',
           247 =&gt; '&amp;divide;',
           248 =&gt; '&amp;oslash;',
           249 =&gt; '&amp;ugrave;',
           250 =&gt; '&amp;uacute;',
           251 =&gt; '&amp;ucirc;',
           252 =&gt; '&amp;uuml;',
           253 =&gt; '&amp;yacute;',
           254 =&gt; '&amp;thorn;',
           255 =&gt; '&amp;yuml;');
}

# making require happy
1;

# ====================================================
# end of Encode::Plain
# ====================================================</pre></body></html>