[libtext-german-perl] 01/05: [svn-inject] Installing original source of libtext-german-perl
dom at earth.li
dom at earth.li
Thu Mar 31 21:23:58 UTC 2016
This is an automated email from the git hooks/post-receive script.
dom pushed a commit to branch master
in repository libtext-german-perl.
commit 620272522ecd75429394c73db03a3e8a1f2c89c6
Author: Dominic Hargreaves <dom at earth.li>
Date: Tue Feb 26 00:04:39 2008 +0000
[svn-inject] Installing original source of libtext-german-perl
---
German.pod | 43 +++
MANIFEST | 16 +
META.yml | 10 +
Makefile.PL | 11 +
README | 28 ++
lib/Text/German.pm | 103 +++++++
lib/Text/German/Adjektiv.pm | 103 +++++++
lib/Text/German/Ausnahme.pm | 73 +++++
lib/Text/German/Cache.pm | 84 ++++++
lib/Text/German/Endung.pm | 184 ++++++++++++
lib/Text/German/Regel.pm | 578 ++++++++++++++++++++++++++++++++++++
lib/Text/German/Util.pm | 41 +++
lib/Text/German/Verb.pm | 707 ++++++++++++++++++++++++++++++++++++++++++++
lib/Text/German/Vorsilbe.pm | 105 +++++++
t/basic.t | 51 ++++
t/cache.t | 50 ++++
16 files changed, 2187 insertions(+)
diff --git a/German.pod b/German.pod
new file mode 100644
index 0000000..dc35e0f
--- /dev/null
+++ b/German.pod
@@ -0,0 +1,43 @@
+# -*- Mode: Perl -*-
+# German.pod --
+# Author : Ulrich Pfeifer
+# Created On : Tue Jul 2 11:24:15 1996
+# Last Modified By: Ulrich Pfeifer
+# Last Modified On: Sun Apr 3 11:52:51 2005
+# Language : CPerl
+# Update Count : 10
+# Status : Unknown, Use with caution!
+
+=head1 NAME
+
+Text::German - German grundform reduction
+
+=head1 SYNOPSYS
+
+C<use Text::German;>
+
+C<$stem = Text::German::reduce($word)>
+
+=head1 DESCRIPTION
+
+This is a rather incomplete implementaion of work done by Gudrun
+Putze-Meier. I have to confess that I never read her original
+paper. So all credit belongs to her, all bugs are mine. I tried to get
+some insight from an implementation of two students of mine. They
+remain anonymous because their work was the wost piece of code I ever
+saw. My code behaves mostly as their implementation did except it is
+about 75 times faster.
+
+=head1 AUTHOR
+
+Ulrich Pfeifer F<E<lt>pfeifer at wait.deE<gt>>
+
+=head1 COPYRIGHT
+
+Copyright (c) 1996 Ulrich Pfeifer. All rights reserved. This program
+is free software; you can redistribute it and/or modify it under the
+same terms as Perl itself.
+
+=head1 CHANGES
+
+0.5: Fixed copyright statement
diff --git a/MANIFEST b/MANIFEST
new file mode 100644
index 0000000..bf99d24
--- /dev/null
+++ b/MANIFEST
@@ -0,0 +1,16 @@
+German.pod
+MANIFEST
+Makefile.PL
+README
+lib/Text/German.pm
+lib/Text/German/Adjektiv.pm
+lib/Text/German/Ausnahme.pm
+lib/Text/German/Cache.pm
+lib/Text/German/Endung.pm
+lib/Text/German/Regel.pm
+lib/Text/German/Util.pm
+lib/Text/German/Verb.pm
+lib/Text/German/Vorsilbe.pm
+t/basic.t
+t/cache.t
+META.yml Module meta-data (added by MakeMaker)
diff --git a/META.yml b/META.yml
new file mode 100644
index 0000000..4cc1961
--- /dev/null
+++ b/META.yml
@@ -0,0 +1,10 @@
+# http://module-build.sourceforge.net/META-spec.html
+#XXXXXXX This is a prototype!!! It will change in the future!!! XXXXX#
+name: Text-German
+version: 0.06
+version_from: lib/Text/German.pm
+installdirs: site
+requires:
+
+distribution_type: module
+generated_by: ExtUtils::MakeMaker version 6.17
diff --git a/Makefile.PL b/Makefile.PL
new file mode 100644
index 0000000..bf87fbb
--- /dev/null
+++ b/Makefile.PL
@@ -0,0 +1,11 @@
+use ExtUtils::MakeMaker;
+# See lib/ExtUtils/MakeMaker.pm for details of how to influence
+# the contents of the Makefile that is written.
+WriteMakefile(
+ 'NAME' => 'Text::German',
+ 'VERSION_FROM' => 'lib/Text/German.pm',
+ 'LIBS' => [''], # e.g., '-lm'
+ 'DEFINE' => '', # e.g., '-DHAVE_SOMETHING'
+ 'INC' => '', # e.g., '-I/usr/include/other'
+ 'dist' => { SUFFIX => 'gz', COMPRESS => 'gzip -f' },
+);
diff --git a/README b/README
new file mode 100644
index 0000000..9e66d1e
--- /dev/null
+++ b/README
@@ -0,0 +1,28 @@
+NAME
+ Text::German - German grundform reduction
+
+SYNOPSYS
+ "use Text::German;"
+
+ "$stem = Text::German::reduce($word)"
+
+DESCRIPTION
+ This is a rather incomplete implementaion of work done by Gudrun
+ Putze-Meier. I have to confess that I never read her original paper. So
+ all credit belongs to her, all bugs are mine. I tried to get some
+ insight from an implementation of two students of mine. They remain
+ anonymous because their work was the wost piece of code I ever saw. My
+ code behaves mostly as their implementation did except it is about 75
+ times faster.
+
+AUTHOR
+ Ulrich Pfeifer <pfeifer at wait.de>
+
+COPYRIGHT
+ Copyright (c) 1996 Ulrich Pfeifer. All rights reserved. This program is
+ free software; you can redistribute it and/or modify it under the same
+ terms as Perl itself.
+
+CHANGES
+ 0.5: Fixed copyright statement
+
diff --git a/lib/Text/German.pm b/lib/Text/German.pm
new file mode 100644
index 0000000..a39f831
--- /dev/null
+++ b/lib/Text/German.pm
@@ -0,0 +1,103 @@
+#!/usr/bin/perl
+# -*- Mode: Perl -*-
+# Word.pm --
+# ITIID : $ITI$ $Header $__Header$
+# Author : Ulrich Pfeifer
+# Created On : Thu Feb 1 13:57:42 1996
+# Last Modified By: Ulrich Pfeifer
+# Last Modified On: Sun Apr 3 12:17:56 2005
+# Language : Perl
+# Update Count : 70
+# Status : Unknown, Use with caution!
+#
+
+package Text::German;
+
+$VERSION = $VERSION = 0.06;
+use Text::German::Util;
+require Text::German::Adjektiv;
+require Text::German::Ausnahme;
+require Text::German::Endung;
+require Text::German::Regel;
+require Text::German::Verb;
+require Text::German::Vorsilbe;
+require Text::German::Cache;
+
+sub partition {
+ my $word = shift;
+ my $vorsilbe = Text::German::Vorsilbe::max_vorsilbe($word);
+ my $vl = length($vorsilbe||'');
+ my $endung = Text::German::Endung::max_endung(substr($word,$vl));
+ my $el = length($endung||'');
+ my $l = length($word);
+
+ return ($vorsilbe, substr($word, $vl, $l-$vl-$el), $endung);
+}
+
+sub reduce {
+ my $word = shift;
+ my $satz_anfang = shift;
+ my @word = partition($word);
+ my @tmp;
+
+ printf "INIT %s\n", join ':', @word if $debug;
+ $word[0] ||= '';
+ $word[2] ||= '';
+
+ my $a = Text::German::Ausnahme::reduce(@word);
+ return($a) if defined $a;
+
+ my $c = wordclass($word, $satz_anfang);
+
+ unless ($c&$FUNNY || $word[2]) {
+ return $word[1];
+ }
+ if ($c & $VERB) {
+ @tmp = Text::German::Verb::reduce(@word);
+ if ($#tmp) {
+ @word = @tmp;
+ printf "VERB %s\n", join ':', @word if $debug;
+ return($word[1].'en');
+ }
+ }
+ if ($c & $ADJEKTIV) {
+ @tmp = Text::German::Adjektiv::reduce(@word);
+ if ($#tmp) {
+ @word = @tmp;
+ printf "VERB %s\n", join ':', @word if $debug;
+ return($word[1]);
+ }
+ }
+ @tmp = Text::German::Regel::reduce(@word);
+ if ($#tmp) {
+ @word = @tmp;
+ printf "REGEL %s\n", join ':', @word if $debug;
+ }
+ #return join ':', @word;
+ return $word[0].$word[1]; # vorsilbe wieder anhaengen
+}
+
+# Do not use this!
+my $cache;
+
+sub cache_reduce {
+ unless ($cache) {
+ $cache = Text::German::Cache->new(Verbose => 0,
+ Function => sub {reduce($_[0], 1); },
+ Gc => 1000,
+ Hold => 600,
+ );
+ }
+ $cache->get(@_);
+}
+
+# This is a hoax!
+sub stem {
+ my $word = shift;
+ my $gf = reduce($word, @_);
+ my @word = partition($gf);
+
+ return $word[1];
+}
+
+1;
diff --git a/lib/Text/German/Adjektiv.pm b/lib/Text/German/Adjektiv.pm
new file mode 100644
index 0000000..181857c
--- /dev/null
+++ b/lib/Text/German/Adjektiv.pm
@@ -0,0 +1,103 @@
+# -*- Mode: Perl -*-
+# Adjektiv.pm --
+# Author : Ulrich Pfeifer
+# Created On : Thu Feb 1 09:10:48 1996
+# Last Modified By: Ulrich Pfeifer
+# Last Modified On: Sun Apr 3 11:42:22 2005
+# Language : Perl
+# Update Count : 22
+# Status : Unknown, Use with caution!
+
+package Text::German::Adjektiv;
+use Text::German::Util;
+
+{
+ local ($_);
+ while (<DATA>) {
+ chomp;
+ ($adjektiv, $key) = split;
+ $ADJEKTIV{$adjektiv} = [split ':', $key];
+ }
+ close DATA;
+}
+
+sub reduce {
+ my($v,$s,$e) = @_;
+
+
+ #return undef unless $v.$s.$e =~ /$UMLAUTR/o;
+ while (1) { # algorithmus unklar
+ if (defined $ADJECTIV{$s}) {
+ return ($v, $ADJECTIV{$s}->[0], $e);
+ }
+ $s .= substr($e,0,1);
+ last unless $e;
+ $e = substr($e,1);
+ }
+ return undef;
+}
+
+1;
+__DATA__
+�lt alt:1
+�rg arg:1
+�rm arm:1
+alt alt:1
+arg arg:1
+arm arm:1
+b�ng bang:0
+bang bang:0
+bl�ss bla�:0
+bla� bla�:0
+d�mm dumm:1
+dumm dumm:1
+fr�mm fromm:0
+fromm fromm:0
+ges�nd gesund:0
+gesund gesund:0
+gl�tt glatt:0
+glatt glatt:0
+gr�� gro�:1
+gr�b grob:1
+gro� gro�:1
+grob grob:1
+h�rt hart:1
+h�ch hoch:1
+h�h hoch:1
+hart hart:1
+hoch hoch:1
+j�ng jung:1
+jung jung:1
+k�lt kalt:1
+k�rg karg:0
+k�rz kurz:1
+kalt kalt:1
+karg karg:0
+kl�g klug:1
+klug klug:1
+kr�nk krank:1
+kr�mm krumm:0
+krank krank:1
+krumm krumm:0
+kurz kurz:1
+l�ng lang:1
+lang lang:1
+n�ch nah:1
+n�h nah:1
+n�ss na�:0
+na� na�:0
+nah nah:1
+r�t rot:0
+rot rot:0
+sch�rf scharf:1
+scharf scharf:1
+schm�l schmal:0
+schmal schmal:0
+schw�ch schwach:1
+schw�rz schwarz:1
+schwach schwach:1
+schwarz schwarz:1
+st�rk stark:1
+stark stark:1
+w�rm warm:1
+warm warm:1
diff --git a/lib/Text/German/Ausnahme.pm b/lib/Text/German/Ausnahme.pm
new file mode 100644
index 0000000..95c299d
--- /dev/null
+++ b/lib/Text/German/Ausnahme.pm
@@ -0,0 +1,73 @@
+# -*- Mode: Perl -*-
+# Ausnahme.pm --
+# Author : Ulrich Pfeifer
+# Created On : Thu Feb 1 09:10:48 1996
+# Last Modified By: Ulrich Pfeifer
+# Last Modified On: Sun Apr 3 11:42:38 2005
+# Language : Perl
+# Update Count : 23
+# Status : Unknown, Use with caution!
+
+package Text::German::Ausnahme;
+
+{
+ local ($_);
+ while (<DATA>) {
+ chomp;
+ ($ausnahme, $key) = split;
+ $AUSNAHME{$ausnahme} = $key;
+ }
+ close DATA;
+}
+
+sub reduce {
+ my($v,$s,$e) = @_;
+
+ $s = $v.$s;
+ while (1) { # algorithmus unklar
+ return $AUSNAHME{$s} if defined $AUSNAHME{$s};
+ last unless $e;
+ $s .= substr($e,0,1);
+ $e = substr($e,1);
+ }
+ return undef;
+}
+
+1;
+__DATA__
+Anzeich Anzeichen
+Charakter Charakter
+Daten Daten
+Denken Denken
+Eltern Eltern
+Entwicklungsl�nd Entwicklungsland
+Frau Frau
+Gedankeng�ng Gedankengang
+Geschichte Geschichte
+Herausgeb Herausgeber
+Interess Interesse
+Italien Italien
+Jahr Jahr
+L�nd Land
+Lexika Lexikon
+Problem Problem
+Prominentenlexika Prominentenlexikon
+R�te Rat
+Rahmen Rahmen
+Recht Recht
+Sinn Sinn
+Ziel Ziel
+Zigeun Zigeuner
+Zusammenh�ng Zusammenhang
+ausgestat ausstatten
+ausstat ausstatten
+ber�cksichtig ber�cksichtigen
+direkt direkt
+entgegengesetz entgegensetzen
+entgegensetz entgegensetzen
+entwickel entwickeln
+erkannt erkennen
+hoh hoch
+kannt kennen
+kl�r kl�ren
+widerleg widerlegen
diff --git a/lib/Text/German/Cache.pm b/lib/Text/German/Cache.pm
new file mode 100644
index 0000000..62d7bb5
--- /dev/null
+++ b/lib/Text/German/Cache.pm
@@ -0,0 +1,84 @@
+# -*- Mode: Perl -*-
+# Cache.pm --
+# Author : Ulrich Pfeifer
+# Created On : Mon May 13 11:14:06 1996
+# Last Modified By: Ulrich Pfeifer
+# Last Modified On: Sun Apr 3 11:43:04 2005
+# Language : CPerl
+# Update Count : 17
+# Status : Unknown, Use with caution!
+
+package Text::German::Cache;
+
+sub new {
+ my $type = shift;
+ my $self = {};
+ my %para = @_;
+
+ $self->{Function} = $para{Function} || \&Text::German::reduce;
+ $self->{Hold} = $para{Hold} || 100;
+ $self->{Gc} = $para{Gc} || 2 * $self->{Hold};
+ $self->{Verbose} = $para{Verbose} || 0;
+ $self->{Entries} = 0;
+ $self->{Contents} = {};
+ $self->{Hit} = {};
+ $self->{Hits} = 0;
+ $self->{Misses} = 0;
+ bless $self, ref($type) || $type;
+}
+
+sub get {
+ my $self = shift;
+ my $key = shift;
+
+ if (defined $self->{Contents}->{$key}) {
+ $self->{Hits}++;
+ $self->{Hit}->{$key}++;
+ } else {
+ $self->{Misses}++;
+ $self->{Entries}++;
+ if ($self->{Entries} >= $self->{Gc}) {
+ $self->gc;
+ }
+ $self->{Contents}->{$key} = &{$self->{Function}}($key);
+ }
+ $self->{Contents}->{$key};
+}
+
+sub gc {
+ my $self = shift;
+ my %rank;
+ my $rank;
+
+ if ($self->{Verbose}) {
+ printf (STDERR "Cache: enter garbadge collect %d\n", $self->{Entries});
+ }
+ for (keys %{$self->{Contents}}) {
+ push @{$rank{$self->{Hit}->{$_}}}, $_;
+ }
+ for $rank (sort {$a <=> $b} keys %rank) {
+ for (@{$rank{$rank}}) {
+ if ($self->{Verbose}) {
+ printf (STDERR "Cache: deleting $_(%d)\n", $rank+1);
+ }
+ delete $self->{Contents}->{$_};
+ delete $self->{Hit}->{$_};
+ $self->{Entries}--;
+ }
+ # We delete a complete rank. this is more than we must do ..
+ last if $self->{Entries} <= $self->{Hold};
+ }
+ if ($self->{Verbose}) {
+ printf (STDERR "Cache: leave garbadge collect %d\n", $self->{Entries});
+ }
+}
+
+sub DESTROY {
+ my $self = shift;
+
+ if ($self->{Verbose}) {
+ printf (STDERR "\nCache Hits: %d\tMisses: %d\n", $self->{Hits}, $self->{Misses});
+ }
+}
+
+1;
diff --git a/lib/Text/German/Endung.pm b/lib/Text/German/Endung.pm
new file mode 100644
index 0000000..ad0d9b1
--- /dev/null
+++ b/lib/Text/German/Endung.pm
@@ -0,0 +1,184 @@
+# -*- Mode: Perl -*-
+# Endung.pm --
+# Author : Ulrich Pfeifer
+# Created On : Thu Feb 1 09:10:48 1996
+# Last Modified By: Ulrich Pfeifer
+# Last Modified On: Sun Apr 3 12:16:20 2005
+# Language : Perl
+# Update Count : 45
+# Status : Unknown, Use with caution!
+
+package Text::German::Endung;
+# require Exporter;
+# @ISA = qw(Exporter);
+# @EXPORT = qw(%ENDUNG);
+
+use Text::German::Util;
+{
+ local ($_);
+
+ while (<DATA>) {
+ chomp;
+ my ($endung, $key) = split;
+ my ($a,$b,$c,$d) = split ':', $key; # $c, $d nicht verwedet?
+ my $B = Text::German::Util::bit_to_int($b);
+ $ENDUNG{$endung} = [$a,$B,$c,$d];
+ }
+ close DATA;
+}
+
+sub endungen {
+ my $word = shift;
+ my $class = wordclass($word);
+ my @result;
+
+ for $i (1 .. length($word)) {
+ my $endung = substr($word, length($word)-$i,$i);
+ if (defined $ENDUNG{$endung} && defined $ENDUNG{$endung}->[1]
+ and ($ENDUNG{$endung}->[1] & $class)) {
+ push @result, $endung;
+ }
+ }
+ @result;
+}
+
+sub max_endung {
+ my $word = shift;
+ my $class = wordclass($word);
+ my $result = undef;
+
+ for $i (1 .. length($word)) {
+ my $endung = substr($word, length($word)-$i,$i);
+ if (defined $ENDUNG{$endung}
+ and ($ENDUNG{$endung}->[1] & $class)) {
+ $result = $endung
+ if !defined($result) || length($endung) > length($result);
+
+ }
+ }
+ $result;
+}
+
+sub wort_klasse {
+ my $endung = shift;
+
+ $ENDUNG{$endung}->[1];
+}
+
+sub regel {
+ my $endung = shift;
+
+ $ENDUNG{$endung}->[0];
+}
+
+1;
+# regel
+# wortklassen
+# nachfolgeregel
+__DATA__
+e 001:11100:000:000
+em 004:00100:000:000
+en 002:11101:000:010
+end 003:00010:000:011
+ende 037:00010:001:047
+endem 039:00010:004:049
+enden 038:00010:002:048
+ender 040:00010:005:050
+endere 057:00010:092:067
+enderem 059:00010:094:069
+enderen 058:00010:093:068
+enderer 060:00010:095:070
+enderes 061:00010:096:071
+endes 041:00010:007:051
+endste 077:00010:102:087
+endstem 079:00010:104:089
+endsten 078:00010:103:088
+endster 080:00010:105:090
+endstes 081:00010:106:091
+ene 032:00001:001:001
+enem 034:00001:004:004
+enen 033:00001:002:002
+ener 035:00001:005:005
+enere 052:00001:092:092
+enerem 054:00001:094:094
+eneren 053:00001:093:093
+enerer 055:00001:095:095
+eneres 056:00001:096:096
+enes 036:00001:007:007
+enste 072:00001:102:102
+enstem 074:00001:104:104
+ensten 073:00001:103:103
+enster 075:00001:105:105
+enstes 076:00001:106:106
+er 005:10100:000:000
+ere 092:00100:001:001
+erem 094:00100:004:004
+eren 093:00100:002:002
+erer 095:00100:005:005
+eres 096:00100:007:007
+ern 006:10000:000:010
+es 007:10100:000:012
+est 008:00100:000:013
+este 097:00100:001:102
+estem 099:00100:004:104
+esten 098:00100:002:103
+ester 100:00100:005:105
+estes 101:00100:007:106
+et 009:00001:000:014
+ete 042:00001:001:017
+etem 044:00001:004:019
+eten 043:00001:002:018
+eter 045:00001:005:020
+etere 062:00001:092:022
+eterem 064:00001:094:024
+eteren 063:00001:093:023
+eterer 065:00001:095:025
+eteres 066:00001:096:026
+etes 046:00001:007:021
+etste 082:00001:102:102
+etstem 084:00001:104:104
+etsten 083:00001:103:103
+etster 085:00001:105:105
+etstes 086:00001:106:106
+n 010:11000:000:000
+nd 011:00010:000:000
+nde 047:00010:001:001
+ndem 049:00010:004:004
+nden 048:00010:002:002
+nder 050:00010:005:005
+ndere 067:00010:092:092
+nderem 069:00010:094:094
+nderen 068:00010:093:093
+nderer 070:00010:095:095
+nderes 071:00010:096:096
+ndes 051:00010:007:007
+ndste 087:00010:102:102
+ndstem 089:00010:104:104
+ndsten 088:00010:103:103
+ndster 090:00010:105:105
+ndstes 091:00010:106:106
+s 012:10000:000:000
+st 013:01000:000:014
+ste 102:00100:001:017
+stem 104:00100:004:019
+sten 103:00100:002:018
+ster 105:00100:005:020
+stes 106:00100:007:021
+t 014:01001:000:000
+te 017:01001:001:001
+tem 019:00001:004:004
+ten 018:01001:002:002
+ter 020:00001:005:005
+tere 022:00001:092:092
+terem 024:00001:094:094
+teren 023:00001:093:093
+terer 025:00001:095:095
+teres 026:00001:096:096
+tes 021:00001:007:007
+test 015:01000:000:008
+teste 027:00001:097:097
+testem 029:00001:099:099
+testen 028:00001:098:098
+tester 030:00001:100:100
+testes 031:00001:101:101
+tet 016:01000:000:009
diff --git a/lib/Text/German/Regel.pm b/lib/Text/German/Regel.pm
new file mode 100644
index 0000000..65be93f
--- /dev/null
+++ b/lib/Text/German/Regel.pm
@@ -0,0 +1,578 @@
+# -*- Mode: Perl -*-
+# Regel.pm --
+# Author : Ulrich Pfeifer
+# Created On : Thu Feb 1 09:10:48 1996
+# Last Modified By: Ulrich Pfeifer
+# Last Modified On: Sun Apr 3 12:11:51 2005
+# Language : Perl
+# Update Count : 73
+# Status : Unknown, Use with caution!
+
+package Text::German::Regel;
+use Text::German::Util;
+
+$debug = 0;
+ at REGEL = (); # -w
+
+{
+ local ($_);
+
+ while (<DATA>) {
+ chomp;
+ my ($regel, $a,$b,$c,$d,$e, at f) = split(/:/, $_);
+ next unless $regel;
+ push(@{$REGEL[$regel]}, [$a,
+ $b,
+ $c,
+ bit_to_int($d),
+ bit_to_int($e),
+ @f]);
+ }
+ close DATA;
+}
+sub reduce {
+ my($v,$s,$e) = @_;
+ #my $init = join ':', ($v,$s,$e);
+ #local ($debug) = ($s eq 'Mit')?4:0;
+
+ return undef if length($s.$e) < 3;
+ while (length($s)<3) {
+ $s .= substr($e,0,1);
+ $e = substr($e,1);
+ }
+ while (1) {
+ my @tmp = reduce1($v,$s,$e);
+ if ($#tmp) {
+ my $tmp = join ':', @tmp;
+ #print STDERR "$init => $tmp\n";
+ return @tmp; # if $tmp ne $init;
+ }
+ return @tmp if !$e;
+ $s .= substr($e,0,1);
+ $e = substr($e,1);
+ }
+}
+
+sub reduce1 {
+ my($v,$s,$e) = @_;
+ my $fc;
+ my $fr;
+ my $did_match;
+
+ while (1) {
+ $fr = Text::German::Endung::regel($e); # || '001'; # ???
+ last if defined $fr;
+ last unless $e;
+ $s .= substr($e,0,1);
+ $e = substr($e,1);
+ }
+ return undef unless $fr;
+ $fc = Text::German::Endung::wort_klasse($e);
+
+ ruleset:
+ while (defined $REGEL[$fr]) {
+ for $r (@{$REGEL[$fr]}) {
+ next unless $r->[4] | $fc; # allowed wordclasses
+ my $match = $r->[5];
+ $match =~ s/\+/[bcdfghjklmnpqrstvwxyz]/;
+ $match =~ s/\%/[aeiou\344\366\374]/;
+ #my $ns = $s.$e;
+ #$ns = substr($ns,0,length($ns)-$r->[1]);
+ #$e = substr($e, length($e)-$r->[1]);
+ print "\tREGEL: $fr:", (join ':', @{$r}),"\t($s,$match)\n"
+ if $debug > 1;
+ if ($s =~ /$match$/) {
+ $did_match++;
+ print "\tREGEL: $fr:", (join ':', @{$r}),"\t$s => "
+ if $debug;
+ $s = (substr($s,0,length($s)-$r->[7])) if $r->[7];
+ $s .= $r->[8] if $r->[8];
+ print "$s\n" if $debug;
+ if ($r->[6]) { # vorsilbe 'ge' kann entfallen?
+ $v =~ s/^ge//;
+ }
+ $fr = $r->[0];
+ $fc = $r->[3]; # ???
+ if ($fr ne '000') {
+ next ruleset;
+ } else {
+ #$s = substr($s,0,length($s)-$r->[1]);
+ last;
+ }
+ }
+ }
+ last;
+ }
+ if ($did_match) {
+ return ($v,$s,$e);
+ } else {
+ return undef;
+ }
+}
+
+1;
+
+# regel
+# 0 Folgeregel
+# 1 # zeichen entfernen
+# 2
+# 3 new wc
+# 4 KLASSE fuer match
+# 5 MATCH
+# 6 vorsilbe ge
+# 7 #chars to remove
+# 8 string to append
+# 017:000:2:te:01001:01001:�nn:1:3:ann
+__DATA__
+001:000:1:e:11100:00100:isch:0:0:
+001:000:1:e:11100:10100:icht:0:0:
+001:000:1:e:11100:10100:sch:0:0:
+001:000:1:e:11100:00100:haft:0:0:
+001:000:1:e:11100:00100:lich:0:0:
+001:000:1:e:11100:00100:voll:0:0:
+001:000:1:e:11100:10100:wert:0:0:
+001:000:1:e:11100:10000:bold:0:0:
+001:000:1:e:11100:10000:ling:0:0:
+001:000:1:e:11100:10000:rich:0:0:
+001:000:1:e:11100:10000:werk:0:0:
+001:000:1:e:11100:00100:reich:0:0:
+001:000:1:e:11100:10100:ond:0:0:e
+001:000:1:e:11100:10000:iss:0:1:
+001:000:1:e:11100:00100:abl:0:2:bel
+001:000:1:e:11100:00100:ant:0:0:
+001:000:1:e:11100:00100:ell:0:0:
+001:000:1:e:11100:00100:ent:0:0:
+001:000:1:e:11100:00100:esk:0:0:
+001:000:1:e:11100:00100:ibl:0:2:bel
+001:000:1:e:11100:10100:ff:0:0:
+001:000:1:e:11100:00100:los:0:0:
+001:000:1:e:11100:00100:sam:0:0:
+001:000:1:e:11100:10100:sal:0:0:
+001:000:1:e:11100:01000:ifizier:0:0:en
+001:000:1:e:11100:01000:isier:0:0:en
+001:000:1:e:11100:10100:weis:0:0:e
+001:000:1:e:11100:10000:zeug:0:0:
+001:000:1:e:11100:10100:�r:0:0:
+001:000:1:e:11100:10100:oid:0:0:
+001:000:1:e:11100:00100:�s:0:0:
+001:000:1:e:11100:10000:�l:0:3:al
+001:000:1:e:11100:10000:eur:0:0:
+001:000:1:e:11100:10000:ier:0:0:
+001:000:1:e:11100:10100:ad:0:0:e
+001:000:1:e:11100:10100:od:0:0:e
+001:000:1:e:11100:10100:ud:0:0:e
+001:000:1:e:11100:10100:ed:0:0:
+001:000:1:e:11100:10100:id:0:0:
+001:000:1:e:11100:10100:ig:0:0:
+001:000:1:e:11100:10100:al:0:0:
+001:000:1:e:11100:10100:er:0:0:
+001:000:1:e:11100:00100:ig:0:0:
+001:000:1:e:11100:00100:iv:0:0:
+001:000:1:e:11100:00100:os:0:0:
+001:000:1:e:11100:10000:an:0:0:
+001:000:1:e:11100:10100:ar:0:0:
+001:000:1:e:11100:10000:at:0:0:
+001:000:1:e:11100:10100:%b:0:0:e
+001:000:1:e:11100:10100:c:0:0:e
+001:000:1:e:11100:10000:�ng:0:3:ang
+001:000:1:e:11100:10100:g:0:0:e
+001:000:1:e:11100:10100:f:0:0:e
+001:000:1:e:11100:00100:frei:0:0:
+001:000:1:e:11100:10100:i:0:0:e
+001:000:1:e:11100:10000:ys:0:0:e
+001:000:1:e:11100:10000:st�nd:0:3:and
+001:000:1:e:11100:10000::0:0:e
+002:010:2:en:11101:00100:isch:0:0:
+002:010:2:en:11101:10100:icht:0:0:
+002:010:2:en:11101:10100:schaft:0:0:
+002:010:2:en:11101:00100:haft:0:0:
+002:010:2:en:11101:00100:lich:0:0:
+002:010:2:en:11101:00100:voll:0:0:
+002:010:2:en:11101:10100:wert:0:0:
+002:010:2:en:11101:10000:bold:0:0:
+002:010:2:en:11101:10000:ling:0:0:
+002:010:2:en:11101:10000:niss:0:1:
+002:010:2:en:11101:10000:rich:0:0:
+002:010:2:en:11101:10000:werk:0:0:
+002:010:2:en:11101:00100:reich:0:0:
+002:010:2:en:11101:10000:ism:0:0:us
+002:010:2:en:11101:00100:abl:0:2:bel
+002:010:2:en:11101:10100:ant:0:0:
+002:010:2:en:11101:00100:ell:0:0:
+002:010:2:en:11101:00100:ent:0:0:
+002:010:2:en:11101:00100:esk:0:0:
+002:010:2:en:11101:00100:ibl:0:2:bel
+002:010:2:en:11101:10000:anz:0:0:
+002:010:2:en:11101:10000:enz:0:0:
+002:010:2:en:11101:10000:inn:0:1:
+002:010:2:en:11101:10000:ist:0:0:
+002:010:2:en:11101:10000:ung:0:0:
+002:010:2:en:11101:10100:amm:0:0:
+002:010:2:en:11101:10100:rn:0:0:
+002:010:2:en:11101:10100:mp:0:0:e
+002:010:2:en:11101:10100:tr:0:0:um
+002:010:2:en:11101:10100:los:0:0:
+002:010:2:en:11101:00100:sam:0:0:
+002:010:2:en:11101:10100:sal:0:0:
+002:010:2:en:11101:10000:hem:0:0:a
+002:010:2:en:11101:01000:ifizier:0:0:en
+002:010:2:en:11101:01000:isier:0:0:en
+002:010:2:en:11101:10000:it�t:0:0:
+002:010:2:en:11101:10000:heit:0:0:
+002:010:2:en:11101:10000:keit:0:0:
+002:010:2:en:11101:10000:zeug:0:0:
+002:010:2:en:11101:10100:oid:0:0:
+002:010:2:en:11101:00100:�s:0:0:
+002:010:2:en:11101:10100:�r:0:0:
+002:010:2:en:11101:10000:�l:0:3:al
+002:010:2:en:11101:10100:eur:0:0:
+002:010:2:en:11101:10100:eus:0:0:e
+002:010:2:en:11101:10000:ier:0:0:
+002:010:2:en:11101:01000:ier:0:0:en
+002:010:2:en:11101:10000:ion:0:0:
+002:010:2:en:11101:11100:eid:0:0:en
+002:010:2:en:11101:11100:iem:0:0:en
+002:010:2:en:11101:10100:al:0:0:
+002:010:2:en:11101:10100:er:0:0:
+002:010:2:en:11101:00100:ig:0:0:
+002:010:2:en:11101:00100:iv:0:0:
+002:010:2:en:11101:00100:os:0:0:
+002:010:2:en:11101:10100:ad:0:0:e
+002:010:2:en:11101:10100:an:0:0:
+002:010:2:en:11101:10100:ar:0:0:
+002:010:2:en:11101:10100:at:0:0:
+002:010:2:en:11101:10000:ik:0:0:
+002:010:2:en:11101:10000:or:0:0:
+002:010:2:en:11101:10100:id:0:0:
+002:010:2:en:11101:10100:od:0:0:e
+002:010:2:en:11101:10100:ud:0:0:e
+002:010:2:en:11101:10100:em:0:0:
+002:010:2:en:11101:10100:op:0:0:
+002:010:2:en:11101:10100:ur:0:0:
+002:010:2:en:11101:10000:radi:0:0:us
+002:010:2:en:11101:10000:di:0:0:um
+002:010:2:en:11101:00100:frei:0:0:
+002:010:2:en:11101:10000:ei:0:0:
+002:010:2:en:11101:10100:i:0:0:e
+002:010:2:en:11101:10100:e:0:0:e
+002:010:2:en:11101:10000:ys:0:0:e
+002:010:2:en:11101:10000:wes:0:0:en
+002:010:2:en:11101:10000:Wes:0:0:en
+002:010:2:en:11101:10000:orm:0:0:
+002:010:2:en:11101:10000:�ng:0:3:ang
+003:011:3:end:00010:00010::0:0:en
+004:000:2:em:00100:00100:isch:0:0:
+004:000:2:em:00100:00100:haft:0:0:
+004:000:2:em:00100:00100:lich:0:0:
+004:000:2:em:00100:00100:voll:0:0:
+004:000:2:em:00100:00100:wert:0:0:
+004:000:2:em:00100:00100:reich:0:0:
+004:000:2:em:00100:00100:abl:0:2:bel
+004:000:2:em:00100:00100:ant:0:0:
+004:000:2:em:00100:00100:ell:0:0:
+004:000:2:em:00100:00100:ent:0:0:
+004:000:2:em:00100:00100:esk:0:0:
+004:000:2:em:00100:00100:ibl:0:2:bel
+004:000:2:em:00100:00100:los:0:0:
+004:000:2:em:00100:00100:sam:0:0:
+004:000:2:em:00100:00100:�r:0:0:
+004:000:2:em:00100:00100:oid:0:0:
+004:000:2:em:00100:00100:�s:0:0:
+004:000:2:em:00100:00100:al:0:0:
+004:000:2:em:00100:00100:ar:0:0:
+004:000:2:em:00100:00100:er:0:0:
+004:000:2:em:00100:00100:ig:0:0:
+004:000:2:em:00100:00100:iv:0:0:
+004:000:2:em:00100:00100:os:0:0:
+004:000:2:em:00100:00100:frei:0:0:
+005:000:2:er:10100:00100:isch:0:0:
+005:000:2:er:10100:00100:haft:0:0:
+005:000:2:er:10100:00100:lich:0:0:
+005:000:2:er:10100:00100:voll:0:0:
+005:000:2:er:10100:00100:wert:0:0:
+005:000:2:er:10100:00100:reich:0:0:
+005:000:2:er:10100:00100:abl:0:2:bel
+005:000:2:er:10100:00100:ant:0:0:
+005:000:2:er:10100:00100:ell:0:0:
+005:000:2:er:10100:00100:ent:0:0:
+005:000:2:er:10100:00100:esk:0:0:
+005:000:2:er:10100:00100:ibl:0:2:bel
+005:000:2:er:10100:00100:los:0:0:
+005:000:2:er:10100:00100:sam:0:0:
+005:000:2:er:10100:00100:�r:0:0:
+005:000:2:er:10100:00100:oid:0:0:
+005:000:2:er:10100:00100:�s:0:0:
+005:000:2:er:10100:00100:al:0:0:
+005:000:2:er:10100:00100:ar:0:0:
+005:000:2:er:10100:00100:ig:0:0:
+005:000:2:er:10100:00100:iv:0:0:
+005:000:2:er:00100:00100:os:0:0:
+005:000:2:er:00100:00100:frei:0:0:
+005:000:2:er:00100:10000:ust:0:0:er
+006:010:3:ern:10000:10000::0:0:
+007:012:2:es:10100:10100:niss:0:1:
+007:012:2:es:10100:10100:abl:0:2:bel
+007:012:2:es:10100:10100:ibl:0:2:bel
+007:012:2:es:10100:10100:cod:0:0:es
+007:012:2:es:10100:10100:mod:0:0:es
+007:012:2:es:10100:10100:iz:0:2:ex
+007:012:2:es:10100:10100:ei:0:0:
+007:012:2:es:10100:10100:i:0:0:es
+007:012:2:es:10100:10100::0:0:
+008:013:3:est:00100:00100:cht:0:0:en
+008:013:3:est:00100:00100:haft:0:0:
+008:013:3:est:00100:00100:wert:0:0:
+008:013:3:est:00100:00100:ant:0:0:
+008:013:3:est:00100:00100:ent:0:0:
+008:013:3:est:00100:00100:los:0:0:
+008:013:3:est:00100:00100:oid:0:0:
+008:013:3:est:00100:00100:�s:0:0:
+008:013:3:est:00100:00100:os:0:0:
+008:013:3:est:00100:00100:n:0:0:en
+008:013:3:est:00100:00100:frei:0:0:
+009:014:2:et:00001:00001:cht:1:0:en
+009:014:2:et:00001:00001:magn:0:0:et
+009:014:2:et:00001:00001:n:1:0:en
+009:014:2:et:00001:00001:eit:1:0:en
+010:000:1:n:11000:10000:enser:0:0:
+010:000:1:n:11000:10000:aner:0:0:
+010:000:1:n:11000:10000:iker:0:0:
+010:000:1:n:11000:10000:iner:0:0:
+010:000:1:n:11000:10000:ler:0:0:
+010:000:1:n:11000:10000:ner:0:0:
+010:000:1:n:11000:10000:el:0:0:
+010:000:1:n:11000:10000:er:0:0:
+010:000:1:n:11000:01000:el:0:0:n
+010:000:1:n:11000:01000:er:0:0:n
+010:000:1:n:11000:10000:io:0:0:n
+010:000:1:n:11000:10000::0:0:
+
+011:000:2:nd:00010:00010::0:0:nd
+012:000:1:s:10000:10000:wach:0:0:s
+012:000:1:s:10000:10000:llap:0:0:s
+012:000:1:s:10000:10000:pul:0:0:s
+012:000:1:s:10000:10000:seit:0:0:s
+012:000:1:s:10000:10000:s:0:0:s
+012:000:1:s:10000:10000:gla:0:0:s
+012:000:1:s:10000:10000:ga:0:0:s
+012:000:1:s:10000:10000:lo:0:0:s
+012:000:1:s:10000:10000:�:0:0:s
+012:000:1:s:10000:10000:au:0:0:
+012:000:1:s:10000:10000:i:0:0:s
+012:000:1:s:10000:10000:u:0:0:s
+012:000:1:s:10000:10000::0:0:
+013:014:2:st:01000:01000:isch:0:0:
+013:014:2:st:01000:01000:lich:0:0:
+013:014:2:st:01000:01000:voll:0:0:
+013:014:2:st:01000:01000:reich:0:0:
+013:014:2:st:01000:01000:ell:0:0:
+013:014:2:st:01000:01000:esk:0:0:
+013:014:2:st:01000:01000:abel:0:0:
+013:014:2:st:01000:01000:ibel:0:0:
+013:014:2:st:01000:01000:sam:0:0:
+013:014:2:st:01000:01000:�r:0:0:
+013:014:2:st:01000:01000:ier:0:0:en
+013:014:2:st:01000:01000:al:0:0:
+013:014:2:st:01000:01000:er:0:0:
+013:014:2:st:01000:01000:ig:0:0:
+013:014:2:st:01000:01000:iv:0:0:
+013:014:2:st:01000:01000:el:0:0:en
+013:014:2:st:01000:01000:er:0:0:en
+014:000:1:t:01001:01001:haf:0:0:t
+014:000:1:t:01001:01001:wer:0:0:t
+014:000:1:t:01001:01001:ier:1:0:en
+014:000:1:t:01001:01001:en:0:0:t
+014:000:1:t:01001:01001:an:0:0:t
+014:000:1:t:01001:01001:er:1:0:n
+014:000:1:t:01001:01001:el:1:0:n
+014:000:1:t:01001:01001:ig:1:0:en
+014:000:1:t:01001:01001:t:0:0:t
+014:000:1:t:01001:01001:%:0:0:t
+014:000:1:t:01001:01001::1:0:en
+015:008:4:test:01000:01000:ier:0:0:en
+015:008:4:test:01000:01000:er:0:0:n
+015:008:4:test:01000:01000:el:0:0:n
+015:008:4:test:01000:01000:ig:0:0:en
+015:008:4:test:01000:01000:s:0:0:en
+015:008:4:test:01000:01000:+me:0:0:n
+015:008:4:test:01000:01000:+ne:0:0:n
+015:008:4:test:01000:01000:te:0:0:n
+015:008:4:test:01000:01000:de:0:0:n
+016:009:3:tet:01000:01000:ier:0:0:en
+016:009:3:tet:01000:01000:er:0:0:n
+016:009:3:tet:01000:01000:el:0:0:n
+016:009:3:tet:01000:01000:ig:0:0:en
+016:009:3:tet:01000:01000:s:0:0:en
+016:009:3:tet:01000:01000:+me:0:0:n
+016:009:3:tet:01000:01000:+ne:0:0:n
+016:009:3:tet:01000:01000:te:0:0:n
+016:009:3:tet:01000:01000:de:0:0:n
+017:001:2:te:01001:01001:ier:1:0:en
+017:001:2:te:01001:01001:er:1:0:n
+017:001:2:te:01001:01001:el:1:0:n
+017:001:2:te:01001:01001:ig:1:0:en
+018:002:3:ten:01001:01001:ier:1:0:en
+018:002:3:ten:01001:01001:%er:1:0:en
+018:002:3:ten:01001:01001:er:1:0:n
+018:002:3:ten:01001:01001:el:1:0:n
+018:002:3:ten:01001:01001:%g:1:0:en
+018:002:3:ten:01001:01001:ei:0:0:ten
+018:002:3:ten:01001:01001:i:1:0:t
+019:004:3:tem:00001:00001:wer:0:0:t
+019:004:3:tem:00001:00001:haf:0:0:t
+019:004:3:tem:00001:00001:en:0:0:t
+019:004:3:tem:00001:00001:an:0:0:t
+019:004:3:tem:00001:00001::1:0:en
+020:005:3:ter:00001:00001::1:0:en
+021:007:3:tes:00001:00001::1:0:en
+022:092:4:tere:00001:00001::1:0:en
+023:093:5:teren:00001:00001::1:0:en
+024:094:5:terem:00001:00001::1:0:en
+025:095:5:terer:00001:00001::1:0:en
+026:096:5:teres:00001:00001::1:0:en
+027:097:5:teste:00001:00001::1:0:en
+028:098:6:testen:00001:00001::1:0:en
+029:099:6:testem:00001:00001::1:0:en
+030:100:6:tester:00001:00001::1:0:en
+031:101:6:testes:00001:00001::1:0:en
+032:001:3:ene:00001: : : : :
+033:002:4:enen:00001: : : : :
+034:004:4:enem:00001: : : : :
+035:005:4:ener:00001: : : : :
+036:007:4:enes:00001: : : : :
+037:047:4:ende:00010:00010::0:0:end
+038:048:5:enden:00010:00010::0:0:end
+039:049:5:endem:00010:00010::0:0:end
+040:050:5:ender:00010:00010::0:0:end
+041:051:5:endes:00010:00010::0:0:en
+042:017:3:ete:00001:00001:+m:1:0:en
+042:017:3:ete:00001:00001:+n:1:0:en
+042:017:3:ete:00001:00001:t:1:0:en
+042:017:3:ete:00001:00001:d:1:0:en
+043:018:4:eten:00001:00001:+m:1:0:en
+043:018:4:eten:00001:00001:+n:1:0:en
+043:018:4:eten:00001:00001:t:1:0:en
+043:018:4:eten:00001:00001:d:1:0:en
+043:018:4:eten:00001:00001:a:0:0:et
+043:018:4:eten:00001:00001:i:0:0:eten
+044:019:4:etem:00001:00001:+m:1:0:en
+044:019:4:etem:00001:00001:+n:1:0:en
+044:019:4:etem:00001:00001:t:1:0:en
+044:019:4:etem:00001:00001:d:1:0:en
+045:020:4:eter:00001:00001:+m:1:0:en
+045:020:4:eter:00001:00001:+n:1:0:en
+045:020:4:eter:00001:00001:t:1:0:en
+045:020:4:eter:00001:00001:d:1:0:en
+046:021:4:etes:00001:00001:+m:1:0:en
+046:021:4:etes:00001:00001:+n:1:0:en
+046:021:4:etes:00001:00001:t:1:0:en
+046:021:4:etes:00001:00001:d:1:0:en
+047:001:3:nde:00010:00010:r:0:0:nd
+047:001:3:nde:00010:00010:l:0:0:nd
+048:002:4:nden:00010:00010:r:0:0:nd
+048:002:4:nden:00010:00010:l:0:0:nd
+049:004:4:ndem:00010:00010:r:0:0:nd
+049:004:4:ndem:00010:00010:l:0:0:nd
+050:005:4:nder:00010:00010:r:0:0:nd
+050:005:4:nder:00010:00010:l:0:0:nd
+051:007:4:ndes:00010:00010:r:0:0:nd
+051:007:4:ndes:00010:00010:l:0:0:nd
+052:092:5:enere:00001: : : : :
+053:093:6:eneren:00001: : : : :
+054:094:6:enerem:00001: : : : :
+055:095:6:enerer:00001: : : : :
+056:096:6:eneres:00001: : : : :
+057:067:6:endere:00010:00010::0:0:end
+058:068:7:enderen:00010:00010::0:0:end
+059:069:7:enderem:00010:00010::0:0:end
+060:070:7:enderer:00010:00010::0:0:end
+061:071:7:enderes:00010:00010::0:0:end
+062:022:5:etere:00001:00001:+m:1:0:en
+062:022:5:etere:00001:00001:+n:1:0:en
+062:022:5:etere:00001:00001:t:1:0:en
+062:022:5:etere:00001:00001:d:1:0:en
+063:023:6:eteren:00001:00001:+m:1:0:en
+063:023:6:eteren:00001:00001:+n:1:0:en
+063:023:6:eteren:00001:00001:t:1:0:en
+063:023:6:eteren:00001:00001:d:1:0:en
+064:024:6:eterem:00001:00001:+m:1:0:en
+064:024:6:eterem:00001:00001:+n:1:0:en
+064:024:6:eterem:00001:00001:t:1:0:en
+064:024:6:eterem:00001:00001:d:1:0:en
+065:025:6:eterer:00001:00001:+m:1:0:en
+065:025:6:eterer:00001:00001:+n:1:0:en
+065:025:6:eterer:00001:00001:t:1:0:en
+065:025:6:eterer:00001:00001:d:1:0:en
+066:026:6:eteres:00001:00001:+m:1:0:en
+066:026:6:eteres:00001:00001:+n:1:0:en
+066:026:6:eteres:00001:00001:t:1:0:en
+066:026:6:eteres:00001:00001:d:1:0:en
+067:092:5:ndere:00010:00010:r:0:0:nd
+067:092:5:ndere:00010:00010:l:0:0:nd
+068:093:6:nderen:00010:00010:r:0:0:nd
+068:093:6:nderen:00010:00010:l:0:0:nd
+069:094:6:nderem:00010:00010:r:0:0:nd
+069:094:6:nderem:00010:00010:l:0:0:nd
+070:095:6:nderer:00010:00010:r:0:0:nd
+070:095:6:nderer:00010:00010:l:0:0:nd
+071:096:6:nderes:00010:00010:r:0:0:nd
+071:096:6:nderes:00010:00010:l:0:0:nd
+072:102:5:enste:00001: : : : :
+073:103:6:ensten:00001: : : : :
+074:104:6:enstem:00001: : : : :
+075:105:6:enster:00001: : : : :
+076:106:6:enstes:00001: : : : :
+077:087:6:endste:00010:00010::0:0:end
+078:088:7:endsten:00010:00010::0:0:end
+079:079:7:endstem:00010:00010::0:0:end
+080:090:7:endster:00010:00010::0:0:end
+081:091:7:endstes:00010:00010::0:0:end
+082:102:5:etste:00001:00001:+m:1:0:en
+082:102:5:etste:00001:00001:+n:1:0:en
+082:102:5:etste:00001:00001:t:1:0:en
+082:102:5:etste:00001:00001:d:1:0:en
+083:103:6:etsten:00001:00001:+m:1:0:en
+083:103:6:etsten:00001:00001:+n:1:0:en
+083:103:6:etsten:00001:00001:t:1:0:en
+083:103:6:etsten:00001:00001:d:1:0:en
+084:104:6:etstem:00001:00001:+m:1:0:en
+084:104:6:etstem:00001:00001:+n:1:0:en
+084:104:6:etstem:00001:00001:t:1:0:en
+084:104:6:etstem:00001:00001:d:1:0:en
+085:105:6:etster:00001:00001:+m:1:0:en
+085:105:6:etster:00001:00001:+n:1:0:en
+085:105:6:etster:00001:00001:t:1:0:en
+085:105:6:etster:00001:00001:d:1:0:en
+086:106:6:etstes:00001:00001:+m:1:0:en
+086:106:6:etstes:00001:00001:+n:1:0:en
+086:106:6:etstes:00001:00001:t:1:0:en
+086:106:6:etstes:00001:00001:d:1:0:en
+087:102:5:ndste:00010:00010:r:0:0:nd
+087:102:5:ndste:00010:00010:l:0:0:nd
+088:103:6:ndsten:00010:00010:r:0:0:nd
+088:103:6:ndsten:00010:00010:l:0:0:nd
+089:104:6:ndstem:00010:00010:r:0:0:nd
+089:104:6:ndstem:00010:00010:l:0:0:nd
+090:105:6:ndster:00010:00010:r:0:0:nd
+090:105:6:ndster:00010:00010:l:0:0:nd
+091:106:6:ndstes:00010:00010:r:0:0:nd
+091:106:6:ndstes:00010:00010:l:0:0:nd
+092:001:3:ere:00100:00100:e:0:0:er
+092:001:3:ere:00100:00100::0:0:
+093:002:4:eren:00100:00100:i:0:0:eren
+093:002:4:eren:00100:00100::0:0:
+094:004:4:erem:00100:00100::0:0:
+095:005:4:erer:00100:00100::0:0:
+096:007:4:eres:00100:00100::0:0:
+097:102:4:este:00100:00100::0:0:
+098:103:5:esten:00100:00100::0:0:
+099:104:5:estem:00100:00100:f:0:0:est
+099:104:5:estem:00100:00100::0:0:
+100:005:5:ester:00100:00100::0:0:
+101:106:5:estes:00100:00100::0:0:
+102:017:3:ste:00100:00100::0:0:
+103:018:4:sten:00100:00100::0:0:
+104:019:4:stem:00100:00100:y:0:0:stem
+104:019:4:stem:00100:00100::0:0:
+105:020:4:ster:00100:00100::0:0:
+106:021:4:stes:00100:00100::0:0:
diff --git a/lib/Text/German/Util.pm b/lib/Text/German/Util.pm
new file mode 100644
index 0000000..fbba3c8
--- /dev/null
+++ b/lib/Text/German/Util.pm
@@ -0,0 +1,41 @@
+# -*- Mode: Perl -*-
+# Util.pm --
+# Author : Ulrich Pfeifer
+# Created On : Thu Feb 1 16:08:41 1996
+# Last Modified By: Ulrich Pfeifer
+# Last Modified On: Sun Apr 3 11:44:12 2005
+# Language : Perl
+# Update Count : 8
+# Status : Unknown, Use with caution!
+
+package Text::German::Util;
+require Exporter;
+ at ISA = qw(Exporter);
+ at EXPORT = qw(bit_to_int wordclass $CAPITAL $LOWER $ADJEKTIV $UMLAUTR
+ $VERB $FUNNY $ADJEKTIV $ANY);
+
+sub bit_to_int {
+ my $bitvec = shift;
+
+ unpack('I', pack('b*', $bitvec)."\0\0\0\0");
+}
+
+$CAPITAL = bit_to_int('10000');
+$LOWER = bit_to_int('01111');
+$ADJEKTIV = bit_to_int('00100');
+$VERB = bit_to_int('01000');
+$FUNNY = bit_to_int('01001');
+$ANY = bit_to_int('11111');
+$UMLAUTR = "[���]";
+
+sub wordclass {
+ my ($word, $satz_anfang) = @_;
+
+ if ($satz_anfang) {
+ return $ANY;
+ } elsif ($word =~ /^[A-Z���]/) {
+ $CAPITAL;
+ } else {
+ $LOWER;
+ }
+}
diff --git a/lib/Text/German/Verb.pm b/lib/Text/German/Verb.pm
new file mode 100644
index 0000000..71ff7c9
--- /dev/null
+++ b/lib/Text/German/Verb.pm
@@ -0,0 +1,707 @@
+# -*- Mode: Perl -*-
+# Verb.pm --
+# Author : Ulrich Pfeifer
+# Created On : Thu Feb 1 09:10:48 1996
+# Last Modified By: Ulrich Pfeifer
+# Last Modified On: Sun Apr 3 11:44:28 2005
+# Language : Perl
+# Update Count : 29
+# Status : Unknown, Use with caution!
+
+package Text::German::Verb;
+require Exporter;
+ at ISA = qw(Exporter);
+ at EXPORT = qw(%VERB);
+
+{
+ local ($_);
+
+ while (<DATA>) {
+ chomp;
+ ($verb, $key) = split;
+ $VERB{$verb} = [split ':', $key];
+ }
+ close DATA;
+}
+
+sub reduce {
+ my($v,$s,$e) = @_;
+ my $ge = ($v.$s =~ /^ge/)?'ge':'';
+
+ while (1) { # algorithmus unklar
+ #print "reduce: $s\n";
+ if (defined $VERB{$s}) {
+ if ($VERB{$s}->[1]) { # 'ge' gehoert zum stamm
+ my $vg = $v;
+ $vg =~ s/^ge//;
+ return ($vg, $ge.$VERB{$s}->[0], $e);
+ } else {
+ return ($v, $VERB{$s}->[0], $e);
+ }
+ }
+ last unless $e;
+ $s .= substr($e,0,1);
+ $e = substr($e,1);
+ }
+ return undef;
+}
+
+1;
+# stamm ersatz:ge gehoert zum wort
+# f�hr fahr:0
+__DATA__
+�� ess:0
+a� ess:0
+b�ck back:0
+b�nd bind:0
+b�r b�r:1
+b�rg berg:0
+b�t bitt:0
+b�g bieg:0
+b�t biet:0
+b�k back:0
+back back:0
+band bind:0
+bar berst:0
+barg berg:0
+bat bitt:0
+bei� bei�:0
+ber berst:0
+berg berg:0
+berst berst:0
+bet bitt:0
+bi� bei�:0
+bieg bieg:0
+bier b�r:1
+biet biet:0
+bind bind:0
+bir berst:0
+birg berg:0
+biss bei�:0
+bitt bitt:0
+bl� blas:0
+blas blas:0
+bleib bleib:0
+bleich bleich:0
+blich bleich:0
+blieb bleib:0
+blies blas:0
+bog bieg:0
+bor berst:0
+borg berg:0
+bot biet:0
+br� brat:0
+br�ch bring:0
+br�t brat:0
+brach bring:0
+brann brenn:0
+brat brat:0
+brech brech:0
+brenn brenn:0
+brich brech:0
+briet brat:0
+bring bring:0
+broch brech:0
+buk back:0
+bund bind:0
+d�ch denk:0
+d�ng ding:0
+d�nk d�nk:0
+d�rb derb:0
+d�rf d�rf:0
+dach denk:0
+dang ding:0
+darb derb:0
+darf d�rf:0
+deih deih:1
+denk denk:0
+derb derb:0
+deuch d�nk:0
+dieh deih:1
+ding ding:0
+dirb derb:0
+dorb derb:0
+dr�ng dring:0
+dr�sch dresch:0
+dr�sch dresch:0
+dr�ss drie�:0
+drang dring:0
+drasch dresch:0
+dresch dresch:0
+drie� drie�:0
+dring dring:0
+drisch dresch:0
+dro� drie�:0
+drosch dresch:0
+dross drie�:0
+drung dring:0
+dung ding:0
+durf d�rf:0
+ess ess:0
+f�hl fehl:0
+f�hr fahr:0
+f�ll fall:0
+f�nd find:0
+f�ng fang:0
+f�ch fecht:0
+f�hl fehl:0
+f�hr f�hr:0
+fahl fehl:0
+fahr fahr:0
+fall fall:0
+fand find:0
+fang fang:0
+fech fecht:0
+fecht fecht:0
+fehl fehl:0
+fich fecht:0
+fiehl fehl:0
+fiel fall:0
+find find:0
+fing fang:0
+fl�ch flecht:0
+fl�g flieg:0
+fl�h flieh:0
+fl�ss fliess:0
+flech flecht:0
+flecht flecht:0
+flei� flei�:0
+fli� flei�:0
+flich flecht:0
+flicht flecht:0
+flieg flieg:0
+flieh flieh:0
+fliess fliess:0
+fliss flei�:0
+flo� fliess:0
+floch flecht:0
+flog flieg:0
+floh flieh:0
+floss fliess:0
+foch fecht:0
+fohl fehl:0
+fr�� fress:0
+fr�g frag:0
+fr�r frier:0
+fra� fress:0
+frag frag:0
+fress fress:0
+fri� fress:0
+frier frier:0
+fror frier:0
+frug frag:0
+fuhr fahr:0
+fund find:0
+g�� gess:0
+g�b geb:0
+g�l gelt:0
+g�nn ginn:0
+g�r g�r:0
+g�l gelt:0
+g�nn ginn:0
+g�r g�r:0
+g�ss gie�:0
+ga� gess:0
+gab geb:0
+gal gelt:0
+gang geh:0
+gann ginn:0
+geb geb:0
+geh geh:0
+gelt gelt:0
+gess gess:0
+gi� gess:0
+gib geb:0
+gie� gie�:0
+gil gelt:0
+gilt gelt:0
+ging geh:0
+ginn ginn:0
+gl�mm glimm:0
+gleich gleich:0
+gleit gleit:0
+glich gleich:0
+glimm glimm:0
+glitt gleit:0
+glomm glimm:0
+go� gie�:0
+gol gelt:0
+gonn ginn:0
+gor g�r:0
+goss gie�:0
+gr�b grab:0
+gr�b grab:0
+grab grab:0
+greif greif:0
+griff greif:0
+grub grab:0
+h�l halt:0
+h�lf helf:0
+h�lt halt:0
+h�ng h�ng:0
+h�tt hab:0
+h�b heb:0
+h�b heb:0
+h�lf helf:0
+ha hab:0
+hab hab:0
+hal halt:0
+half helf:0
+halt halt:0
+hang h�ng:0
+hat hab:0
+hau hau:0
+heb heb:0
+hei� hei�:0
+helf helf:0
+hie� hei�:0
+hieb hau:0
+hiel halt:0
+hilf helf:0
+hing h�ng:0
+hob heb:0
+holf helf:0
+hub heb:0
+i� ess:0
+ies
+k�m komm:0
+k�mm komm:0
+k�nn k�nn:0
+k�r kies:0
+kam komm:0
+kann k�nn:0
+kies kies:0
+kl�ng kling:0
+kl�mm klimm:0
+klang kling:0
+klimm klimm:0
+kling kling:0
+klomm klimm:0
+klung kling:0
+kneif kneif:0
+kniff kneif:0
+komm komm:0
+konn k�nn:0
+kor kies:0
+kr�ch kriech:0
+kreisch kreisch:0
+kriech kriech:0
+krisch kreisch:0
+kroch kriech:0
+l�� lass:0
+l�d lad:0
+l�g lieg:0
+l�ng ling:1
+l�s les:0
+l�uf lauf:0
+l�g l�g:0
+l�r lier:0
+l�sch l�sch:0
+l�d lad:0
+l�g l�g:0
+lad lad:0
+lag lieg:0
+lang ling:1
+las les:0
+lass lass:0
+lauf lauf:0
+leg lieg:0
+leid leid:0
+leih leih:0
+les les:0
+lie les:0
+lie� lass:0
+lief lauf:0
+lieg lieg:0
+lieh leih:0
+lier lier:0
+lies les
+ling ling:1
+lisch l�sch:0
+litt leid:0
+log l�g:0
+lor lier:0
+losch l�sch:0
+lud lad:0
+lung ling:1
+m�� mess:0
+m�ch m�g:0
+m�g m�g:0
+m�lk melk:0
+m�� m�ss:0
+m�ss m�ss:0
+ma� mess:0
+mag m�g:0
+mahl mahl:0
+meid meid:0
+melk melk:0
+mess mess:0
+mi� mess:0
+mied meid:0
+milk melk:0
+moch m�g:0
+molk melk:0
+mu� m�ss:0
+n�hm nehm:0
+n�s nes:1
+n�ss nie�:1
+nahm nehm:0
+nann nenn:0
+nas nes:1
+nehm nehm:0
+nenn nenn:0
+nes nes:1
+nie� nie�:1
+nimm nehm:0
+no� nie�:1
+nomm nehm:0
+noss nie�:1
+pf�hl pfehl:0
+pf�nd pfind:0
+pf�ng pfang:0
+pf�hl pfehl:0
+pfahl pfehl:0
+pfand pfind:0
+pfang pfang:0
+pfehl pfehl:0
+pfeif pfeif:0
+pfiehl pfehl:0
+pfiff pfeif:0
+pfind pfind:0
+pfing pfang:0
+pfl�g pfleg:0
+pfleg pfleg:0
+pflog pfleg:0
+pfohl pfehl:0
+pfund pfind:0
+preis preis:0
+pries preis:0
+qu�ll quell:0
+quell quell:0
+quill quell:0
+quoll quell:0
+r� rat:0
+r�ng ring:0
+r�nn rinn:0
+r�t rat:0
+r�ch riech:0
+r�nn rinn:0
+ra rat:0
+rang ring:0
+rann renn:0
+rat rat:0
+rei� rei�:0
+reib reib:0
+reit reit:0
+renn renn:0
+ri� rei�:0
+rie rat:0
+rieb reib:0
+riech riech:0
+rief ruf:0
+riet rat:0
+ring ring:0
+rinn rinn:0
+riss rei�:0
+ritt reit:0
+roch riech:0
+ronn rinn:0
+ruf ruf:0
+rung ring:0
+s�� sitz:0
+s�h seh:0
+s�ng sing:0
+s�nk sink:0
+s�nn sinn:0
+s�uf sauf:0
+s�ff sauf:0
+s�g saug:0
+s�nn sinn:0
+s�t sied:0
+s�tt sied:0
+sa� sitz:0
+sah seh:0
+salz salz:0
+sand send:0
+sang sing:0
+sank sink:0
+sann sinn:0
+sauf sauf:0
+saug saug:0
+sch�h scheh:1
+sch�b schieb:0
+sch�l schelt:0
+sch�ll schall:0
+sch�r scher:0
+sch�ss schie�:0
+sch�f schaff:0
+schaff schaff:0
+schah scheh:1
+schal schelt:0
+schall schall:0
+scheh scheh:1
+schei� schei�:0
+scheid scheid:0
+schein schein:0
+schelt schelt:0
+scher scher:0
+schi� schei�:0
+schie� schie�:0
+schieb schieb:0
+schied scheid:0
+schieh scheh:1
+schien schein:0
+schil schelt:0
+schilt schelt:0
+schind schind:0
+schiss schei�:0
+schl�f schlaf:0
+schl�g schlag:0
+schl�ng schling:0
+schl�ss schlie�:0
+schl�g schlag:0
+schlaf schlaf:0
+schlag schlag:0
+schlang schling:0
+schlei� schlei�:0
+schleich schleich:0
+schleif schleif:0
+schli� schlei�:0
+schlich schleich:0
+schlie� schlie�:0
+schlief schlaf:0
+schliff schleif:0
+schling schling:0
+schliss schlei�:0
+schlo� schlie�:0
+schloss schlie�:0
+schlug schlag:0
+schlung schling:0
+schm�lz schmelz:0
+schmei� schmei�:0
+schmelz schmelz:0
+schmi� schmei�:0
+schmilz schmelz:0
+schmiss schmei�:0
+schmolz schmelz:0
+schn�b schnaub:0
+schnaub schnaub:0
+schneid schneid:0
+schnitt schneid:0
+schnob schnaub:0
+scho� schie�:0
+schob schieb:0
+schol schelt:0
+scholl schall:0
+schor scher:0
+schoss schie�:0
+schr�k schreck:0
+schrak schreck:0
+schreck schreck:0
+schrei schrei:0
+schreib schreib:0
+schreit schreit:0
+schri schrei:0
+schrick schreck:0
+schrie schrei:0
+schrieb schreib:0
+schrit schreit:0
+schritt schreit:0
+schrock schreck:0
+schuf schaff:0
+schund schind:0
+schw�mm schwimm:0
+schw�nd schwind:0
+schw�ng schwing:0
+schw�ll schwell:0
+schw�mm schwimm:0
+schw�r schw�r:0
+schw�r schw�r:0
+schwamm schwimm:0
+schwand schwind:0
+schwang schwing:0
+schweig schweig:0
+schwell schwell:0
+schwieg schweig:0
+schwill schwell:0
+schwimm schwimm:0
+schwind schwind:0
+schwing schwing:0
+schwoll schwell:0
+schwomm schwimm:0
+schwor schw�r:0
+schwund schwind:0
+schwung schwing:0
+schwur schw�r:0
+seh seh:0
+send send:0
+sess sitz:0
+sied sied:0
+sieh seh:0
+sing sing:0
+sink sink:0
+sinn sinn:0
+sitz sitz:0
+soff sauf:0
+sog saug:0
+sonn sinn:0
+sot sied:0
+sott sied:0
+sp�nn spinn:0
+sp�nn spinn:0
+spann spinn:0
+spei spei:0
+spi spei:0
+spie spei:0
+spinn spinn:0
+splei� splei�:0
+spli� splei�:0
+spliss splei�:0
+sponn spinn:0
+spr�ch sprech:0
+spr�ng spring:0
+spr�ss sprie�:0
+sprach sprech:0
+sprang spring:0
+sprech sprech:0
+sprich sprech:0
+sprie� sprie�:0
+spring spring:0
+spro� sprie�:0
+sproch sprech:0
+spross sprie�:0
+sprung spring:0
+st�ch stech:0
+st�hl stehl:0
+st�k steck:0
+st�nd steh:0
+st�nk stink:0
+st�� sto�:0
+st�b stieb:0
+st�hl stehl:0
+st�nd steh:0
+st�rb sterb:0
+stach stech:0
+stahl stehl:0
+stak steck:0
+stand steh:0
+stank stink:0
+starb sterb:0
+stech stech:0
+steck steck:0
+steh steh:0
+stehl stehl:0
+steig steig:0
+sterb sterb:0
+stich stech:0
+stie� sto�:0
+stieb stieb:0
+stieg steig:0
+stiehl stehl:0
+stink stink:0
+stirb sterb:0
+sto� sto�:0
+stob stieb:0
+stoch stech:0
+stohl stehl:0
+storb sterb:0
+streich streich:0
+streit streit:0
+strich streich:0
+strit streit:0
+stritt streit:0
+stunk stink:0
+sung sing:0
+sunk sink:0
+t� tun:0
+t�t tun:0
+ta tun:0
+tan tun:0
+tat tun:0
+tr�f treff:0
+tr�g trag:0
+tr�nk trink:0
+tr�t tret:0
+tr�ff trief:0
+tr�g tr�g:0
+tr�g tr�g:0
+traf treff:0
+trag trag:0
+trank trink:0
+trat tret:0
+treff treff:0
+treib treib:0
+tret tret:0
+trieb treib:0
+trief trief:0
+triff treff:0
+trink trink:0
+trit tret:0
+tritt tret:0
+troff treff:0
+trog tr�g:0
+trug trag:0
+trunk trink:0
+tu tun:0
+tun tun:0
+w�ch wachs:0
+w�nd wind:0
+w�nn winn:1
+w�sch wasch:0
+w�b web:0
+w�g wieg:0
+w�nn winn:1
+w�� wiss:0
+w�chs wachs:0
+w�rb werb:0
+w�rd werd:0
+w�rf werf:0
+w�sch wasch:0
+wachs wachs:0
+wand wind:0
+wann winn:1
+warb werb:0
+ward werd:0
+warf werf:0
+wasch wasch:0
+web web:0
+wei� wiss:0
+weich weich:0
+weis weis:0
+werb werb:0
+werd werd:0
+werf werf:0
+wich weich:0
+wieg wieg:0
+wies weis:0
+will woll:0
+wind wind:0
+winn winn:1
+wir werd:0
+wirb werb:0
+wird werd:0
+wirf werf:0
+wiss wiss:0
+wob web:0
+wog wieg:0
+woll woll:0
+wonn winn:1
+worb werb:0
+word werd:0
+worf werf:0
+wr�ng wring:0
+wrang wring:0
+wring wring:0
+wrung wring:0
+wu� wiss:0
+wuchs wachs:0
+wund wind:0
+wurd werd:0
+wusch wasch:0
+z�g zieh:0
+zieh zieh:0
+zog zieh:0
+zw�ng zwing:0
+zwang zwing:0
+zwing zwing:0
+zwung zwing:0
diff --git a/lib/Text/German/Vorsilbe.pm b/lib/Text/German/Vorsilbe.pm
new file mode 100644
index 0000000..269adeb
--- /dev/null
+++ b/lib/Text/German/Vorsilbe.pm
@@ -0,0 +1,105 @@
+# -*- Mode: Perl -*-
+# Vorsilbe.pm --
+# Author : Ulrich Pfeifer
+# Created On : Thu Feb 1 09:10:48 1996
+# Last Modified By: Ulrich Pfeifer
+# Last Modified On: Sun Apr 3 11:44:42 2005
+# Language : Perl
+# Update Count : 23
+# Status : Unknown, Use with caution!
+
+package Text::German::Vorsilbe;
+# require Exporter;
+# @ISA = qw(Exporter);
+# @EXPORT = qw(%VORSILBE);
+
+{
+ local ($_);
+ while (<DATA>) {
+ chomp;
+ ($vorsilbe, $key) = split;
+ $VORSILBE{$vorsilbe} = pack 'b*', $key;
+ }
+ close DATA;
+}
+
+sub vorsilben {
+ my $word = shift;
+ my @result;
+
+ for $i (1 .. length($word)) {
+ my $vorsilbe = substr($word,0,$i);
+ if (defined $VORSILBE{$vorsilbe}) {
+ push @result, $vorsilbe;
+ }
+ }
+ @result;
+}
+
+sub max_vorsilbe {
+ my $word = shift;
+ my $result = undef;
+
+ for $i (1 .. length($word)) {
+ my $vorsilbe = substr($word,0,$i);
+ if (defined $VORSILBE{$vorsilbe}) {
+ $result = $vorsilbe
+ if !defined($result) || length($vorsilbe) > length($result);
+ }
+ }
+ $result;
+}
+
+1;
+# un ?
+
+__DATA__
+ab 010
+an 010
+auf 010
+aus 010
+be 100
+bei 010
+da 010
+dabei 011
+dar 010
+darauf 011
+drauf 012
+durch 110
+ein 010
+em 100
+ent 100
+er 100
+fest 010
+fort 010
+frei 010
+ge 100
+her 010
+herauf 011
+herum 011
+herunter 011
+hin 010
+hinauf 011
+hinzu 011
+miss 100
+mit 010
+nach 010
+nahe 010
+ob 100
+recht 010
+ueber 110
+um 110
+umher 011
+unter 110
+ver 100
+vor 010
+voraus 011
+vorher 011
+weg 010
+wider 110
+wieder 110
+zer 100
+zu 010
+zugrunde 012
+zurueck 012
+zusammen 012
diff --git a/t/basic.t b/t/basic.t
new file mode 100644
index 0000000..6078727
--- /dev/null
+++ b/t/basic.t
@@ -0,0 +1,51 @@
+# Before `make install' is performed this script should be runnable with
+# `make test'. After `make install' it should work as `perl test.pl'
+
+######################### We start with some black magic to print on failure.
+
+# Change 1..1 below to 1..last_test_to_print .
+# (It may become useful if the test is moved to ./t subdirectory.)
+
+BEGIN {print "1..15\n";}
+END {print "not ok 1\n" unless $loaded;}
+use Text::German;
+$loaded = 1;
+$i = 1;
+print "ok 1\n";
+
+######################### End of black magic.
+$Text::German::Regel::debug = 0;
+$Text::German::debug = 0;
+$debug = 0;
+# gemachter testen h�uslich ��e verband verbarg verbi� fr�mmlich
+# vordersten hintersten geheiligt gem��igt wenn ich so wollte
+# wie ich k�nnte w�rde ich noch ganz anders als die anderen
+# qualifiziert �usserst fade findet das mein k�tzchen eure
+# heiserkeit heiterkeiten hoheitsvollerweise
+
+ at should = qw(
+
+ infrastrukturell Verfall gesellschaftlich Organisation DDR
+ f�hren verh�rten isolationistisch Politik reformerisch
+ Anforderung Mitte Jahr Krisenpotential
+
+ );
+for $word
+ (qw(
+
+ infrastrukturelle Verfall gesellschaftlichen Organisation DDR
+ f�hrte verh�rteten isolationistischen Politik reformerische
+ Anforderungen Mitte Jahre Krisenpotential
+)) {
+ #$x = join ':', Text::German::partition($word);
+ print "=====$word=====\n" if $debug;
+ $x = Text::German::reduce($word);
+ $y = shift @should;
+ print "$word => $x ($y)\n";
+ $i++;
+ ($x eq $y)? print "ok $i\n": print "not ok $i\n";
+}
+# Insert your test code below (better if it prints "ok 13"
+# (correspondingly "not ok 13") depending on the success of chunk 13
+# of the test code):
+
diff --git a/t/cache.t b/t/cache.t
new file mode 100644
index 0000000..6e3cf80
--- /dev/null
+++ b/t/cache.t
@@ -0,0 +1,50 @@
+# Before `make install' is performed this script should be runnable with
+# `make test'. After `make install' it should work as `perl test.pl'
+
+######################### We start with some black magic to print on failure.
+
+# Change 1..1 below to 1..last_test_to_print .
+# (It may become useful if the test is moved to ./t subdirectory.)
+
+BEGIN {print "1..19\n";}
+END {print "not ok 1\n" unless $loaded;}
+use Text::German;
+$loaded = 1;
+$i = 1;
+print "ok 1\n";
+
+######################### End of black magic.
+$Text::German::Regel::debug = 0;
+$Text::German::debug = 0;
+$debug = 0;
+# gemachter testen h�uslich ��e verband verbarg verbi� fr�mmlich
+# vordersten hintersten geheiligt gem��igt wenn ich so wollte
+# wie ich k�nnte w�rde ich noch ganz anders als die anderen
+# qualifiziert �usserst fade findet das mein k�tzchen eure
+# heiserkeit heiterkeiten hoheitsvollerweise
+
+ at should = qw(
+
+ infrastrukturell DDR Verfall gesellschaftlich Organisation DDR
+ f�hren verh�rten f�hren isolationistisch Mitte Mitte Politik reformerisch
+ Anforderung Mitte Jahr Krisenpotential
+
+ );
+for $word
+ (qw(
+
+ infrastrukturelle DDR Verfall gesellschaftlichen Organisation DDR
+ f�hrte verh�rteten f�hrte isolationistischen Mitte Mitte Politik reformerische
+ Anforderungen Mitte Jahre Krisenpotential
+)) {
+ print "=====$word=====\n" if $debug;
+ $x = Text::German::cache_reduce($word);
+ $y = shift @should;
+ print "$word => $x ($y)\n";
+ $i++;
+ ($x eq $y)? print "ok $i\n": print "not ok $i\n";
+}
+# Insert your test code below (better if it prints "ok 13"
+# (correspondingly "not ok 13") depending on the success of chunk 13
+# of the test code):
+
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-perl/packages/libtext-german-perl.git
More information about the Pkg-perl-cvs-commits
mailing list