[libconvert-units-perl] 01/17: Imported Upstream version 0.43
Damyan Ivanov
dmn at moszumanska.debian.org
Tue Jul 21 20:20:20 UTC 2015
This is an automated email from the git hooks/post-receive script.
dmn pushed a commit to annotated tag debian/0.43-2
in repository libconvert-units-perl.
commit a198593fc4de28db8b51d8b9ba0d6171ddd587a2
Author: Damyan Ivanov <dmn at debian.org>
Date: Tue Jul 21 19:13:09 2015 +0000
Imported Upstream version 0.43
---
Base.pm | 330 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Changes | 19 ++++
Length.pm | 81 ++++++++++++++
MANIFEST | 11 ++
Makefile.PL | 14 +++
README | 157 +++++++++++++++++++++++++++
Temperature.pm | 46 ++++++++
Type.pm | 56 ++++++++++
test.pl | 20 ++++
9 files changed, 734 insertions(+)
diff --git a/Base.pm b/Base.pm
new file mode 100644
index 0000000..b7ac710
--- /dev/null
+++ b/Base.pm
@@ -0,0 +1,330 @@
+package Convert::Units::Base;
+require 5.004;
+require Exporter;
+
+ at ISA = qw(Exporter);
+
+use vars qw($VERSION);
+
+use Carp;
+
+$VERSION = "0.43";
+
+sub initialize {
+ my $self = shift;
+ $self->{default} = undef; # default unit
+ $self->{conversions} = {}; # conversions
+ $self->{synonyms} = {}; # unit synonyms and abbreviations
+ $self->{multipliers} = {}; # multipliers
+}
+
+sub import {
+ my $self = shift;
+
+ my ($conversions, $synonyms, $multipliers, $default) = (@_);
+
+ $self->{conversions} = $conversions;
+ $self->{synonyms} = $synonyms;
+ $self->{multipliers} = $multipliers;
+ $self->{default} = $default;
+
+ # if no default unit has been defined, look for any "base" unit
+
+ unless (defined($self->{default}))
+ {
+ foreach (keys %{$self->{conversions}})
+ {
+ if (${$self->{conversions}}{$_}==1)
+ {
+ $self->{default} = $_;
+ }
+ }
+ }
+
+ # Add plural versions of unit names
+
+ foreach (keys %{$self->{conversions}}) {
+ ${$self->{conversions}}{$self->plural($_)} = ${$self->{conversions}}{$_};
+ }
+
+ foreach (keys %{$self->{multipliers}}) {
+ ${$self->{multipliers}}{$self->plural($_)} = ${$self->{multipliers}}{$_};
+ }
+
+ # Add synonyms and abbreviations for units
+
+ foreach (keys %{$self->{synonyms}}) {
+ ${$self->{conversions}}{$_} = ${$self->{conversions}}{${$self->{synonyms}}{$_}};
+ }
+}
+
+sub new {
+ my $this = shift;
+ my $class = ref($this) || $this;
+ my $self = {};
+ bless $self, $class;
+ $self->initialize();
+ $self->import(@_);
+ return $self;
+}
+
+# In the future use Lingua::EN::Inflect?
+
+sub plural
+{
+ my $self = shift;
+
+ local ($_) = shift;
+
+ my $suff = "s";
+
+ $suff = "es", if (m/(ch|s)$/);
+ $suff = "ies", if (m/y$/);
+
+ $_ .= $suff;
+
+ $_ = "halves", if ($_ eq "halfs"); # exceptions
+ $_ = "feet", if ($_ eq "foots");
+
+ return $_;
+}
+
+sub parse_unit
+{
+ my $self = shift;
+
+ local ($_) = shift;
+ my $base = shift; # assume no number specfied = base (0 or 1 usually)
+
+ m/^(\-?\d*(\.\d+)?)\s*(\D*)$/;
+
+ my $number = $1 || $base;
+ my $unit = $3 || $self->{default};
+
+ unless (defined(${$self->{conversions}}{$unit}))
+ {
+ if ($unit =~ m/(\w+)([\s\-]of[\s\-]an?|[\s\-]of)?[\s\-](\w+)$/)
+ {
+ $number *= ${$self->{multipliers}}{$1};
+ $unit = $3;
+ }
+ }
+
+ unless (defined(${$self->{conversions}}{$unit}))
+ {
+ croak "Invalid unit: $unit";
+ }
+
+ return ($number, $unit);
+}
+
+sub convert_units
+{
+ my $self = shift;
+
+ my ($amount, $unit) = $self->parse_unit (shift, 0);
+ my ($multiple, $unit_to) = $self->parse_unit (shift, 1);
+
+ unless (defined($unit_to)) {
+ $unit_to = $self->{default};
+ }
+
+ my ($M, $A);
+ my $U = ${$self->{conversions}}{$unit};
+
+ if (ref($U) eq ARRAY) {
+ ($M, $A) = @{$U};
+ } else {
+ $M = $U;
+ $A = 0;
+ }
+
+ my $def_unit = ($amount + $A) * $M;
+
+ $U = ${$self->{conversions}}{$unit_to};
+ if (ref($U) eq ARRAY) {
+ ($M, $A) = @{$U};
+ } else {
+ $M = $U;
+ $A = 0;
+ }
+
+ my $result = (($def_unit / $M) - $A) / $multiple;
+
+ return $result;
+}
+
+sub parse_string
+{
+ my $self = shift;
+ my $str = lc(shift);
+ my $unit_to = lc(shift);
+
+ my $sum = 0, $el = "1";
+
+ my @units = (split /,|\s+/, $str);
+
+ foreach my $unit (@units) {
+
+ $el = $unit, if ($unit =~ m/^\d/);
+ $el .= " ".$unit, if (($unit =~ m/^\D/) and ($unit !~ m/^(and)$/));
+
+ if ($el =~ m/\d\D/) {
+ $sum += $self->convert_units ($el, $unit_to);
+ $el = "1";
+ }
+ }
+
+ return $sum;
+}
+
+
+1;
+
+__END__
+
+=head1 NAME
+
+Convert::Units::Base - base object for performing unit conversions
+
+=head1 DESCRIPTION
+
+The Units package is a collection of modules for parsing strings with
+unit measurements (such as "12pt" or "3 meters") and converting them
+to some other unit (such as "picas" or "inches").
+
+It uses a base package (Units::Base) which does the dirty work. Other
+modules define what units they handle and how they are related.
+
+=head2 Why a Separate Module?
+
+It is I<intentionally> distinct from the I<Math::Units> module. Why? The
+I<Math::Units> module implies that unit conversions are I<exact>,
+with one-to-one relationships. This is fine for scientific work.
+It's even fine for some general purpose/real-world uses (such as
+converting Fehrenheight to Celcius).
+
+Real-world measurement systems are conflicting. For instance, a "point"
+in typography is equivalent to 1/72 inch, according to PostScript specs
+and common usage. Other type systems consider it 1/72.27 inch, or 0.01383
+inches, or 0.0148 inches. Outside of that context, a point may be 1/120
+or 1/144 inch.
+
+Common notations and abbreviations also depend on context. Does "12 pt"
+mean "12 point", "12 parts" or "12 pints"?
+
+Even without conflicts in the definition of a particular unit, there's no
+need to convert point sizes for fonts into miles or light-years. Typesetters,
+surveyors and astronomers user different scales as well as systems.
+
+=head2 People do not think like computers
+
+Not everyone uses the metric system.
+
+And even less people say things like "5.25 feet". Often it's "5 feet, 3 inches"
+or "5 1/4 feet".
+
+Despite having ten fingers and toes, people don't think in tens. They think in
+twos, threes, fours, twelves, and sixteens. And sometimes they use fractional
+measurements like quarter-inches, sixteenths-of-an-inch, or half-pints.
+
+The purpose of this module is to allow people to use the measurement
+systems they are familiar with, and that is appropriate to what they
+are doing.
+
+=head2 Rationale
+
+The Units:: hierarchy is an attempt to keep measurement systems in
+distinct classes. Thus one can have modules for converting between
+typography units (points, picas) distinct from common units of length
+(or area, temperature, etc.), specialized units (for Astronomy, Chemistry,
+Physics, Textiles, Winery, Navigation, etc.) or even traditional or
+regional systems (Japanese, Chinese, Egyptian, archaic systems, etc.)
+and to keep conflicting measurement systems distinct.
+
+=head2 Release Notes
+
+The current distribution contains the following packages:
+
+ Convert::Units::
+ ::Base - a base module that does all of the work
+ ::Length - a module for converting units of length
+ ::Temperature - a module for converting units of temperature
+ ::Type - a module for converting units of type
+
+Units::Base by itself does nothing. Another module needs to use it
+to create definitions of what units of measurement it handles and
+how they are related to each other (ie, 1 m = 100 cm).
+
+The base unit also allows for synonym and abbreviations to be
+defined.
+
+It also allows common "multiples" to be defined, so that it can
+handle things like "18 half-points" or "6 dozen feet" or even
+convert millimters to "sixteenths of an inch". (It does not yet
+handle Greek prefixes like centi- or mega- ... those will have
+to be manually defined.)
+
+=head2 Known Issues
+
+The current release should be considered "beta" until further testing
+and refinements have been made. Then again, maybe "alpha" is more
+accurate.
+
+The current version does not yet handle fractions such as "1/2 in".
+It should handle decimals such as "0.5 in".
+
+Relationships have been rewritten to be handle A(x+b) as well Ax.
+They may be redone in the future to handle more complex
+relationships, if the need arises.
+
+Unit names much be defined as all lowercase, since strings are
+munged with I<lc()> before processing. In other words, if you define
+a unit name as "F" or "Fahrenheight" you won't be able to use it.
+
+=head2 Future Enhancements
+
+Aside from bug fixes, optimizations, and making the string parsing
+conform more to the "manifesto" above, obvious additions would be modules
+for converting between units of area, volume, weight... (although if
+I<Math::Units> does what you need, use that instead.)
+
+An example hierarchy for future modules:
+
+ Convert::Units::
+ ::Length - general measures of length
+ ::Area
+ ::Pressure
+ ::Volume
+
+ Convert::Units::Length
+ ::Chinese - specialized regional/traditional systems
+ ::English
+
+ Convert::Units::Astronomy
+ ::Length - or Distance...?
+
+Modules should share a common unit (preferably metric) to allow for
+conversions.
+
+=head1 REQUIRED MODULES
+
+ Carp
+
+=head1 SEE ALSO
+
+I<Units::Length>, I<Units::Temperature> and I<Units::Type> modules, which
+demonstrate how I<Units::Base> is used.
+
+=head1 AUTHOR
+
+Robert Rothenberg <wlkngowl at unix.asb.com>
+
+=head1 LICENSE
+
+Copyright (c) 1999-2000 Robert Rothenberg. All rights reserved.
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+
+=cut
diff --git a/Changes b/Changes
new file mode 100644
index 0000000..dd9f838
--- /dev/null
+++ b/Changes
@@ -0,0 +1,19 @@
+Revision history for Perl extension Convert::Units package.
+
+Note that very important changes which affect compatability with previous
+versions are marked with an asterisk ('*').
+
+0.43 Sat Jan 15 22:11:30 2000
+ - cleaned up sloppy syntax to remove warnings
+ - fixed bug with reference to default unit in Base.pm
+
+0.42 Wed Sep 22 23:18:56 1999
+ - fixed bug in Makefile.pl - install was to wrong place
+
+0.41 Tue Sep 21 16:44:06 1999
+ * renamed module to Convert::Units
+ - updated README to current version (oops)
+
+0.40 Sun Sep 12 18:10:03 1999
+ - added ability to use A(x+B) conversions as well as Ax to Units::Base
+ - added Units::Temperature module to demo A(x+B) conversions
diff --git a/Length.pm b/Length.pm
new file mode 100644
index 0000000..4477c64
--- /dev/null
+++ b/Length.pm
@@ -0,0 +1,81 @@
+package Convert::Units::Length;
+require 5.004;
+require Exporter;
+
+use vars qw($VERSION $self);
+$VERSION = "0.14";
+
+use Convert::Units::Base;
+
+my $self = new Convert::Units::Base
+ (
+# The actual units, relative to each other (in this case, in inches)
+ {
+ 'centimeter' => 0.3937,
+ 'decameter' => 393.7,
+ 'decimeter' => 3.937,
+ 'foot' => 12,
+ 'hectometer' => 3937,
+ 'inch' => 1,
+ 'kilometer' => 39370,
+ 'meter' => 39.37,
+ 'micrometer' => 0.00003937,
+ 'mile' => 63360,
+ 'millimeter' => 0.03937,
+ 'yard' => 36
+ },
+# Synonyms and abbreviations for these units
+ {
+ 'm' => 'meter',
+ 'cm' => 'centimeter',
+ 'dm' => 'decimeter',
+ 'km' => 'kilometer',
+ 'mm' => 'millimeter',
+ 'micron' => 'micrometer',
+ 'mi' => 'mile',
+ 'ft' => 'foot',
+ "\'" => 'foot',
+ 'in' => 'inch',
+ "\"" => 'inch',
+ 'yd' => 'yard',
+ 'y' => 'yard'
+ },
+# Mulipliers (so we can say "dozen inches" or "sixteenths of an inch")
+ {
+ 'dozen' => 12,
+ 'quadruple' => 4,
+ 'triple' => 3,
+ 'double' => 2,
+ 'whole' => 1,
+ 'half' => 1/2,
+ 'third' => 1/3,
+ 'quarter' => 1/4,
+ 'eighth' => 1/8,
+ 'twelth' => 1/12,
+ 'sixteenth' => 1/16,
+ 'tenth' => 1/10,
+ 'twentieth' => 1/20,
+ 'fiftieth' => 1/50,
+ 'hundreth' => 1/100,
+ 'single' => 1
+ },
+# The default unit to convert to (when none is specified)
+ "inch"
+);
+
+
+# A stub for converting units
+sub convert
+{
+ return $self->convert_units (@_);
+}
+
+# A stub for parsing strings (such as "1 foot, 3 inches")
+sub parse
+{
+ return $self->parse_string (@_);
+}
+
+1;
+
+__END__
diff --git a/MANIFEST b/MANIFEST
new file mode 100644
index 0000000..988b8ed
--- /dev/null
+++ b/MANIFEST
@@ -0,0 +1,11 @@
+Base.pm
+Changes
+Length.pm
+Makefile.PL
+MANIFEST
+README
+Temperature.pm
+test.pl
+Type.pm
+
+
diff --git a/Makefile.PL b/Makefile.PL
new file mode 100644
index 0000000..141d0e2
--- /dev/null
+++ b/Makefile.PL
@@ -0,0 +1,14 @@
+use ExtUtils::MakeMaker;
+
+WriteMakefile(
+ 'PM' => {
+ 'Base.pm' => '$(INST_LIBDIR)/Units/Base.pm',
+ 'Length.pm' => '$(INST_LIBDIR)/Units/Length.pm',
+ 'Temperature.pm' => '$(INST_LIBDIR)/Units/Temperature.pm',
+ 'Type.pm' => '$(INST_LIBDIR)/Units/Type.pm'
+ },
+ 'DISTNAME' => 'Convert-Units',
+ 'NAME' => 'Convert::Units',
+ 'VERSION_FROM' => 'Base.pm'
+);
+
diff --git a/README b/README
new file mode 100644
index 0000000..f2768e2
--- /dev/null
+++ b/README
@@ -0,0 +1,157 @@
+NAME
+
+ Convert::Units::Base - base object for performing unit
+ conversions
+
+CHANGES SINCE LAST RELEASE
+
+ 0.43 Sat Jan 15 22:11:30 2000
+ - cleaned up sloppy syntax to remove warnings
+ - fixed bug with reference to default unit in Base.pm
+
+DESCRIPTION
+
+ The Units package is a collection of modules for parsing strings
+ with unit measurements (such as "12pt" or "3 meters") and
+ converting them to some other unit (such as "picas" or
+ "inches").
+
+ It uses a base package (Units::Base) which does the dirty work.
+ Other modules define what units they handle and how they are
+ related.
+
+ Why a Separate Module?
+
+ It is *intentionally* distinct from the *Math::Units* module.
+ Why? The *Math::Units* module implies that unit conversions are
+ *exact*, with one-to-one relationships. This is fine for
+ scientific work. It's even fine for some general purpose/real-
+ world uses (such as converting Fehrenheight to Celcius).
+
+ Real-world measurement systems are conflicting. For instance, a
+ "point" in typography is equivalent to 1/72 inch, according to
+ PostScript specs and common usage. Other type systems consider
+ it 1/72.27 inch, or 0.01383 inches, or 0.0148 inches. Outside of
+ that context, a point may be 1/120 or 1/144 inch.
+
+ Common notations and abbreviations also depend on context. Does
+ "12 pt" mean "12 point", "12 parts" or "12 pints"?
+
+ Even without conflicts in the definition of a particular unit,
+ there's no need to convert point sizes for fonts into miles or
+ light-years. Typesetters, surveyors and astronomers user
+ different scales as well as systems.
+
+ People do not think like computers
+
+ Not everyone uses the metric system.
+
+ And even less people say things like "5.25 feet". Often it's "5
+ feet, 3 inches" or "5 1/4 feet".
+
+ Despite having ten fingers and toes, people don't think in tens.
+ They think in twos, threes, fours, twelves, and sixteens. And
+ sometimes they use fractional measurements like quarter-inches,
+ sixteenths-of-an-inch, or half-pints.
+
+ The purpose of this module is to allow people to use the
+ measurement systems they are familiar with, and that is
+ appropriate to what they are doing.
+
+ Rationale
+
+ The Units:: hierarchy is an attempt to keep measurement systems
+ in distinct classes. Thus one can have modules for converting
+ between typography units (points, picas) distinct from common
+ units of length (or area, temperature, etc.), specialized units
+ (for Astronomy, Chemistry, Physics, Textiles, Winery,
+ Navigation, etc.) or even traditional or regional systems
+ (Japanese, Chinese, Egyptian, archaic systems, etc.) and to keep
+ conflicting measurement systems distinct.
+
+ Release Notes
+
+ The current distribution contains the following packages:
+
+ Convert::Units::
+ ::Base - a base module that does all of the work
+ ::Length - a module for converting units of length
+ ::Temperature - a module for converting units of temperature
+ ::Type - a module for converting units of type
+
+ Units::Base by itself does nothing. Another module needs to use
+ it to create definitions of what units of measurement it handles
+ and how they are related to each other (ie, 1 m = 100 cm).
+
+ The base unit also allows for synonym and abbreviations to be
+ defined.
+
+ It also allows common "multiples" to be defined, so that it can
+ handle things like "18 half-points" or "6 dozen feet" or even
+ convert millimters to "sixteenths of an inch". (It does not yet
+ handle Greek prefixes like centi- or mega- ... those will have
+ to be manually defined.)
+
+ Known Issues
+
+ The current release should be considered "beta" until further
+ testing and refinements have been made. Then again, maybe
+ "alpha" is more accurate.
+
+ The current version does not yet handle fractions such as "1/2
+ in". It should handle decimals such as "0.5 in".
+
+ Relationships have been rewritten to be handle A(x+b) as well
+ Ax. They may be redone in the future to handle more complex
+ relationships, if the need arises.
+
+ Unit names much be defined as all lowercase, since strings are
+ munged with *lc()* before processing. In other words, if you
+ define a unit name as "F" or "Fahrenheight" you won't be able to
+ use it.
+
+ Future Enhancements
+
+ Aside from bug fixes, optimizations, and making the string
+ parsing conform more to the "manifesto" above, obvious additions
+ would be modules for converting between units of area, volume,
+ weight... (although if *Math::Units* does what you need, use
+ that instead.)
+
+ An example hierarchy for future modules:
+
+ Convert::Units::
+ ::Length - general measures of length
+ ::Area
+ ::Pressure
+ ::Volume
+
+ Convert::Units::Length
+ ::Chinese - specialized regional/traditional systems
+ ::English
+
+ Convert::Units::Astronomy
+ ::Length - or Distance...?
+
+ Modules should share a common unit (preferably metric) to allow
+ for conversions.
+
+REQUIRED MODULES
+
+ Carp
+
+SEE ALSO
+
+ *Units::Length*, *Units::Temperature* and *Units::Type* modules,
+ which demonstrate how *Units::Base* is used.
+
+AUTHOR
+
+ Robert Rothenberg <wlkngowl at unix.asb.com>
+
+LICENSE
+
+ Copyright (c) 1999 Robert Rothenberg. All rights reserved. This
+ program is free software; you can redistribute it and/or modify
+ it under the same terms as Perl itself.
+
diff --git a/Temperature.pm b/Temperature.pm
new file mode 100644
index 0000000..fd1667b
--- /dev/null
+++ b/Temperature.pm
@@ -0,0 +1,46 @@
+package Convert::Units::Temperature;
+require 5.004;
+require Exporter;
+
+use vars qw($VERSION $self);
+$VERSION = "0.21";
+
+use Convert::Units::Base;
+
+my $self = new Convert::Units::Base
+ (
+# The actual units, relative to each other (in this case, in inches)
+ {
+ 'celsius' => [1.0, 0],
+ 'fahrenheight' => [5/9, -32],
+ 'kelvin' => [1.0, -273]
+ },
+# Synonyms and abbreviations for these units
+ {
+ 'centigrade' => 'celsius',
+ 'c' => 'celsius',
+ 'f' => 'fahrenheight',
+ 'k' => 'kelvin'
+ },
+# Mulipliers
+ (),
+# The default unit to convert to (when none is specified)
+ "celsius"
+);
+
+# A stub for converting units
+sub convert
+{
+ return $self->convert_units (@_);
+}
+
+# A stub for parsing strings (such as "1 foot, 3 inches")
+sub parse
+{
+ return $self->parse_string (@_);
+}
+
+1;
+
+__END__
+
diff --git a/Type.pm b/Type.pm
new file mode 100644
index 0000000..ca45634
--- /dev/null
+++ b/Type.pm
@@ -0,0 +1,56 @@
+package Convert::Units::Type;
+require 5.004;
+require Exporter;
+
+use vars qw($VERSION $self);
+$VERSION = "0.34";
+
+use Convert::Units::Base;
+
+my $self = new Convert::Units::Base
+ (
+# The actual units, relative to each other (in this case, in inches)
+ {
+ 'inch' => 1,
+ 'pica' => 1/6, # PostScript (Anglo/Am 0.166in)
+ 'point' => 1/72, # PostScript (Anglo/Am 0.01383in, Europe 0.0148in. 72.27pts/in??)
+ 'twip' => 1/1440,
+ 'centimeter' => 0.3937,
+ 'millimeter' => 0.03937
+ },
+# Synonyms and abbreviations for these units
+ {
+ 'cm' => 'centimeter',
+ 'mm' => 'millimeter',
+ 'in' => 'inch',
+ 'pt' => 'point',
+ 'pc' => 'pica'
+ },
+# Mulipliers (so we can say "half-pica" or "sixteenths of an inch")
+ {
+ 'half' => 1/2,
+ 'third' => 1/3,
+ 'quarter' => 1/4,
+ 'eighth' => 1/8,
+ 'twelth' => 1/12,
+ 'sixteenth' => 1/16
+ },
+# The default unit to convert to (when none is specified)
+ "point"
+);
+
+# A stub for converting units
+sub convert
+{
+ return $self->convert_units (@_);
+}
+
+# A stub for parsing strings (such as "1 foot, 3 inches")
+sub parse
+{
+ return $self->parse_string (@_);
+}
+
+1;
+
+__END__
diff --git a/test.pl b/test.pl
new file mode 100644
index 0000000..3ee11e1
--- /dev/null
+++ b/test.pl
@@ -0,0 +1,20 @@
+# 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 { $| = 1; print "1..1\n"; }
+END {print "not ok 1\n" unless $loaded;}
+use Convert::Units::Length;
+use Convert::Units::Type;
+use Convert::Units::Temperature;
+$loaded = 1;
+print "ok 1\n";
+
+######################### End of black magic.
+
+# We need a better test here
+
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-perl/packages/libconvert-units-perl.git
More information about the Pkg-perl-cvs-commits
mailing list