String-Koremutake-0.30/0000755000076500007650000000000010224074404013412 5ustar acmeacmeString-Koremutake-0.30/Build.PL0000644000076500007650000000046310224074404014711 0ustar acmeacmeuse Module::Build; use strict; my $build = Module::Build->new( create_makefile_pl => 'traditional', license => 'perl', module_name => 'String::Koremutake', requires => { 'Error' => '0.15', 'Test::Exception' => '0.15', 'Test::More' => '0.01', }, ); $build->create_build_script; String-Koremutake-0.30/CHANGES0000644000076500007650000000044210224074404014405 0ustar acmeacmeChangeLog for String::Koremutake: 0.30 Mon Apr 4 07:02:38 CST 2005 - throw an exception if you don't pass in a number or koremutake string - minor doc cleanup 0.29 Fri Mar 25 04:25:48 GMT 2005 - 100% pod coverage 0.28 Sat Jan 8 11:41:27 GMT 2005 - First released version String-Koremutake-0.30/lib/0000755000076500007650000000000010224074404014160 5ustar acmeacmeString-Koremutake-0.30/lib/String/0000755000076500007650000000000010224074404015426 5ustar acmeacmeString-Koremutake-0.30/lib/String/Koremutake.pm0000644000076500007650000001132310224074404020073 0ustar acmeacmepackage String::Koremutake; use strict; use warnings; use Error; our $VERSION = '0.30'; my @phonemes = map { lc } qw{BA BE BI BO BU BY DA DE DI DO DU DY FA FE FI FO FU FY GA GE GI GO GU GY HA HE HI HO HU HY JA JE JI JO JU JY KA KE KI KO KU KY LA LE LI LO LU LY MA ME MI MO MU MY NA NE NI NO NU NY PA PE PI PO PU PY RA RE RI RO RU RY SA SE SI SO SU SY TA TE TI TO TU TY VA VE VI VO VU VY BRA BRE BRI BRO BRU BRY DRA DRE DRI DRO DRU DRY FRA FRE FRI FRO FRU FRY GRA GRE GRI GRO GRU GRY PRA PRE PRI PRO PRU PRY STA STE STI STO STU STY TRA TRE}; my %phoneme_to_number; my %number_to_phoneme; my $number = 0; foreach my $phoneme (@phonemes) { $phoneme_to_number{$phoneme} = $number; $number_to_phoneme{$number} = $phoneme; $number++; } sub new { my $class = shift; my $self = {}; bless $self, $class; return $self; } sub _numbers_to_koremutake { my($self, $numbers) = @_; my $string; foreach my $n (@$numbers) { throw Error::Simple("0 <= $n <= 127") unless (0 <= $n) && ($n <= 127); $string .= $number_to_phoneme{$n}; } return $string; } sub _koremutake_to_numbers { my($self, $string) = @_; my @numbers; my $phoneme; my @chars = split //, $string; while (@chars) { $phoneme .= shift @chars; next unless $phoneme =~ /[aeiouy]/; my $number = $phoneme_to_number{$phoneme}; throw Error::Simple("Phoneme $phoneme not valid") unless defined $number; push @numbers, $number; $phoneme = ""; } return \@numbers; } sub integer_to_koremutake { my($self, $integer) = @_; throw Error::Simple("No integer given") unless defined $integer; throw Error::Simple('Negative numbers not acceptable') if $integer < 0; my @numbers; @numbers = (0) if $integer == 0; while ($integer != 0) { push @numbers, $integer % 128; $integer = int($integer/128); } return $self->_numbers_to_koremutake([reverse @numbers]); } sub koremutake_to_integer { my($self, $string) = @_; throw Error::Simple("No koremutake string given") unless defined $string; my $numbers = $self->_koremutake_to_numbers($string); my $integer = 0; while (@$numbers) { my $n = shift @$numbers; $integer = ($integer * 128) + $n; } return $integer; } 1; __END__ =head1 NAME String::Koremutake - Convert to/from Koremutake Memorable Random Strings =head1 SYNOPSIS use String::Koremutake; my $k = String::Koremutake->new; my $s = $k->integer_to_koremutake(65535); # botretre my $i = $k->koremutake_to_integer('koremutake'); # 10610353957 =head1 DESCRIPTION The String::Koremutake module converts to and from Koremutake Memorable Random Strings. The term "Memorable Random String" was thought up by Sean B. Palmer as a name for those strings like dopynl, glargen, glonknic, spoopwiddle, and kebble etc. that don't have any conventional sense, but can be used as random identifiers, especially in URIs to keep them persistent. See http://infomesh.net/2001/07/MeRS/ Koremutake is a MeRS algorithm which is used by Shorl (http://shorl.com/koremutake.php). As they explain: "It is, in plain language, a way to express any large number as a sequence of syllables. The general idea is that word-sounding pieces of information are a lot easier to remember than a sequence of digits." =head1 INTERFACE =head2 new() The new() method is the constructor: =head2 integer_to_koremutake($i) The integer_to_koremutake method converts a positive integer to a Koremutake string: my $s = $k->integer_to_koremutake(65535); # botretre =head2 koremutake_to_integer($s) The koremutake_to_integer method converts a Koremutake string to the integer it represents: my $i = $k->koremutake_to_integer('koremutake'); # 10610353957 =head1 BUGS AND LIMITATIONS No bugs have been reported. Please report any bugs or feature requests to C, or through the web interface at L. =head1 AUTHOR Leon Brocard C =head1 LICENCE AND COPYRIGHT Copyright (c) 2005, Leon Brocard C. All rights reserved. This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself. String-Koremutake-0.30/Makefile.PL0000644000076500007650000000075710224074404015375 0ustar acmeacme# Note: this file was auto-generated by Module::Build::Compat version 0.03 use ExtUtils::MakeMaker; WriteMakefile ( 'NAME' => 'String::Koremutake', 'VERSION_FROM' => 'lib/String/Koremutake.pm', 'PREREQ_PM' => { 'Error' => '0.15', 'Test::Exception' => '0.15', 'Test::More' => '0.01' }, 'INSTALLDIRS' => 'site', 'PL_FILES' => {} ) ; String-Koremutake-0.30/MANIFEST0000644000076500007650000000021010224074404014534 0ustar acmeacmeBuild.PL CHANGES lib/String/Koremutake.pm Makefile.PL MANIFEST This list of files META.yml README t/pod.t t/pod_coverage.t t/simple.t String-Koremutake-0.30/META.yml0000644000076500007650000000056410224074404014670 0ustar acmeacme--- #YAML:1.0 name: String-Koremutake version: 0.30 author: - Leon Brocard C abstract: |- Convert to/from Koremutake Memorable Random Strings license: perl requires: Error: 0.15 Test::Exception: 0.15 Test::More: 0.01 provides: String::Koremutake: file: lib/String/Koremutake.pm version: 0.30 generated_by: Module::Build version 0.2605 String-Koremutake-0.30/README0000644000076500007650000000371010224074404014273 0ustar acmeacmeNAME String::Koremutake - Convert to/from Koremutake Memorable Random Strings SYNOPSIS use String::Koremutake; my $k = String::Koremutake->new; my $s = $k->integer_to_koremutake(65535); # botretre my $i = $k->koremutake_to_integer('koremutake'); # 10610353957 DESCRIPTION The String::Koremutake module converts to and from Koremutake Memorable Random Strings. The term "Memorable Random String" was thought up by Sean B. Palmer as a name for those strings like dopynl, glargen, glonknic, spoopwiddle, and kebble etc. that don't have any conventional sense, but can be used as random identifiers, especially in URIs to keep them persistent. See http://infomesh.net/2001/07/MeRS/ Koremutake is a MeRS algorithm which is used by Shorl (http://shorl.com/koremutake.php). As they explain: "It is, in plain language, a way to express any large number as a sequence of syllables. The general idea is that word-sounding pieces of information are a lot easier to remember than a sequence of digits." INTERFACE new() The new() method is the constructor: integer_to_koremutake($i) The integer_to_koremutake method converts a positive integer to a Koremutake string: my $s = $k->integer_to_koremutake(65535); # botretre koremutake_to_integer($s) The koremutake_to_integer method converts a Koremutake string to the integer it represents: my $i = $k->koremutake_to_integer('koremutake'); # 10610353957 BUGS AND LIMITATIONS No bugs have been reported. Please report any bugs or feature requests to "bug-String-Koremutake@rt.cpan.org", or through the web interface at . AUTHOR Leon Brocard "acme@astray.com" LICENCE AND COPYRIGHT Copyright (c) 2005, Leon Brocard "acme@astray.com". All rights reserved. This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself. String-Koremutake-0.30/t/0000755000076500007650000000000010224074404013655 5ustar acmeacmeString-Koremutake-0.30/t/pod.t0000644000076500007650000000021410224074404014621 0ustar acmeacme#!perl -T use Test::More; eval "use Test::Pod 1.14"; plan skip_all => "Test::Pod 1.14 required for testing POD" if $@; all_pod_files_ok(); String-Koremutake-0.30/t/pod_coverage.t0000644000076500007650000000025410224074404016500 0ustar acmeacme#!perl -T use Test::More; eval "use Test::Pod::Coverage 1.04"; plan skip_all => "Test::Pod::Coverage 1.04 required for testing POD coverage" if $@; all_pod_coverage_ok(); String-Koremutake-0.30/t/simple.t0000644000076500007650000000342310224074404015335 0ustar acmeacmeuse strict; use warnings; use lib 'lib'; use Test::More tests => 34; use Test::Exception; use_ok('String::Koremutake'); my $k = String::Koremutake->new(); is($k->_numbers_to_koremutake([39,67,52,78,37]), "koremutake"); throws_ok { $k->_numbers_to_koremutake([-1]) } qr/0 <= -1 <= 127/; throws_ok { $k->_numbers_to_koremutake([128]) } qr/0 <= 128 <= 127/; is_deeply($k->_koremutake_to_numbers("koremutake"), [39,67,52,78,37]); throws_ok { $k->_koremutake_to_numbers("qwe") } qr/Phoneme qwe not valid/; dies_ok { $k->integer_to_koremutake(-1) }; throws_ok { $k->integer_to_koremutake() } qr/No integer given/; throws_ok { $k->koremutake_to_integer() } qr/No koremutake string given/; is($k->integer_to_koremutake(0), 'ba'); is($k->integer_to_koremutake(39), 'ko'); is($k->integer_to_koremutake(67), 're'); is($k->integer_to_koremutake(52), 'mu'); is($k->integer_to_koremutake(78), 'ta'); is($k->integer_to_koremutake(37), 'ke'); is($k->integer_to_koremutake(128), 'beba'); is($k->integer_to_koremutake(256), 'biba'); is($k->integer_to_koremutake(65535), 'botretre'); is($k->integer_to_koremutake(65536), 'bubaba'); is($k->integer_to_koremutake(5059), 'kore'); is($k->integer_to_koremutake(10610353957), 'koremutake'); dies_ok { $k->koremutake_to_intger("Hello world") }; is($k->koremutake_to_integer('ba'), 0); is($k->koremutake_to_integer('ko'), 39); is($k->koremutake_to_integer('re'), 67); is($k->koremutake_to_integer('mu'), 52); is($k->koremutake_to_integer('ta'), 78); is($k->koremutake_to_integer('ke'), 37); is($k->koremutake_to_integer('beba'), 128); is($k->koremutake_to_integer('biba'), 256); is($k->koremutake_to_integer('botretre'), 65535); is($k->koremutake_to_integer('bubaba'), 65536); is($k->koremutake_to_integer('kore'), 5059); is($k->koremutake_to_integer('koremutake'), 10610353957);