X-Git-Url: https://git.p6c8.net/selfforum.git/blobdiff_plain/504ff3f8ee5e277c2b1bf12a7a630098eaf55f0a..ba659b53059e637777865e646f0f2a6fb7f2988e:/selfforum-cgi/shared/Encode/Plain.pm diff --git a/selfforum-cgi/shared/Encode/Plain.pm b/selfforum-cgi/shared/Encode/Plain.pm new file mode 100644 index 0000000..cf7ef06 --- /dev/null +++ b/selfforum-cgi/shared/Encode/Plain.pm @@ -0,0 +1,402 @@ +# Encode/Plain.pm + +# ==================================================== +# Autor: n.d.p. / 2001-01-07 +# lm : n.d.p. / 2001-02-06 +# ==================================================== +# Funktion: +# Codierung von non-ASCII-Zeichen fuer +# HTML +# ==================================================== + +use strict; + +package Encode::Plain; + +require 5.6.0; + +use vars qw(@ISA @EXPORT %sonder %unimap $utf8); + +# ==================================================== +# Funktionsexport +# ==================================================== + +require Exporter; +@ISA = qw(Exporter); +@EXPORT = qw(plain multiline toUTF8); + +################################ +# sub plain +# +# einfache Sonderzeichen -> +# 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->{-except}); + if ($except) { + + # Referenz, also Liste uebergeben -> umwandeln in Regex + if (ref ($ref -> {-except})) { + $exreg = join ('|',map {quotemeta $_} @{$ref -> {-except}});} + + # keine Referenz, also Regex angegeben + else { + $exreg = $ref -> {-except}; + $exreg =~ s/\//\\\//g;}} # LTS :-) + + if (lc($ref->{-amp}) eq 'soft') { + + if ($except) { + $new=~s/($exreg)|(?:\&(?!(?:#[Xx][\da-fA-F]+|#\d+|[a-zA-Z]+);))/(length($1))?$1:'&'/eg;} + + else { + $new=~s/\&(?!(?:#[Xx][\da-fA-F]+|#\d+|[a-zA-Z]+);)/&/g;}} + + elsif (lc($ref->{-amp}) ne 'no') { + + if ($except) { + $new=~s/($exreg)|\&/(length($1))?$1:'&'/eg;} + + else { + $new=~s/\&/&/g;}} + + # Weitere Zeichen + if ($except) { + $new =~ s/($exreg)|/(length($1))?$1:'>'/eg; + $new =~ s/($exreg)|\|/(length($1))?$1:'|'/eg; # nich wahr + $new =~ s/($exreg)|"/(length($1))?$1:'"'/eg; # Diese Zeile wird den Bannerklickern + # zu schaffen machen, sowas aber auch... + + # Der grosse Hash + if ($utf8 or $ref -> {-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}:"&#$x;")/eg;} + + $new =~ s/($exreg)|([\177-\377])/(length($1))?$1:$sonder{$2}/eg;} + + else { + $new =~ s//>/g; + $new =~ s/\|/|/g; + $new =~ s/"/"/g; + + # Der grosse Hash + if ($utf8 or $ref -> {-utf8}) { + my $x; + $new =~ s/([\300-\337][\200-\277]|[\340-\357][\200-\277][\200-\277])/ + exists($unimap{$x = unpack('U',$1)})?$unimap{$x}:"&#$x;"/eg;} + + $new =~ s/([\177-\377])/$sonder{$1}/g;} + + # Zeichen <= 31 + $new=~s/([\001-\010\013\014\016-\037])/'&#'.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
umwandeln + $string=~s/\n/
/g; + + # mehr als ein aufeinanderfolgendes + # Leerzeichen in feste Leerzeichen umwandeln + $string=~s/(\s\s+)/(' ' x (length($1)-1)) . ' '/eg; + + # Leerzeichen nach einem
in feste + # Spaces umwandeln + $string=~s/(?:^|(
))\s/$1 /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 { + # Latin 1 + geraten + %sonder=("\177" => '', # Delete-Zeichen + "\200" => '€', # Euro-Zeichen + "\201" => 'ü', # ue - DOS-Zeichensatz + "\202" => '‚', # einfaches Anfuehrungszeichen unten + "\203" => 'ƒ', # forte + "\204" => '„', # doppelte Anfuehrungszeichen unten + "\205" => '…', # drei punkte + "\206" => '†', # dagger + "\207" => '‡', # Dagger + "\210" => 'ˆ', # circ + "\211" => '‰', # Promille + "\212" => 'Š', # so ein S mit Haken drueber :-) + "\213" => '‹', # lsaquo + "\214" => 'Œ', # OE (so verhakelt - daenisch?) wer weiss das schon + "\215" => 'ì', # Codepage 850; + "\216" => 'Ž', # Z mit Haken drueber (Latin Extended B) + "\217" => 'Å', # Codepage 850 (Win) + "\220" => 'ü', # ue - Mac-Zeichensatz + "\221" => "'", # einfache Anfuehrungszeichen oben + "\222" => "'", # dito + "\223" => '“', # doppelte Anfuehrungszeichen oben + "\224" => '“', # dito + "\225" => '•', # Bullet + "\226" => '-', # Bindestrich + "\227" => '-', # dito + "\230" => '˜', # tilde...? + "\231" => '™', # Trade-Mark + "\232" => 'š', # kleines s mit Haken drueber + "\233" => '›', # rsaquo; + "\234" => 'œ', # oe verhakelt + "\235" => 'Ø', # Codepage 850 (Win) + "\236" => '×', # Codepage 850 (Win) + "\237" => 'Ÿ', # Y mit Punkten drueber + "\240" => ' ', # nbsp; + "\241" => '¡', # umgedrehtes ! + "\242" => '¢', # cent-Zeichen + "\243" => '£', # (engl.)Pfund-Zeichen + "\244" => '¤', # Waehrungszeichen + "\245" => '¥', # Yen halt :-) + "\246" => '¦', # eigentlich soll es wohl ein | sein .-) + "\247" => '§', # Paragraph + "\250" => '¨', # zwei Punkte oben + "\251" => '©', # (C) + "\252" => 'ª', # hochgestelltes unterstrichenes a + "\253" => '«', # left-pointing double angle quotation mark (besser koennte ichs auch nicht beschreiben...) + "\254" => '¬', # Negationszeichen + "\255" => '-', # Bindestrich + "\256" => '®', # (R) + "\257" => 'ß', # sz, was auch immer fuern Zeichensatz (DOS?) + "\260" => '°', # Grad-Zeichen + "\261" => '±', # Plusminus + "\262" => '²', # hoch 2 + "\263" => '³', # hoch 3 + "\264" => '‚', # einf. anfuehrungszeichen unten + "\265" => 'µ', # my-Zeichen (griech) + "\266" => '¶', # Absatzzeichen + "\267" => '·', # Mal-Zeichen + "\270" => '¸', + "\271" => '¹', # hoch 1 + "\272" => 'º', # masculine ordinal indicator (spanish) + "\273" => '»', # right-pointing double angle quotation mark + "\274" => '¼', # 1/4 + "\275" => '½', # 1/2 + "\276" => '¾', # 3/4 + "\277" => '¿', # umgedrehtes ? + "\300" => 'À', + "\301" => 'Á', + "\302" => 'Â', + "\303" => 'Ã', + "\304" => 'Ä', + "\305" => 'Å', + "\306" => 'Æ', + "\307" => 'Ç', + "\310" => 'È', + "\311" => 'É', + "\312" => 'Ê', + "\313" => 'Ë', + "\314" => 'Ì', + "\315" => 'Í', + "\316" => 'Î', + "\317" => 'Ï', + "\320" => 'Ð', # keine Ahnung, was das wohl sein soll, auf jeden Fall was islaendisches... + "\321" => 'Ñ', + "\322" => 'Ò', + "\323" => 'Ó', + "\324" => 'Ô', + "\325" => 'Õ', + "\326" => 'Ö', + "\327" => '×', # eigentlich × funzt afaik aber nicht aufm Mac (ob das hier funktioniert, weiss ich nicht) + "\330" => 'Ø', + "\331" => 'Ù', + "\332" => 'Ú', + "\333" => 'Û', + "\334" => 'Ü', + "\335" => 'Ý', + "\336" => 'Þ', + "\337" => 'ß', + "\340" => 'à', + "\341" => 'á', + "\342" => 'â', + "\343" => 'ã', + "\344" => 'ä', + "\345" => 'å', + "\346" => 'æ', + "\347" => 'ç', + "\350" => 'è', + "\351" => 'é', + "\352" => 'ê', + "\353" => 'ë', + "\354" => 'ì', + "\355" => 'í', + "\356" => 'î', + "\357" => 'ï', + "\360" => 'ð', + "\361" => 'ñ', + "\362" => 'ò', + "\363" => 'ó', + "\364" => 'ô', + "\365" => 'õ', + "\366" => 'ö', + "\367" => '÷', + "\370" => 'ø', + "\371" => 'ù', + "\372" => 'ú', + "\373" => 'û', + "\374" => 'ü', + "\375" => 'ý', + "\376" => 'þ', + "\377" => 'ÿ'); + + # Unicode-Mapping + %unimap=(128 => '€', + 129 => 'ü', + 130 => '‚', + 131 => 'ƒ', + 132 => '„', + 133 => '…', + 134 => '†', + 135 => '‡', + 136 => 'ˆ', + 137 => '‰', + 138 => 'Š', + 139 => '‹', + 140 => 'Œ', + 141 => 'ì', + 142 => 'Ž', + 143 => 'Å', + 144 => 'ü', + 145 => "'", + 146 => "'", + 147 => '“', + 148 => '“', + 149 => '•', + 150 => '-', + 151 => '-', + 152 => '˜', + 153 => '™', + 154 => 'š', + 155 => '›', + 156 => 'œ', + 157 => 'Ø', + 158 => '×', + 159 => 'Ÿ', + 160 => ' ', + 163 => '£', + 165 => '¥', + 167 => '§', + 169 => '©', + 171 => '«', + 173 => '-', + 174 => '®', + 175 => 'ß', + 180 => '‚', + 184 => '¸', + 185 => '¹', + 187 => '»', + 192 => 'À', + 193 => 'Á', + 194 => 'Â', + 195 => 'Ã', + 196 => 'Ä', + 197 => 'Å', + 198 => 'Æ', + 199 => 'Ç', + 200 => 'È', + 201 => 'É', + 202 => 'Ê', + 203 => 'Ë', + 204 => 'Ì', + 205 => 'Í', + 206 => 'Î', + 207 => 'Ï', + 208 => 'Ð', + 209 => 'Ñ', + 210 => 'Ò', + 211 => 'Ó', + 212 => 'Ô', + 213 => 'Õ', + 214 => 'Ö', + 216 => 'Ø', + 217 => 'Ù', + 218 => 'Ú', + 219 => 'Û', + 220 => 'Ü', + 221 => 'Ý', + 222 => 'Þ', + 223 => 'ß', + 224 => 'à', + 225 => 'á', + 226 => 'â', + 227 => 'ã', + 228 => 'ä', + 229 => 'å', + 230 => 'æ', + 231 => 'ç', + 232 => 'è', + 233 => 'é', + 234 => 'ê', + 235 => 'ë', + 236 => 'ì', + 237 => 'í', + 238 => 'î', + 239 => 'ï', + 240 => 'ð', + 241 => 'ñ', + 242 => 'ò', + 243 => 'ó', + 244 => 'ô', + 245 => 'õ', + 246 => 'ö', + 247 => '÷', + 248 => 'ø', + 249 => 'ù', + 250 => 'ú', + 251 => 'û', + 252 => 'ü', + 253 => 'ý', + 254 => 'þ', + 255 => 'ÿ'); +} + +# making require happy +1; + +# ==================================================== +# end of Encode::Plain +# ==================================================== \ No newline at end of file