diff options
author | Norbert Preining <norbert@preining.info> | 2024-08-29 03:03:05 +0000 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2024-08-29 03:03:05 +0000 |
commit | 0c37cf67ade4182d382c384e595a24ebb022fa63 (patch) | |
tree | c3bb4966e80077cd13b3e075025e9190cfe45b22 /support | |
parent | 8949f3077cb0d7b4f471e4ef1d49b8da436ebbc4 (diff) |
CTAN sync 202408290303
Diffstat (limited to 'support')
66 files changed, 0 insertions, 5939 deletions
diff --git a/support/bibtexperllibs/BibTeX-Parser/Changes b/support/bibtexperllibs/BibTeX-Parser/Changes deleted file mode 100644 index da5c2afb8e..0000000000 --- a/support/bibtexperllibs/BibTeX-Parser/Changes +++ /dev/null @@ -1,86 +0,0 @@ -Revision history for BibTeX::Parser - -1.04 2023-08-20 New release - -1.03 2022-11-06 - Avoid extra spaces with von part. (Author.pm) - Add ' to re_namechar. (Parser.pm) - -1.02 2018-04-29 03:19:56 +0000 - Corrected the bug when Jr is not accompanied by von. - -1.01 2017-11-19 03:12:34 +0000 - New options for to_string: - - print_pre - whether to print text preceding the entry - - type_capitalization ('Uppercase', 'Lowercase', - 'Titlecase') - - field_capitalization ('Uppercase', 'Lowercase', - 'Titlecase') - -1.00 2017-03-18 21:53:15+00:00 - Typo corrected: editors -> editor - -0.70 2016-11-23 02:28:35+00:00 - Compatibility with perl 5.25 (Alexandr Ciornii) - -0.69 2016-03-24 15:13:50-04:00 - Added option canonize_names to Entry::to_string - -0.68 2016-03-10 13:45:31-05:00 - Now we preserve the order of entries - -0.67 2015-12-28 22:36:42+00:00 - Corrected test t/13_output.t - -0.66 2015-12-23 19:52:55-05:00 - Corrected bug 67419. - Added $entry->to_string function - No Do not remove braces from the authors' names - -0.65 2013-09-03 21:04:43 - Add links in documentation. - -0.64 2012-03-10 22:23:50 - Remove a warning about undefined value. - -0.63 2011-03-15 23:08:18 - Parse files with errors (no keys, spaces in wrong positions). Bug #66325 - -0.62 2010-10-15 08:52:53 - Declare Test::More minimum version with done_testing - -0.61 2010-07-19 16:37:49 - Add methods $entry->cleaned_author / cleaned_editor - -0.6 2010-07-19 14:43:15 - Add method $entry->cleaned_field( 'name' ) - Add prerequisite LaTeX::ToUnicode >= 0.02 - -0.5 2010-07-06 13:17:45 Europe/Berlin - Do not attempt to clean up returned values - Author names with braces are split correctly - -0.4 2010-02-09 - Parsing of quoted author names (e.g. "{Foo and Bar, Inc.}") - -0.3.2 2009-07-26 - Removed dependency on Text::Balanced - -0.3.1 2009-07-19 - No changes, removed huge test file from dist - -0.3 2009-07-18 - Better parsing of author names, - new Method B::P::Entry->raw_bibtex - Removed Module::Install from package - -0.21 2009-01-23 - Fixed errors in synopsis. - -0.2 2008-12-30 - First public release. - -0.1 2008-03-14 - First version, internal - - diff --git a/support/bibtexperllibs/BibTeX-Parser/LICENSE b/support/bibtexperllibs/BibTeX-Parser/LICENSE deleted file mode 100644 index 1a50e57d4d..0000000000 --- a/support/bibtexperllibs/BibTeX-Parser/LICENSE +++ /dev/null @@ -1,379 +0,0 @@ -This software is copyright (c) 2013-2022 by Gerhard Gossen and Boris Veytsman and Karl Berry - -This is free software; you can redistribute it and/or modify it under -the same terms as the Perl 5 programming language system itself. - -Terms of the Perl programming language system itself - -a) the GNU General Public License as published by the Free - Software Foundation; either version 1, or (at your option) any - later version, or -b) the "Artistic License" - ---- The GNU General Public License, Version 1, February 1989 --- - -This software is copyright (c) 2013-2016 by Gerhard Gossen and Boris Veytsman - -This is free software, licensed under: - - The GNU General Public License, Version 1, February 1989 - - GNU GENERAL PUBLIC LICENSE - Version 1, February 1989 - - Copyright (C) 1989 Free Software Foundation, Inc. - 51 Franklin St, Suite 500, Boston, MA 02110-1335 USA - - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The license agreements of most software companies try to keep users -at the mercy of those companies. By contrast, our General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. The -General Public License applies to the Free Software Foundation's -software and to any other program whose authors commit to using it. -You can use it for your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Specifically, the General Public License is designed to make -sure that you have the freedom to give away or sell copies of free -software, that you receive source code or can get it if you want it, -that you can change the software or use pieces of it in new free -programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of a such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must tell them their rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License Agreement applies to any program or other work which -contains a notice placed by the copyright holder saying it may be -distributed under the terms of this General Public License. The -"Program", below, refers to any such program or work, and a "work based -on the Program" means either the Program or any work containing the -Program or a portion of it, either verbatim or with modifications. Each -licensee is addressed as "you". - - 1. You may copy and distribute verbatim copies of the Program's source -code as you receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice and -disclaimer of warranty; keep intact all the notices that refer to this -General Public License and to the absence of any warranty; and give any -other recipients of the Program a copy of this General Public License -along with the Program. You may charge a fee for the physical act of -transferring a copy. - - 2. You may modify your copy or copies of the Program or any portion of -it, and copy and distribute such modifications under the terms of Paragraph -1 above, provided that you also do the following: - - a) cause the modified files to carry prominent notices stating that - you changed the files and the date of any change; and - - b) cause the whole of any work that you distribute or publish, that - in whole or in part contains the Program or any part thereof, either - with or without modifications, to be licensed at no charge to all - third parties under the terms of this General Public License (except - that you may choose to grant warranty protection to some or all - third parties, at your option). - - c) If the modified program normally reads commands interactively when - run, you must cause it, when started running for such interactive use - in the simplest and most usual way, to print or display an - announcement including an appropriate copyright notice and a notice - that there is no warranty (or else, saying that you provide a - warranty) and that users may redistribute the program under these - conditions, and telling the user how to view a copy of this General - Public License. - - d) You may charge a fee for the physical act of transferring a - copy, and you may at your option offer warranty protection in - exchange for a fee. - -Mere aggregation of another independent work with the Program (or its -derivative) on a volume of a storage or distribution medium does not bring -the other work under the scope of these terms. - - 3. You may copy and distribute the Program (or a portion or derivative of -it, under Paragraph 2) in object code or executable form under the terms of -Paragraphs 1 and 2 above provided that you also do one of the following: - - a) accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of - Paragraphs 1 and 2 above; or, - - b) accompany it with a written offer, valid for at least three - years, to give any third party free (except for a nominal charge - for the cost of distribution) a complete machine-readable copy of the - corresponding source code, to be distributed under the terms of - Paragraphs 1 and 2 above; or, - - c) accompany it with the information you received as to where the - corresponding source code may be obtained. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form alone.) - -Source code for a work means the preferred form of the work for making -modifications to it. For an executable file, complete source code means -all the source code for all modules it contains; but, as a special -exception, it need not include source code for modules which are standard -libraries that accompany the operating system on which the executable -file runs, or for standard header files or definitions files that -accompany that operating system. - - 4. You may not copy, modify, sublicense, distribute or transfer the -Program except as expressly provided under this General Public License. -Any attempt otherwise to copy, modify, sublicense, distribute or transfer -the Program is void, and will automatically terminate your rights to use -the Program under this License. However, parties who have received -copies, or rights to use copies, from you under this General Public -License will not have their licenses terminated so long as such parties -remain in full compliance. - - 5. By copying, distributing or modifying the Program (or any work based -on the Program) you indicate your acceptance of this license to do so, -and all its terms and conditions. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the original -licensor to copy, distribute or modify the Program subject to these -terms and conditions. You may not impose any further restrictions on the -recipients' exercise of the rights granted herein. - - 7. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of the license which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -the license, you may choose any version ever published by the Free Software -Foundation. - - 8. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 9. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 10. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - Appendix: How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to humanity, the best way to achieve this is to make it -free software which everyone can redistribute and change under these -terms. - - To do so, attach the following notices to the program. It is safest to -attach them to the start of each source file to most effectively convey -the exclusion of warranty; and each file should have at least the -"copyright" line and a pointer to where the full notice is found. - - <one line to give the program's name and a brief idea of what it does.> - Copyright (C) 19yy <name of author> - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 1, or (at your option) - any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA - - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) 19xx name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the -appropriate parts of the General Public License. Of course, the -commands you use may be called something other than `show w' and `show -c'; they could even be mouse-clicks or menu items--whatever suits your -program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the - program `Gnomovision' (a program to direct compilers to make passes - at assemblers) written by James Hacker. - - <signature of Ty Coon>, 1 April 1989 - Ty Coon, President of Vice - -That's all there is to it! - - ---- The Artistic License 1.0 --- - -This software is Copyright (c) 2013 by Gerhard Gossen. - -This is free software, licensed under: - - The Artistic License 1.0 - -The Artistic License - -Preamble - -The intent of this document is to state the conditions under which a Package -may be copied, such that the Copyright Holder maintains some semblance of -artistic control over the development of the package, while giving the users of -the package the right to use and distribute the Package in a more-or-less -customary fashion, plus the right to make reasonable modifications. - -Definitions: - - - "Package" refers to the collection of files distributed by the Copyright - Holder, and derivatives of that collection of files created through - textual modification. - - "Standard Version" refers to such a Package if it has not been modified, - or has been modified in accordance with the wishes of the Copyright - Holder. - - "Copyright Holder" is whoever is named in the copyright or copyrights for - the package. - - "You" is you, if you're thinking about copying or distributing this Package. - - "Reasonable copying fee" is whatever you can justify on the basis of media - cost, duplication charges, time of people involved, and so on. (You will - not be required to justify it to the Copyright Holder, but only to the - computing community at large as a market that must bear the fee.) - - "Freely Available" means that no fee is charged for the item itself, though - there may be fees involved in handling the item. It also means that - recipients of the item may redistribute it under the same conditions they - received it. - -1. You may make and give away verbatim copies of the source form of the -Standard Version of this Package without restriction, provided that you -duplicate all of the original copyright notices and associated disclaimers. - -2. You may apply bug fixes, portability fixes and other modifications derived -from the Public Domain or from the Copyright Holder. A Package modified in such -a way shall still be considered the Standard Version. - -3. You may otherwise modify your copy of this Package in any way, provided that -you insert a prominent notice in each changed file stating how and when you -changed that file, and provided that you do at least ONE of the following: - - a) place your modifications in the Public Domain or otherwise make them - Freely Available, such as by posting said modifications to Usenet or an - equivalent medium, or placing the modifications on a major archive site - such as ftp.uu.net, or by allowing the Copyright Holder to include your - modifications in the Standard Version of the Package. - - b) use the modified Package only within your corporation or organization. - - c) rename any non-standard executables so the names do not conflict with - standard executables, which must also be provided, and provide a separate - manual page for each non-standard executable that clearly documents how it - differs from the Standard Version. - - d) make other distribution arrangements with the Copyright Holder. - -4. You may distribute the programs of this Package in object code or executable -form, provided that you do at least ONE of the following: - - a) distribute a Standard Version of the executables and library files, - together with instructions (in the manual page or equivalent) on where to - get the Standard Version. - - b) accompany the distribution with the machine-readable source of the Package - with your modifications. - - c) accompany any non-standard executables with their corresponding Standard - Version executables, giving the non-standard executables non-standard - names, and clearly documenting the differences in manual pages (or - equivalent), together with instructions on where to get the Standard - Version. - - d) make other distribution arrangements with the Copyright Holder. - -5. You may charge a reasonable copying fee for any distribution of this -Package. You may charge any fee you choose for support of this Package. You -may not charge a fee for this Package itself. However, you may distribute this -Package in aggregate with other (possibly commercial) programs as part of a -larger (possibly commercial) software distribution provided that you do not -advertise this Package as a product of your own. - -6. The scripts and library files supplied as input to or produced as output -from the programs of this Package do not automatically fall under the copyright -of this Package, but belong to whomever generated them, and may be sold -commercially, and may be aggregated with this Package. - -7. C or perl subroutines supplied by you and linked into this Package shall not -be considered part of this Package. - -8. The name of the Copyright Holder may not be used to endorse or promote -products derived from this software without specific prior written permission. - -9. THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED -WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF -MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - -The End - diff --git a/support/bibtexperllibs/BibTeX-Parser/MANIFEST b/support/bibtexperllibs/BibTeX-Parser/MANIFEST deleted file mode 100644 index 032eea6a15..0000000000 --- a/support/bibtexperllibs/BibTeX-Parser/MANIFEST +++ /dev/null @@ -1,44 +0,0 @@ -LICENSE -Changes -MANIFEST -t/pod.t -t/cleaned_field.t -t/release-pod-coverage.t -t/bug67419.t -t/09-complex.t -t/bug66325.t -t/07-parse_englishbib.t -t/13_output.t -t/01-parse.t -t/14-extratext.t -t/05-author.t -t/08-parse_large.t -t/release-pod-syntax.t -t/12-von_token.t -t/00-load.t -t/11-split_braced.t -t/02-parse_string.t -t/04-entry.t -t/03-parse_entry.t -t/bibs/mathscinet.txt -t/bibs/10-funnyname.bib -t/bibs/english.bib -t/bibs/braces.bib -t/bibs/endnote.txt -t/bibs/14-extratext.bib -t/bibs/01.bib -t/bibs/engineering_village.txt -t/bibs/09-complex.bib -t/bibs/06.bib -t/pod-coverage.t -t/10-funnyname.t -t/15-capitalization.t -t/06-parse_complex.t -README -notes -lib/BibTeX/Parser/Author.pm -lib/BibTeX/Parser/Entry.pm -lib/BibTeX/Parser.pm -Makefile.PL -Makefile.TDS -dist.ini diff --git a/support/bibtexperllibs/BibTeX-Parser/Makefile.PL b/support/bibtexperllibs/BibTeX-Parser/Makefile.PL deleted file mode 100644 index e095f253b0..0000000000 --- a/support/bibtexperllibs/BibTeX-Parser/Makefile.PL +++ /dev/null @@ -1,71 +0,0 @@ - -use strict; -use warnings; - - - -use ExtUtils::MakeMaker 6.30; - - - -my %WriteMakefileArgs = ( - "ABSTRACT" => "A pure perl BibTeX parser", - "AUTHOR" => 'Gerhard Gossen <gerhard.gossen@googlemail.com> and Boris Veytsman <boris@varphi.com> and Karl Berry <karl@freefriends.org', - "BUILD_REQUIRES" => {}, - "CONFIGURE_REQUIRES" => { - "ExtUtils::MakeMaker" => "6.31" - }, - "DISTNAME" => "BibTeX-Parser", - "EXE_FILES" => [], - "LICENSE" => "perl", - "NAME" => "BibTeX::Parser", - "PREREQ_PM" => { - "File::Spec" => 0, - "IO::File" => 0, - "IO::String" => 0, - "LaTeX::ToUnicode" => "0.52", - "Test::More" => "0.88" - }, - "TEST_REQUIRES" => { - "Test::More" => "0.88" - }, - 'VERSION_FROM' => 'lib/BibTeX/Parser.pm', - "test" => { - "TESTS" => "t/*.t" - } -); - - -unless ( eval { ExtUtils::MakeMaker->VERSION(6.63_03) } ) { - my $tr = delete $WriteMakefileArgs{TEST_REQUIRES}; - my $br = $WriteMakefileArgs{BUILD_REQUIRES}; - for my $mod ( keys %$tr ) { - if ( exists $br->{$mod} ) { - $br->{$mod} = $tr->{$mod} if $tr->{$mod} > $br->{$mod}; - } - else { - $br->{$mod} = $tr->{$mod}; - } - } -} - -unless ( eval { ExtUtils::MakeMaker->VERSION(6.56) } ) { - my $br = delete $WriteMakefileArgs{BUILD_REQUIRES}; - my $pp = $WriteMakefileArgs{PREREQ_PM}; - for my $mod ( keys %$br ) { - if ( exists $pp->{$mod} ) { - $pp->{$mod} = $br->{$mod} if $br->{$mod} > $pp->{$mod}; - } - else { - $pp->{$mod} = $br->{$mod}; - } - } -} - -delete $WriteMakefileArgs{CONFIGURE_REQUIRES} - unless eval { ExtUtils::MakeMaker->VERSION(6.52) }; - -WriteMakefile(%WriteMakefileArgs); - - - diff --git a/support/bibtexperllibs/BibTeX-Parser/Makefile.TDS b/support/bibtexperllibs/BibTeX-Parser/Makefile.TDS deleted file mode 100644 index 780ebc0af1..0000000000 --- a/support/bibtexperllibs/BibTeX-Parser/Makefile.TDS +++ /dev/null @@ -1,35 +0,0 @@ -# This is Makefile for TDS-compliant TeX distributions -# Written by Boris Veytsman, boris@varphi.com -# -# This file is in public domain -# -PREFIX = /usr/local - -LIBDIR = $(PREFIX)/scripts/bibtexperllibs - -DOCDIR = $(PREFIX)/doc/bibtex/bibtexperllibs - -all: - -docs: - -install: - mkdir -p $(LIBDIR) - cp -r lib/* $(LIBDIR) - mkdir -p $(DOCDIR) - cp -r man/man3/* $(DOCDIR) - -check test: Makefile -# need bash pipefail so exit status is from the make, not the tr. -# the -f Makefile is because of possible GNUmakefile -> Makefile.TDS symlink. - bash -c "set -o pipefail; \ - env PERL5LIB=../LaTeX-ToUnicode/lib \ - make -f Makefile test | tr '\r' '\n'" - -Makefile MYMETA.json MYMeta.yml: Makefile.PL force - perl Makefile.PL || rm -f $@ - -clean distclean: - $(RM) Makefile MYMETA.* blib pm_to_blib *.tar.gz - -force: diff --git a/support/bibtexperllibs/BibTeX-Parser/README b/support/bibtexperllibs/BibTeX-Parser/README deleted file mode 100644 index cb6f19b576..0000000000 --- a/support/bibtexperllibs/BibTeX-Parser/README +++ /dev/null @@ -1,9 +0,0 @@ -This is the BibTeX::Parser Perl package: - - A pure Perl BibTeX parser - -Copyright 2013--2023 Gerhard Gossen, Boris Veytsman, Karl Berry - -This is free software; you can redistribute it and/or modify it under -the same terms as the Perl 5 programming language system itself. - diff --git a/support/bibtexperllibs/BibTeX-Parser/dist.ini b/support/bibtexperllibs/BibTeX-Parser/dist.ini deleted file mode 100644 index bc60ca9352..0000000000 --- a/support/bibtexperllibs/BibTeX-Parser/dist.ini +++ /dev/null @@ -1,28 +0,0 @@ -name = BibTeX-Parser -version = 1.04 -author = Gerhard Gossen <gerhard.gossen@googlemail.com> and Boris Veytsman <boris@varphi.com> and Karl Berry <karl@freefriends.org> -license = Perl_5 -copyright_holder = Gerhard Gossen and Boris Veytsman and Karl Berry - -[@Classic] - -[NextRelease] -format = %-7v %{yyyy-MM-dd HH:mm:ss}d - -[PodWeaver] - -[Prereqs] -Test::More = 0 -IO::String = 0 -IO::File = 0 -File::Spec = 0 -LaTeX::ToUnicode = 0.11 - -[Prereqs / TestRequires] -Test::More = 0.88 ; for done_testing - -[PruneFiles] -filenames = t/bibs/java.bib - -[Repository] -[@Git] diff --git a/support/bibtexperllibs/BibTeX-Parser/lib/BibTeX/Parser.pm b/support/bibtexperllibs/BibTeX-Parser/lib/BibTeX/Parser.pm deleted file mode 100644 index 2897d8495d..0000000000 --- a/support/bibtexperllibs/BibTeX-Parser/lib/BibTeX/Parser.pm +++ /dev/null @@ -1,366 +0,0 @@ -package BibTeX::Parser; -{ - $BibTeX::Parser::VERSION = '1.04'; -} -# ABSTRACT: A pure perl BibTeX parser -use warnings; -use strict; - -use BibTeX::Parser::Entry; - - -my $re_namechar = qr/[a-zA-Z0-9\!\$\&\*\+\-\.\/\:\;\<\>\?\[\]\^\_\`\|\']/o; -my $re_name = qr/$re_namechar+/o; - - -sub new { - my ( $class, $fh ) = @_; - - return bless { - fh => $fh, - strings => { - jan => "January", - feb => "February", - mar => "March", - apr => "April", - may => "May", - jun => "June", - jul => "July", - aug => "August", - sep => "September", - oct => "October", - nov => "November", - dec => "December", - - }, - line => -1, - buffer => "", - }, $class; -} - -sub _slurp_close_bracket; - -sub _parse_next { - my $self = shift; - - while (1) { # loop until regular entry is finished - return 0 if $self->{fh}->eof; - local $_ = $self->{buffer}; - - until (/@/m) { - my $line = $self->{fh}->getline; - return 0 unless defined $line; - $line =~ s/^%.*$//; - $_ .= $line; - } - - my $current_entry = new BibTeX::Parser::Entry; - if (/@($re_name)/cgo) { - my $type = uc $1; - $current_entry->type( $type ); - my $start_pos = pos($_) - length($type) - 1; - - # read rest of entry (matches braces) - my $bracelevel = 0; - $bracelevel += tr/\{/\{/; #count braces - $bracelevel -= tr/\}/\}/; - while ( $bracelevel != 0 ) { - my $position = pos($_); - my $line = $self->{fh}->getline; - last unless defined $line; - $bracelevel = - $bracelevel + ( $line =~ tr/\{/\{/ ) - ( $line =~ tr/\}/\}/ ); - $_ .= $line; - pos($_) = $position; - } - - # Remember text before the entry - my $pre = substr($_, 0, $start_pos-1); - if ($start_pos == 0) { - $pre = ''; - } - $current_entry->pre($pre); - - - # Remember raw bibtex code - my $raw = substr($_, $start_pos); - $raw =~ s/^\s+//; - $raw =~ s/\s+$//; - $current_entry->raw_bibtex($raw); - - my $pos = pos $_; - tr/\n/ /; - pos($_) = $pos; - - if ( $type eq "STRING" ) { - if (/\G\{\s*($re_name)\s*=\s*/cgo) { - my $key = $1; - my $value = _parse_string( $self->{strings} ); - if ( defined $self->{strings}->{$key} ) { - warn("Redefining string $key!"); - } - $self->{strings}->{$key} = $value; - /\G[\s\n]*\}/cg; - } else { - $current_entry->error("Malformed string!"); - return $current_entry; - } - } elsif ( $type eq "COMMENT" or $type eq "PREAMBLE" ) { - /\G\{./cgo; - _slurp_close_bracket; - } else { # normal entry - $current_entry->parse_ok(1); - - # parse key - if (/\G\s*\{(?:\s*($re_name)\s*,[\s\n]*|\s+\r?\s*)/cgo) { - $current_entry->key($1); - - # fields - while (/\G[\s\n]*($re_name)[\s\n]*=[\s\n]*/cgo) { - $current_entry->field( - $1 => _parse_string( $self->{strings} ) ); - my $idx = index( $_, ',', pos($_) ); - pos($_) = $idx + 1 if $idx > 0; - } - - return $current_entry; - - } else { - - $current_entry->error("Malformed entry (key contains illegal characters) at " . substr($_, pos($_) || 0, 20) . ", ignoring"); - _slurp_close_bracket; - return $current_entry; - } - } - - $self->{buffer} = substr $_, pos($_); - - } else { - $current_entry->error("Did not find type at " . substr($_, pos($_) || 0, 20)); - return $current_entry; - } - - } -} - - -sub next { - my $self = shift; - - return $self->_parse_next; -} - -# slurp everything till the next closing brace. Handles -# nested brackets -sub _slurp_close_bracket { - my $bracelevel = 0; - BRACE: { - /\G[^\}]*\{/cg && do { $bracelevel++; redo BRACE }; - /\G[^\{]*\}/cg - && do { - if ( $bracelevel > 0 ) { - $bracelevel--; - redo BRACE; - } else { - return; - } - } - } -} - -# parse bibtex string in $_ and return. A BibTeX string is either enclosed -# in double quotes '"' or matching braces '{}'. The braced form may contain -# nested braces. -sub _parse_string { - my $strings_ref = shift; - - my $value = ""; - - PART: { - if (/\G(\d+)/cg) { - $value .= $1; - } elsif (/\G($re_name)/cgo) { - warn("Using undefined string $1") unless defined $strings_ref->{$1}; - $value .= $strings_ref->{$1} || ""; - } elsif (/\G"(([^"\\]*(\\.)*[^\\"]*)*)"/cgs) - { # quoted string with embeded escapes - $value .= $1; - } else { - my $part = _extract_bracketed( $_ ); - $value .= substr $part, 1, length($part) - 2; # strip quotes - } - - if (/\G\s*#\s*/cg) { # string concatenation by # - redo PART; - } - } - $value =~ s/[\s\n]+/ /g; - return $value; -} - -sub _extract_bracketed -{ - for($_[0]) # alias to $_ - { - /\G\s+/cg; - my $start = pos($_); - my $depth = 0; - while(1) - { - /\G\\./cg && next; - /\G\{/cg && (++$depth, next); - /\G\}/cg && (--$depth > 0 ? next : last); - /\G([^\\\{\}]+)/cg && next; - last; # end of string - } - return substr($_, $start, pos($_)-$start); - } -} - -# Split the $string using $pattern as a delimiter with -# each part having balanced braces (so "{$pattern}" -# does NOT split). -# Return empty list if unmatched braces - -sub _split_braced_string { - my $string = shift; - my $pattern = shift; - my @tokens; - return () if $string eq ''; - my $buffer; - while (!defined pos $string || pos $string < length $string) { - if ( $string =~ /\G(.*?)(\{|$pattern)/cgi ) { - my $match = $1; - if ( $2 =~ /$pattern/i ) { - $buffer .= $match; - push @tokens, $buffer; - $buffer = ""; - } elsif ( $2 =~ /\{/ ) { - $buffer .= $match . "{"; - my $numbraces=1; - while ($numbraces !=0 && pos $string < length $string) { - my $symbol = substr($string, pos $string, 1); - $buffer .= $symbol; - if ($symbol eq '{') { - $numbraces ++; - } elsif ($symbol eq '}') { - $numbraces --; - } - pos($string) ++; - } - if ($numbraces != 0) { - return (); - } - } else { - $buffer .= $match; - } - } else { - $buffer .= substr $string, (pos $string || 0); - last; - } - } - push @tokens, $buffer if $buffer; - return @tokens; -} - - -1; # End of BibTeX::Parser - - -__END__ -=pod - -=head1 NAME - -BibTeX::Parser - A pure perl BibTeX parser - - -=head1 SYNOPSIS - -Parses BibTeX files. - - use BibTeX::Parser; - use IO::File; - - my $fh = IO::File->new("filename"); - - # Create parser object ... - my $parser = BibTeX::Parser->new($fh); - - # ... and iterate over entries - while (my $entry = $parser->next ) { - if ($entry->parse_ok) { - my $type = $entry->type; - my $title = $entry->field("title"); - - my @authors = $entry->author; - # or: - my @editors = $entry->editor; - - foreach my $author (@authors) { - print $author->first . " " - . $author->von . " " - . $author->last . ", " - . $author->jr; - } - } else { - warn "Error parsing file: " . $entry->error; - } - } - - - -=head1 FUNCTIONS - -=head2 new - -Creates new parser object. - -Parameters: - - * fh: A filehandle - -=head2 next - -Returns the next parsed entry or undef. - -=head1 NOTES - -The fields C<author> and C<editor> are canonized, see -L<BibTeX::Parser::Author> - - -=head1 SEE ALSO - -=over 4 - -=item - -L<BibTeX::Parser::Entry> - -=item - -L<BibTeX::Parser::Author> - -=back - -=head1 VERSION - -version 1.04 - - -=head1 AUTHOR - -Gerhard Gossen <gerhard.gossen@googlemail.com> and -Boris Veytsman <boris@varphi.com> and -Karl Berry <karl@freefriends.org> - -=head1 COPYRIGHT AND LICENSE - -This software is copyright (c) 2013-2023 by Gerhard Gossen and Boris Veytsman and Karl Berry. - -This is free software; you can redistribute it and/or modify it under -the same terms as the Perl 5 programming language system itself. - -=cut - diff --git a/support/bibtexperllibs/BibTeX-Parser/lib/BibTeX/Parser/Author.pm b/support/bibtexperllibs/BibTeX-Parser/lib/BibTeX/Parser/Author.pm deleted file mode 100644 index a35e2073a6..0000000000 --- a/support/bibtexperllibs/BibTeX-Parser/lib/BibTeX/Parser/Author.pm +++ /dev/null @@ -1,429 +0,0 @@ -package BibTeX::Parser::Author; -{ - $BibTeX::Parser::Author::VERSION = '1.04'; -} - -use warnings; -use strict; - -use BibTeX::Parser; - - -use overload - '""' => \&to_string; - - - -sub new { - my $class = shift; - - if (@_) { - my $self = [ $class->split(@_) ]; - return bless $self, $class; - } else { - return bless [], $class; - } -} - -sub _get_or_set_field { - my ($self, $field, $value) = @_; - if (defined $value) { - $self->[$field] = $value; - } else { - return $self->[$field]; - } -} - - -sub first { - shift->_get_or_set_field(0, @_); -} - - -sub von { - shift->_get_or_set_field(1, @_); -} - - -sub last { - shift->_get_or_set_field(2, @_); -} - - -sub jr { - shift->_get_or_set_field(3, @_); -} - - -# Take a string and create an array [first, von, last, jr] -sub split { - my ($self_or_class, $name) = @_; - - # remove whitespace at start and end of string - $name =~ s/^\s*(.*)\s*$/$1/s; - - - - if (!length($name)) { - return (undef, undef, undef, undef); - } - - my @comma_separated = - BibTeX::Parser::_split_braced_string($name, - '\s*,\s*'); - if (scalar(@comma_separated) == 0) { - # Error? - return (undef, undef, undef, undef); - } - - my $first=undef; - my $von=undef; - my $last=undef; - my $jr=undef; - - if (scalar(@comma_separated) == 1) { - # First von Last form - my @tokens = - BibTeX::Parser::_split_braced_string($name, '\s+'); - if (!scalar (@tokens)) { - return (undef, undef, undef, undef); - } - my ($start_von, $start_last) = _getStartVonLast (@tokens); - if ($start_von >0) { - $first = join(' ', splice(@tokens,0,$start_von)); - } - if (($start_last-$start_von) >0) { - $von = join(' ', splice(@tokens,0,$start_last-$start_von)); - } - $last = join(' ',@tokens); - return ($first, $von, $last, $jr); - } - # Now we work with von Last, [Jr,] First form - if (scalar @comma_separated == 2) { # no jr - my @tokens= - BibTeX::Parser::_split_braced_string($comma_separated[1], '\s+'); - $first = join(' ', @tokens); - } else { # jr is present - my @tokens= - BibTeX::Parser::_split_braced_string($comma_separated[1], '\s+'); - $jr = join(' ', @tokens); - @tokens= - BibTeX::Parser::_split_braced_string($comma_separated[2], '\s+'); - $first = join(' ', @tokens); - } - my @tokens = - BibTeX::Parser::_split_braced_string($comma_separated[0], '\s+'); - my $start_last = _getStartLast(@tokens); - if ($start_last > 0) { - $von=join(' ', splice(@tokens,0,$start_last)); - } - $last = join(' ',@tokens); - return ($first, $von, $last, $jr); - -} - -# Return the index of the first von element and the first lastname -# element. If no von element, von=last - -sub _getStartVonLast { - my $length=scalar(@_); - if ($length==1) { - return (0,0); - } - my $start_von=-1; - my $start_last=$length-1; - for (my $i=0; $i<$length; $i++) { - if (_is_von_token($_[$i])) { - $start_von=$i; - last; - } - } - if ($start_von== -1) { # no von part - return($length-1, $length-1); - } - if ($start_von== $length-1) { # all parts but last are upper case? - return($length-1, $length-1); - } - for (my $i=$start_von+1; $i<$length; $i++) { - if (!_is_von_token($_[$i])) { - $start_last=$i; - last; - } - } - return($start_von, $start_last); -} - - -# Return the index of the first lastname -# element provided no first name elements are present - -sub _getStartLast { - my $length=scalar(@_); - if ($length==1) { - return 0; - } - my $start_last=$length-1; - for (my $i=0; $i<$length; $i++) { - if (!_is_von_token($_[$i])) { - $start_last=$i; - last; - } - } - return $start_last; -} - - -sub _split_name_parts { - my $name = shift; - - if ( $name !~ /\{/ ) { - return split /\s+/, $name; - } else { - my @parts; - my $cur_token = ''; - while ( scalar( $name =~ /\G ( [^\s\{]* ) ( \s+ | \{ | \s* $ ) /xgc ) ) { - $cur_token .= $1; - if ( $2 =~ /\{/ ) { - if ( scalar( $name =~ /\G([^\}]*)\}/gc ) ) { - $cur_token .= "{$1}"; - } else { - die "Unmatched brace in name '$name'"; - } - } else { - if ( $cur_token =~ /^{(.*)}$/ ) { - $cur_token = $1; - } - push @parts, $cur_token; - $cur_token = ''; - } - } - return @parts; - } - -} - - -sub _get_single_author_from_tokens { - my (@tokens) = @_; - if (@tokens == 0) { - return (undef, undef, undef, undef); - } elsif (@tokens == 1) { # name without comma - if ( $tokens[0] =~ /(^|\s)[[:lower:]]/) { # name has von part or has only lowercase names - my @name_parts = _split_name_parts $tokens[0]; - - my $first; - while (@name_parts && ucfirst($name_parts[0]) eq $name_parts[0] ) { - $first .= $first ? ' ' . shift @name_parts : shift @name_parts; - } - - my $von; - # von part are lowercase words - while ( @name_parts && lc($name_parts[0]) eq $name_parts[0] ) { - $von .= $von ? ' ' . shift @name_parts : shift @name_parts; - } - - if (@name_parts) { - return ($first, $von, join(" ", @name_parts), undef); - } else { - return (undef, undef, $tokens[0], undef); - } - } else { - if ( $tokens[0] !~ /\{/ && $tokens[0] =~ /^((.*)\s+)?\b(\S+)$/) { - return ($2, undef, $3, undef); - } else { - my @name_parts = _split_name_parts $tokens[0]; - return ($name_parts[0], undef, $name_parts[1], undef); - } - } - - } elsif (@tokens == 2) { - my @von_last_parts = _split_name_parts $tokens[0]; - my $von; - # von part are lowercase words - while ( @von_last_parts && lc($von_last_parts[0]) eq $von_last_parts[0] ) { - $von .= $von ? ' ' . shift @von_last_parts : shift @von_last_parts; - } - return ($tokens[1], $von, join(" ", @von_last_parts), undef); - } else { - my @von_last_parts = _split_name_parts $tokens[0]; - my $von; - # von part are lowercase words - while ( @von_last_parts && lc($von_last_parts[0]) eq $von_last_parts[0] ) { - $von .= $von ? ' ' . shift @von_last_parts : shift @von_last_parts; - } - return ($tokens[2], $von, join(" ", @von_last_parts), $tokens[1]); - } - -} - - - -# The goal is to return a name in form -# von Last, Jr, First -# where any of the parts except Last may be empty. -# -sub to_string { - my $self = shift; - - my $last = $self->last; # assume always present - my $first = $self->first ? (", " . $self->first) : ''; # ", first" - my $von = $self->von ? ($self->von . " ") : ''; # "von " - my $jr = $self->jr ? (", " . $self->jr ) : ''; # ", jr" - # - my $ret = "${von}${last}${jr}${first}"; - #warn "returning name: $ret\n"; - return $ret; - -# original code, which introduced a spurious space with a von part. -# https://github.com/borisveytsman/crossrefware/issues/11 -# -# if ($self->jr) { -# return () . " " . $self->last . ", " . $self->jr . ", " . $self->first; -# } else { -# return ($self->von ? $self->von . " " : '') . $self->last . ($self->first ? ", " . $self->first : ''); -# } -# -} - - -# Return 1 if the first letter on brace level 0 is lowercase -sub _is_von_token { - my $string = shift; - while ($string =~ - s/^(\\[[:alpha:]]+\{|\{|\\[[:^alpha:]]?|[[:^alpha:]])//) { - if ($1 eq '{' ) { - my $numbraces=1; - while ($numbraces !=0 && length($string)) { - my $symbol = substr($string, 0, 1); - if ($symbol eq '{') { - $numbraces ++; - } elsif ($symbol eq '}') { - $numbraces --; - } - $string = substr($string,1); - } - } - } - - if (length $string ) { - my $symbol = substr($string, 0, 1); - if (lc($symbol) eq $symbol) { - return 1; - } else { - return 0; - } - } else { - return 1; - } - -} - -1; # End of BibTeX::Entry - -__END__ -=pod - -=head1 NAME - -BibTeX::Author - Contains a single author for a BibTeX document. - -=head1 SYNOPSIS - -This class ist a wrapper for a single BibTeX author. It is usually created -by a BibTeX::Parser. - - use BibTeX::Parser::Author; - - my $entry = BibTeX::Parser::Author->new($full_name); - - my $firstname = $author->first; - my $von = $author->von; - my $last = $author->last; - my $jr = $author->jr; - - # or ... - - my ($first, $von, $last, $jr) = BibTeX::Author->split($fullname); - - - -=head1 FUNCTIONS - -=head2 new - -Create new author object. Expects full name as parameter. - -=head2 first - -Set or get first name(s). - -=head2 von - -Set or get 'von' part of name. - -=head2 last - -Set or get last name(s). - -=head2 jr - -Set or get 'jr' part of name. - -=head2 split - -Split name into (firstname, von part, last name, jr part). Returns array -with four strings, some of them possibly empty. - -=head2 to_string - -Return string representation of the name. - -=head1 NOTES - -BibTeX allows three representations of a person's name: - -=over 4 - -=item 1. - -First von Last - -=item 2. - -von Last, First - -=item 3. - -von Last, Jr, First - -=back - -The module always converts the first form to the second of third one -to allow simple string comparisons. - -The algorithm to determine the von part is the following: von part -consists of tokens where the first letter at brace level 0 is in lower case. -Anything in a "special characters" is on brace level 0. Thus the following -tokens are considered von parts: C<von>, C<\NOOP{von}Von>, and -the following token is not: C<{von}> - -=head1 VERSION - -version 1.04 - - -=head1 AUTHOR - -Gerhard Gossen <gerhard.gossen@googlemail.com> and -Boris Veytsman <boris@varphi.com> and -Karl Berry <karl@freefriends.org> - -=head1 COPYRIGHT AND LICENSE - -This software is copyright (c) 2013--2023 by Gerhard Gossen and Boris Veytsman and Karl Berry. - -This is free software; you can redistribute it and/or modify it under -the same terms as the Perl 5 programming language system itself. - -=cut - diff --git a/support/bibtexperllibs/BibTeX-Parser/lib/BibTeX/Parser/Entry.pm b/support/bibtexperllibs/BibTeX-Parser/lib/BibTeX/Parser/Entry.pm deleted file mode 100644 index d0bc9cc80b..0000000000 --- a/support/bibtexperllibs/BibTeX-Parser/lib/BibTeX/Parser/Entry.pm +++ /dev/null @@ -1,435 +0,0 @@ -package BibTeX::Parser::Entry; -{ - $BibTeX::Parser::Entry::VERSION = '1.04'; -} - -use warnings; -use strict; - -use BibTeX::Parser; -use BibTeX::Parser::Author; - - - -sub new { - my ($class, $type, $key, $parse_ok, $fieldsref) = @_; - - my %fields = defined $fieldsref ? %$fieldsref : (); - my $i=0; - foreach my $field (keys %fields) { - if ($field !~ /^_/) { - $fields{_fieldnums}->{$field}=$i; - $i++; - } - } - if (defined $type) { - $fields{_type} = uc($type); - } - $fields{_key} = $key; - $fields{_parse_ok} = $parse_ok; - $fields{_raw} = ''; - return bless \%fields, $class; -} - - - -sub parse_ok { - my $self = shift; - if (@_) { - $self->{_parse_ok} = shift; - } - $self->{_parse_ok}; -} - - -sub error { - my $self = shift; - if (@_) { - $self->{_error} = shift; - $self->parse_ok(0); - } - return $self->parse_ok ? undef : $self->{_error}; -} - - -sub type { - if (scalar @_ == 1) { - # get - my $self = shift; - return $self->{_type}; - } else { - # set - my ($self, $newval) = @_; - $self->{_type} = uc($newval); - } -} - - -sub key { - if (scalar @_ == 1) { - # get - my $self = shift; - return $self->{_key}; - } else { - # set - my ($self, $newval) = @_; - $self->{_key} = $newval; - } - -} - - -sub field { - if (scalar @_ == 2) { - # get - my ($self, $field) = @_; - return $self->{ lc( $field ) }; - } else { - my ($self, $key, $value) = @_; - my $field = lc ($key); - $self->{$field} = $value; #_sanitize_field($value); - if (!exists($self->{_fieldnums}->{$field})) { - my $num = scalar keys %{$self->{_fieldnums}}; - $self->{_fieldnums}->{$field} = $num; - } - } - -} - -use LaTeX::ToUnicode qw( convert ); - - -sub cleaned_field { - my ( $self, $field, @options ) = @_; - if ( $field =~ /author|editor/i ) { - return $self->field( $field ); - } else { - return convert( $self->field( lc $field ), @options ); - } -} - - -sub cleaned_author { - my $self = shift; - $self->_handle_cleaned_author_editor( [ $self->author ], @_ ); -} - - -sub cleaned_editor { - my $self = shift; - $self->_handle_cleaned_author_editor( [ $self->editor ], @_ ); -} - -sub _handle_cleaned_author_editor { - my ( $self, $authors, @options ) = @_; - map { - my $author = $_; - my $new_author = BibTeX::Parser::Author->new; - map { - $new_author->$_( convert( $author->$_, @options ) ) - } grep { defined $author->$_ } qw( first von last jr ); - $new_author; - } @$authors; -} - -no LaTeX::ToUnicode; - -sub _handle_author_editor { - my $type = shift; - my $self = shift; - if (@_) { - if (@_ == 1) { #single string - # my @names = split /\s+and\s+/i, $_[0]; - $_[0] =~ s/^\s*//; - $_[0] =~ s/\s*$//; - my @names = BibTeX::Parser::_split_braced_string($_[0], - '\s+and\s+'); - if (!scalar @names) { - $self->error('Bad names in author/editor field'); - return; - } - $self->{"_$type"} = [map {new BibTeX::Parser::Author $_} @names]; - $self->field($type, join " and ", @{$self->{"_$type"}}); - } else { - $self->{"_$type"} = []; - foreach my $param (@_) { - if (ref $param eq "BibTeX::Author") { - push @{$self->{"_$type"}}, $param; - } else { - push @{$self->{"_$type"}}, new BibTeX::Parser::Author $param; - } - - $self->field($type, join " and ", @{$self->{"_$type"}}); - } - } - } else { - unless ( defined $self->{"_$type"}) { - my @names = BibTeX::Parser::_split_braced_string($self->{$type} || "", '\s+and\s+' ); - $self->{"_$type"} = [map {new BibTeX::Parser::Author $_} @names]; - } - return @{$self->{"_$type"}}; - } -} - - - -sub author { - _handle_author_editor('author', @_); -} - - -sub editor { - _handle_author_editor('editor', @_); -} - - -sub fieldlist { - my $self = shift; - - return grep {!/^_/} keys %$self; -} - - -sub has { - my ($self, $field) = @_; - - return defined $self->{$field}; -} - -sub _sanitize_field { - my $value = shift; - for ($value) { - tr/\{\}//d; - s/\\(?!=[ \\])//g; - s/\\\\/\\/g; - } - return $value; -} - - - -sub raw_bibtex { - my $self = shift; - if (@_) { - $self->{_raw} = shift; - } - return $self->{_raw}; -} - -sub pre { - my $self = shift; - if (@_) { - $self->{_pre} = shift; - } - return $self->{_pre}; -} - - -sub to_string { - my $self = shift; - my %options=@_; - if (!exists($options{canonize_names})) { - $options{canonize_names}=1; - } - my @fields = grep {!/^_/} keys %$self; - @fields = sort { - $self->{_fieldnums}->{$a} <=> - $self->{_fieldnums}->{$b}} @fields; - my $result = ''; - if ($options{print_pre}) { - $result .= $self->pre()."\n"; - } - my $type = $self->type; - if (exists($options{type_capitalization})) { - if ($options{type_capitalization} eq 'Lowercase') { - $type = lc $type; - } - if ($options{type_capitalization} eq 'Titlecase') { - $type = ucfirst lc $type; - } - } - print STDERR $self->key, "\n"; - $result .= '@'.$type."{".$self->key.",\n"; - foreach my $field (@fields) { - my $value = $self->field($field); - if ($field eq 'author' && $options{canonize_names}) { - my @names = ($self->author); - $value = join(' and ', @names); - } - if ($field eq 'editor' && $options{canonize_names}) { - my @names = ($self->editor); - $value = join(' and ', @names); - } - if (exists($options{field_capitalization})) { - if ($options{field_capitalization} eq 'Uppercase') { - $field = uc $field; - } - if ($options{field_capitalization} eq 'Titlecase') { - $field = ucfirst $field; - } - } - $result .= " $field = {"."$value"."},\n"; - } - $result .= "}"; - return $result; -} - -1; # End of BibTeX::Entry - -__END__ -=pod - -=head1 NAME - -BibTeX::Parser::Entry - Contains a single entry of a BibTeX document. - -=head1 SYNOPSIS - -This class ist a wrapper for a single BibTeX entry. It is usually created -by a BibTeX::Parser. - - use BibTeX::Parser::Entry; - - my $entry = BibTeX::Parser::Entry->new($type, $key, $parse_ok, \%fields); - - if ($entry->parse_ok) { - my $type = $entry->type; - my $key = $enty->key; - print $entry->field("title"); - my @authors = $entry->author; - my @editors = $entry->editor; - - ... - - print $entry->to_string; - } - - - - - -=head1 FUNCTIONS - -=head2 new - -Create new entry. - -=head2 parse_ok - -If the entry was correctly parsed, this method returns a true value, false otherwise. - -=head2 error - -Return the error message, if the entry could not be parsed or undef otherwise. - -=head2 type - -Get or set the type of the entry, eg. 'ARTICLE' or 'BOOK'. Return value is -always uppercase. - -=head2 key - -Get or set the reference key of the entry. - -=head2 field($name [, $value]) - -Get or set the contents of a field. The first parameter is the name of the -field, the second (optional) value is the new value. - -=head2 cleaned_field($name) - -Retrieve the contents of a field in a format that is cleaned of TeX markup. - -=head2 cleaned_author - -Get an array of L<BibTeX::Parser::Author> objects for the authors of this -entry. Each name has been cleaned of accents and braces. - -=head2 cleaned_editor - -Get an array of L<BibTeX::Parser::Author> objects for the editors of this -entry. Each name has been cleaned of accents and braces. - -=head2 author([@authors]) - -Get or set the authors. Returns an array of L<BibTeX::Author|BibTeX::Author> -objects. The parameters can either be L<BibTeX::Author|BibTeX::Author> objects -or strings. - -Note: You can also change the authors with $entry->field('author', $authors_string) - -=head2 editor([@editors]) - -Get or set the editors. Returns an array of L<BibTeX::Author|BibTeX::Author> -objects. The parameters can either be L<BibTeX::Author|BibTeX::Author> objects -or strings. - -Note: You can also change the authors with $entry->field('editor', $editors_string) - -=head2 fieldlist () - -Returns a list of all the fields used in this entry. - -=head2 has($fieldname) - -Returns a true value if this entry has a value for $fieldname. - -=head2 pre () - -Return the text in BibTeX file before the entry - -=head2 raw_bibtex () - -Return raw BibTeX entry (if available). - -=head2 to_string ([options]) - -Returns a text of the BibTeX entry in BibTeX format. Options are -a hash. - -=over 4 - -=item C<canonize_names> - -If true (the default), authors' and editors' -names are translated into canonical bibtex form. The command -C<$entry-E<gt>to_string(canonize_names=E<gt>0)> overrides this behavior. - -=item C<field_capitalization> - -Capitalization of the field names. -Can take values 'Uppercase', 'Lowercase' (the default) or 'Titlecase' - -=item C<print_pre> - -False by default. If true, the text in the Bib file before the -entry is printed. Note that at present we assume the text -before the entry NEVER has the @ symbol inside - -=item C<type_capitalization> - -Capitalization of the type names. -Can take values 'Uppercase' (the default), 'Lowercase' or 'Titlecase' - - -=back - -=head1 VERSION - -version 1.04 - -=head1 AUTHOR - -Gerhard Gossen <gerhard.gossen@googlemail.com> and -Boris Veytsman <boris@varphi.com> and -Karl Berry <karl@freefriends.org> - -=head1 COPYRIGHT AND LICENSE - -This software is copyright (c) 2013-2023 by Gerhard Gossen and Boris Veytsman and Karl Berry - -This is free software; you can redistribute it and/or modify it under -the same terms as the Perl 5 programming language system itself. - -=cut - diff --git a/support/bibtexperllibs/BibTeX-Parser/notes b/support/bibtexperllibs/BibTeX-Parser/notes deleted file mode 100644 index 5e41df4090..0000000000 --- a/support/bibtexperllibs/BibTeX-Parser/notes +++ /dev/null @@ -1,26 +0,0 @@ -from Biblio::Catalog::BibTeX : - -sub tex2html { - my $latex = shift; - return "" unless defined($latex); - - for ($latex) { - s/\\textit\{([^{]+)\}/<i>$1<\/i>/g; - s/\\textbf\{([^{]+)\}/<b>$1<\/b>/g; - s/\\texttt\{([^{]+)\}/<tt>$1<\/tt>/g; - s/\\emph{([^{]+)}/<i>$1<\/i>/g; - s/\\item\b/<li>/g; - s/\\_/_/g; - s/\\mbox{([^}]+)}/$1/g; - s/{\\it\s([^}]+)}/<i>$1<\/i>/g; - s/\\LaTeX/LaTeX/g; - s/\\begin{itemize}/<ul>/g; - s/\\begin{quote}/<blockquote><i>/g; - s/\\end{quote}/<\/i><\/blockquote>/g; - s/\\end{itemize}/<\/ul>/g; - s/[}{]//g; - } - - return $latex; -} - diff --git a/support/bibtexperllibs/BibTeX-Parser/t/00-load.t b/support/bibtexperllibs/BibTeX-Parser/t/00-load.t deleted file mode 100644 index 9862dc7986..0000000000 --- a/support/bibtexperllibs/BibTeX-Parser/t/00-load.t +++ /dev/null @@ -1,11 +0,0 @@ -#!/usr/bin/perl -w - -use Test::More tests => 3; - -BEGIN { - use_ok( 'BibTeX::Parser' ); - use_ok( 'BibTeX::Parser::Author' ); - use_ok( 'BibTeX::Parser::Entry' ); -} - -diag( "Testing BibTeX::Parser $BibTeX::Parser::VERSION, Perl $], $^X" ); diff --git a/support/bibtexperllibs/BibTeX-Parser/t/01-parse.t b/support/bibtexperllibs/BibTeX-Parser/t/01-parse.t deleted file mode 100644 index 70e298d4be..0000000000 --- a/support/bibtexperllibs/BibTeX-Parser/t/01-parse.t +++ /dev/null @@ -1,36 +0,0 @@ -#!/usr/bin/perl -w - -use Test::More tests => 11; - -use BibTeX::Parser; -use IO::File; - -use constant ENTRIES => 1; - -my $fh = new IO::File "t/bibs/01.bib", "r" ; - -if (defined $fh) { - my $parser = new BibTeX::Parser $fh; - - isa_ok($parser, "BibTeX::Parser"); - - my $count = 0; - - while (my $entry = $parser->next) { - $count++; - isa_ok($entry, "BibTeX::Parser::Entry"); - is($entry->key, "key01", "key"); - is($entry->type, "ARTICLE", "type"); - ok($entry->parse_ok, "parse_ok"); - is($entry->field("year"), 1950, "field"); - is($entry->field("month"), "January~1", "field"); - - my @authors = $entry->author; - is(scalar @authors, 2, "#authors"); - isa_ok($authors[0], "BibTeX::Parser::Author"); - is("$authors[0]", "Duck, Donald", "correct author"); - } - - is($count, ENTRIES, "number of entries"); -} - diff --git a/support/bibtexperllibs/BibTeX-Parser/t/02-parse_string.t b/support/bibtexperllibs/BibTeX-Parser/t/02-parse_string.t deleted file mode 100644 index 90b87eba14..0000000000 --- a/support/bibtexperllibs/BibTeX-Parser/t/02-parse_string.t +++ /dev/null @@ -1,39 +0,0 @@ -#!/usr/bin/perl -w - -use Test::More tests => 7; - -use BibTeX::Parser; - -my %strings = (); - -$_ = 1234; -parse_ok("parse digit string"); - -$_ = '"simple double quoted string"'; -parse_is("simple double quoted string", "- double quoted string"); - -$_ = '"double quotes { with embeded } brackets"'; -parse_is("double quotes { with embeded } brackets", "- with embeded brackets"); - -$_ = '"string 1 " # "string 2"'; -parse_is("string 1 string 2", "- concatenation"); - -$strings{test} = "string"; -$strings{other} = "text"; - -$_ = "test"; -parse_is("string", "- string variable"); - -$_ = "test # other"; -parse_is("stringtext", "- concatenation of string variables"); - -$_ = '"M{\"{u}}nchen"'; -parse_is('M{\"{u}}nchen', "- escaped quote"); - -sub parse_ok { - is(BibTeX::Parser::_parse_string(\%strings), $_, shift); -} - -sub parse_is { - is(BibTeX::Parser::_parse_string(\%strings), shift, shift); -} diff --git a/support/bibtexperllibs/BibTeX-Parser/t/03-parse_entry.t b/support/bibtexperllibs/BibTeX-Parser/t/03-parse_entry.t deleted file mode 100644 index 6b4e4632bc..0000000000 --- a/support/bibtexperllibs/BibTeX-Parser/t/03-parse_entry.t +++ /dev/null @@ -1,102 +0,0 @@ -#!/usr/bin/perl -w - -use Test::More tests => 3; - -use IO::String; -use BibTeX::Parser; - -{ - my $string = q|@article{lin1973, - author = "Shen Lin and Brian W. Kernighan", - title = "An Effective Heuristic Algorithm for the Travelling-Salesman Problem", - journal = "Operations Research", - volume = 21, - year = 1973, - pages = "498--516" - }|; - my $fh = IO::String->new($string); - - my $parser = BibTeX::Parser->new( $fh ); - -#my @result = BibTeX::Parser->_parse($fh); - - my $entry = $parser->next; - - is_deeply($entry, {_type => 'ARTICLE', _key => 'lin1973', author => "Shen Lin and Brian W. Kernighan", - title => "An Effective Heuristic Algorithm for the Travelling-Salesman Problem", - journal => "Operations Research", - volume => 21, - year => 1973, - pages => "498--516", _parse_ok => 1, - _fieldnums => {'author' => 0, 'title' => 1, - 'journal' => 2, 'volume' => 3, - 'year' => 4, 'pages' => 5}, - _pre => '', - _raw => $string}, "parse \@ARTICLE"); - -} -{ - my $string1 = q|@article{lin1973, - author = "Shen Lin and Brian W. Kernighan", - title = "An Effective Heuristic Algorithm for the Travelling-Salesman Problem", - journal = "Operations Research", - volume = 21, - year = 1973, - pages = "498--516" - }|; - my $string = "some -text -$string1"; - my $fh = IO::String->new($string); - - my $parser = BibTeX::Parser->new( $fh ); - -#my @result = BibTeX::Parser->_parse($fh); - - my $entry = $parser->next; - - is_deeply($entry, {_type => 'ARTICLE', _key => 'lin1973', author => "Shen Lin and Brian W. Kernighan", - title => "An Effective Heuristic Algorithm for the Travelling-Salesman Problem", - journal => "Operations Research", - volume => 21, - year => 1973, - pages => "498--516", _parse_ok => 1, - _fieldnums => {'author' => 0, 'title' => 1, - 'journal' => 2, 'volume' => 3, - 'year' => 4, 'pages' => 5}, - _pre => "some\ntext", - _raw => $string1}, "parse \@ARTICLE"); - -} -{ - my $string = q|@InProceedings{Herper:2001:MVS, - author = {Henry Herper}, - title = {{M}odellierung von {S}ystemen: ein
- {A}pplikationsgebiet im {I}nformatikunterricht}, - booktitle = {Informatikunterricht und Medienbildung, INFOS 2001
- (9. Fachtagung Informatik und Schule, Paderborn
- 17.-20- September 2001) -- Tagungsband}, - editor = {Reinhard Keil-Slavik and Johannes Magenheim}, - year = {2001}, -}|; - my $fh = IO::String->new($string); - - my $parser = BibTeX::Parser->new( $fh ); - - my $entry = $parser->next; - - is_deeply($entry, { - _type => 'INPROCEEDINGS', - _key => 'Herper:2001:MVS', - _fieldnums => {'author' => 0, 'title' => 1, - 'booktitle' => 2, 'editor' => 3, - 'year' => 4}, - author => "Henry Herper", - title => "{M}odellierung von {S}ystemen: ein {A}pplikationsgebiet im {I}nformatikunterricht", - booktitle => "Informatikunterricht und Medienbildung, INFOS 2001 (9. Fachtagung Informatik und Schule, Paderborn 17.-20- September 2001) -- Tagungsband", - editor => "Reinhard Keil-Slavik and Johannes Magenheim", - year => 2001, - _parse_ok => 1, - _pre => '', - _raw => $string}, "parse \@ARTICLE"); -} diff --git a/support/bibtexperllibs/BibTeX-Parser/t/04-entry.t b/support/bibtexperllibs/BibTeX-Parser/t/04-entry.t deleted file mode 100644 index 3ca9797011..0000000000 --- a/support/bibtexperllibs/BibTeX-Parser/t/04-entry.t +++ /dev/null @@ -1,42 +0,0 @@ -#!/usr/bin/perl -w - -use Test::More tests => 13; - -use BibTeX::Parser::Entry; - - -my $entry = new BibTeX::Parser::Entry("type", "key", 1, {title => "title"}); - -isa_ok($entry, "BibTeX::Parser::Entry"); - -is($entry->type, "TYPE", "Entry::type get"); - -$entry->type("newtype"); - -is($entry->type, "NEWTYPE", "Entry::type set"); - -is($entry->key, "key", "Entry::key get"); - -$entry->key("newkey"); - -is($entry->key, "newkey", "Entry::key set"); - -is($entry->field("title"), "title", "Entry::field with new"); - -$entry->field("title" => "newtitle"); - -is($entry->field("title"), "newtitle", "Entry::field overwrite"); - -$entry->field("year" => 2008); - -is($entry->field("year"), 2008, "Entry::field set"); - -is($entry->field("pages"), undef, "Entry::field undef on unknown value"); - -is($entry->fieldlist, 2, "size of fieldlist"); - -ok($entry->has("title"), "Entry::has true on known value"); - -ok($entry->has("year"), "Entry::has true on known value"); - -ok( ! $entry->has("pages"), "Entry::has false on unknown value"); diff --git a/support/bibtexperllibs/BibTeX-Parser/t/05-author.t b/support/bibtexperllibs/BibTeX-Parser/t/05-author.t deleted file mode 100644 index 45bc5413df..0000000000 --- a/support/bibtexperllibs/BibTeX-Parser/t/05-author.t +++ /dev/null @@ -1,68 +0,0 @@ -#!/usr/bin/perl - -use Test::More; - -use BibTeX::Parser::Author; - -# Names from Mittelbach, Goossens: The LaTeX Companion, Second Edition. -my %names = ( - "Donald E. Knuth" => ["Donald E.", undef, "Knuth", undef], - "John Chris Smith" => ["John Chris", undef, "Smith", undef], - "Smith, John Chris" => ["John Chris", undef, "Smith", undef], - "Thomas von Neumann" => ["Thomas", "von", "Neumann", undef], - "von Neumann, Thomas" => ["Thomas", "von", "Neumann", undef], - "Lopez Fernandez, Miguel" => ["Miguel", undef, "Lopez Fernandez", undef], - "Pierre de la Porte" => ["Pierre", "de la", "Porte", undef], - "Smith, Jr., Robert" => ["Robert", undef, "Smith", "Jr."], - "von Smith, Jr., Robert" => ["Robert", "von", "Smith", "Jr."], - "Johannes Martinus Albertus van de Groene Heide" => ["Johannes Martinus Albertus", "van de", "Groene Heide", undef], - "Maria-Victoria Delgrande" => ["Maria-Victoria", undef, "Delgrande", undef], - "Anonymous" => [undef, undef, "Anonymous", undef], - "von Neumann" => [undef, "von", "Neumann", undef], - "N. Tetteh-Lartey" => ["N.", undef, "Tetteh-Lartey", undef], - "von Tetteh-Lartey, N." => ["N.", "von", "Tetteh-Lartey", undef], - "von Tetteh-Lartey, Jr., N." => ["N.", "von", "Tetteh-Lartey", "Jr."], - "" => [undef, undef, undef, undef], - " " => [undef, undef, undef, undef], - "\n" => [undef, undef, undef, undef], - "al." => [undef, undef, "al.", undef], - "et.~al." => [undef, undef, "et.~al.", undef], - "O'Malley, A." => ["A.", undef, "O'Malley", undef], - "A. O'Malley" => ["A.", undef, "O'Malley", undef], - "Arthur O'Malley" => ["Arthur", undef, "O'Malley", undef], - "O'Malley, Arthur" => ["Arthur", undef, "O'Malley", undef], - 'L.M. M\"uller' => ["L.M.", undef, 'M\"uller', undef], - 'M\"uller, L.M.' => ["L.M.", undef, 'M\"uller', undef], - 'L.M. M"uller' => ["L.M.", undef, 'M"uller', undef], - 'M"uller, L.M.' => ["L.M.", undef, 'M"uller', undef], - 'van Beethoven, Ludwig' => ["Ludwig", "van", "Beethoven", undef ], - '{Barnes and Noble, Inc.}' => [undef, undef, '{Barnes and Noble, Inc.}', undef], - "Ludwigg {van Beethoven}" => ["Ludwigg", undef, "{van Beethoven}", undef], - '{van Beethoven}, Ludwig' => ["Ludwig", undef, "{van Beethoven}", undef ], -); - -plan tests => (keys(%names) * 6 + 5); - -my $author = new BibTeX::Parser::Author; - -isa_ok($author, "BibTeX::Parser::Author", "Correct type"); - -is($author->first, undef, "Initial state 'first'"); -is($author->von, undef, "Initial state 'von'"); -is($author->last, undef, "Initial state 'last'"); -is($author->jr, undef, "Initial state 'jr'"); - - -foreach my $name (keys %names) { - - is_deeply([BibTeX::Parser::Author->split($name)], $names{$name}, $name =~ /\w/ ? $name : "whitespace name: '$name'" ); - - $author = new BibTeX::Parser::Author $name; - - isa_ok($author, "BibTeX::Parser::Author"); - - is($author->first, $names{$name}->[0] ); - is($author->von, $names{$name}->[1]); - is($author->last, $names{$name}->[2]); - is($author->jr, $names{$name}->[3]); -} diff --git a/support/bibtexperllibs/BibTeX-Parser/t/06-parse_complex.t b/support/bibtexperllibs/BibTeX-Parser/t/06-parse_complex.t deleted file mode 100644 index 95a5848a71..0000000000 --- a/support/bibtexperllibs/BibTeX-Parser/t/06-parse_complex.t +++ /dev/null @@ -1,46 +0,0 @@ -#!/usr/bin/perl - -use Test::More tests => 19; - -use strict; -use IO::File; -use BibTeX::Parser; - -my $fh = IO::File->new("t/bibs/06.bib"); - -my $parser = new BibTeX::Parser $fh; - - -my $entry = $parser->next; - -isa_ok($entry, 'BibTeX::Parser::Entry', "Correct type"); -ok($entry->parse_ok, "Entry parsed correctly"); -is($entry->type, "ARTICLE", "BibTeX type is correct"); -is($entry->field("title"), "Paper title", "Title attribute"); -is($entry->field("year"), 2008); -is($entry->field("month"), "August", "Month expansion"); -is($entry->key, 'key1', "key"); - -my @authors = $entry->author; -is(scalar @authors, 2, "number of authors correct"); -my $author = shift @authors; -is_deeply( - [$author->first, $author->von, $author->last, $author->jr], - ['Gerhard', undef, 'Gossen', undef], "author correct"); - -$author = shift @authors; -is_deeply( - [$author->first, $author->von, $author->last, $author->jr], - ['Ludwig', 'van', 'Beethoven', undef], "author correct"); - -$entry = $parser->next; -isa_ok($entry, 'BibTeX::Parser::Entry', "Correct type"); -ok($entry->parse_ok, "Entry parsed correctly"); -is($entry->type, "BOOK", "BibTeX type is correct"); -is($entry->field("title"), "Book title", "Title attribute"); -is($entry->field("year"), 2008); -is($entry->field("month"), "August", "Month expansion"); -is($entry->key, 'key2', "key"); -@authors = $entry->author; -is(scalar @authors, 1, "number of authors"); -is(scalar $entry->editor, 0, "number of editors"); diff --git a/support/bibtexperllibs/BibTeX-Parser/t/07-parse_englishbib.t b/support/bibtexperllibs/BibTeX-Parser/t/07-parse_englishbib.t deleted file mode 100644 index 3348a55248..0000000000 --- a/support/bibtexperllibs/BibTeX-Parser/t/07-parse_englishbib.t +++ /dev/null @@ -1,42 +0,0 @@ -#!/usr/bin/perl - -use Test::More tests => 8; - -use strict; -use IO::File; -use BibTeX::Parser; - - -my $fh = IO::File->new("t/bibs/english.bib"); - -my $parser = new BibTeX::Parser $fh; - -my $count = 0; - -my $entry = $parser->next; - -is($entry->parse_ok, 0, "Ignore spurious @ before parenthesis"); - -$entry = $parser->next; - -is($entry->parse_ok, 0, "Ignore spurious @ in email address"); - -$entry = $parser->next; - -is(scalar $entry->author, 1, "# authors"); -#@BOOK{Carey, -# AUTHOR="G. V. Carey", -is($entry->field("title"), "Mind the Stop: A Brief Guide to Punctuation", "title"); -is($entry->field("publisher"), "Penguin", "publisher"); -is($entry->field("year"), 1958, "year"); -$count++; - -while ($entry = $parser->next) { - $count++; - if ($count == 8) { - is( scalar $entry->author, 4, 'Last entry has 4 authors'); - } -} - - -is($count, 8, "number of entries"); diff --git a/support/bibtexperllibs/BibTeX-Parser/t/08-parse_large.t b/support/bibtexperllibs/BibTeX-Parser/t/08-parse_large.t deleted file mode 100644 index 5375d9a062..0000000000 --- a/support/bibtexperllibs/BibTeX-Parser/t/08-parse_large.t +++ /dev/null @@ -1,24 +0,0 @@ -#!/usr/bin/perl -w - -use Test::More skip_all => "Performance test", tests => 1; - -use IO::File; -use BibTeX::Parser; - -my $starttime = time; - -my $fh = IO::File->new('t/bibs/java.bib'); #cl-nlp8x.bib'); - -my $parser = new BibTeX::Parser $fh; -my $entries = 0; - -#my @result = BibTeX::Parser->_parse($fh); - -while(my $entry = $parser->next) { - $entries++; -} - -my $parsetime = time - $starttime; - -warn "Parsed $entries entries in $parsetime seconds"; -ok(1, "Parsed $entries entries in $parsetime seconds"); diff --git a/support/bibtexperllibs/BibTeX-Parser/t/09-complex.t b/support/bibtexperllibs/BibTeX-Parser/t/09-complex.t deleted file mode 100644 index 56ce75cceb..0000000000 --- a/support/bibtexperllibs/BibTeX-Parser/t/09-complex.t +++ /dev/null @@ -1,42 +0,0 @@ -#!/usr/bin/perl -w - -use Test::More tests => 1; - -use IO::File; -use BibTeX::Parser; - - -my $fh = IO::File->new('t/bibs/09-complex.bib'); - -my $parser = new BibTeX::Parser $fh; - -#my @result = BibTeX::Parser->_parse($fh); - -my $entry = $parser->next; - -is_deeply($entry, {_type => 'ARTICLE', _key => 'Ahrenberg88', - author => "L. Ahrenberg and A. Jonsson", - title => "An interactive system for tagging dialogues", - journal => 'Literary \& Linguistic Computing', - volume => 3, - number => "2", - pages => "66--70", - year => "1988", - keywords => "conver", - _fieldnums => {'author' => 0, 'title' => 1, - 'journal' => 2, 'volume' => 3, - 'number' => 4, 'pages'=> 5, - 'year' => 6, 'keywords' => 7}, - _parse_ok => 1, - _raw => '@Article{Ahrenberg88, - author = "L. Ahrenberg and A. Jonsson", - title = "An interactive system for tagging dialogues", - journal = "Literary \& Linguistic Computing", - volume = "3", - number = "2", - pages = "66--70", - year = "1988", - keywords = "conver", -}', - _pre => '' - }, "parse \@ARTICLE"); diff --git a/support/bibtexperllibs/BibTeX-Parser/t/10-funnyname.t b/support/bibtexperllibs/BibTeX-Parser/t/10-funnyname.t deleted file mode 100644 index 8ab48396e9..0000000000 --- a/support/bibtexperllibs/BibTeX-Parser/t/10-funnyname.t +++ /dev/null @@ -1,61 +0,0 @@ -#!/usr/bin/perl -w - -use Test::More tests => 11; - -use IO::File; -use BibTeX::Parser; - -my $fh = IO::File->new('t/bibs/10-funnyname.bib'); - -my $parser = BibTeX::Parser->new($fh); - -#my @result = BibTeX::Parser->_parse($fh); - -my $entry = $parser->next; - -is_deeply( - $entry, - { - _type => 'ARTICLE', - _key => 'testkey', - author => 'A. Bar and L.M. M\"uller', - title => 'foo', - journal => 'journal', - volume => 1, - number => 1, - pages => 1, - year => 2008, - _parse_ok => 1, - _fieldnums => {'year' => 0, 'title' => 1, - 'author' => 2, 'journal' => 3, - 'volume' => 4, 'number'=> 5, - 'pages' => 6}, - _raw => '@article{testkey, - year = {2008}, - title = "foo", - author = {A. Bar and L.M. M\"uller}, - journal = {journal}, - volume = {1}, - number = {1}, - pages = {1}, -}', - _pre => '' - }, - "parse \@ARTICLE" -); - -my @authors = $entry->author; - -pass("->author didn't loop forever"); -ok(@authors == 2, "Two authors"); - -is($authors[0]->first, 'A.', "A1 first name"); -is($authors[0]->last, 'Bar', "A1 last name"); -ok(!$authors[0]->von, "A1 no 'von'"); -ok(!$authors[0]->jr, "A1 no 'jr'"); - -is($authors[1]->first, 'L.M.', "A2 first name"); -is($authors[1]->last, 'M\"uller', "A2 last name"); -ok(!$authors[1]->von, "A2 no 'von'"); -ok(!$authors[1]->jr, "A2 no 'jr'"); - diff --git a/support/bibtexperllibs/BibTeX-Parser/t/11-split_braced.t b/support/bibtexperllibs/BibTeX-Parser/t/11-split_braced.t deleted file mode 100644 index 85a29be86f..0000000000 --- a/support/bibtexperllibs/BibTeX-Parser/t/11-split_braced.t +++ /dev/null @@ -1,28 +0,0 @@ -#!/usr/bin/perl -w - -use Test::More tests => 12; - -use BibTeX::Parser; -use IO::File; - -my @tokens = BibTeX::Parser::_split_braced_string("a and b", '\s+and\s+'); -is(scalar @tokens,2); -is($tokens[0],'a'); -is($tokens[1],'b'); - -@tokens = BibTeX::Parser::_split_braced_string("a {and} b", '\s+and\s+'); -is(scalar @tokens,1); -is($tokens[0],'a {and} b'); - -@tokens = BibTeX::Parser::_split_braced_string("a {and b", '\s+and\s+'); -is(scalar @tokens,0); - -@tokens = BibTeX::Parser::_split_braced_string("} a {", '\s+'); -is(scalar @tokens,0); - -@tokens = BibTeX::Parser::_split_braced_string("{a b} c {d}e u", '\s+'); -is(scalar @tokens,4); -is($tokens[0],'{a b}'); -is($tokens[1],'c'); -is($tokens[2],'{d}e'); -is($tokens[3],'u'); diff --git a/support/bibtexperllibs/BibTeX-Parser/t/12-von_token.t b/support/bibtexperllibs/BibTeX-Parser/t/12-von_token.t deleted file mode 100644 index 6daceafa96..0000000000 --- a/support/bibtexperllibs/BibTeX-Parser/t/12-von_token.t +++ /dev/null @@ -1,12 +0,0 @@ -#!/usr/bin/perl -w - -use Test::More tests => 5; - -use BibTeX::Parser::Author; -use IO::File; - -is(BibTeX::Parser::Author::_is_von_token('von'),1); -is(BibTeX::Parser::Author::_is_von_token('Von'),0); -is(BibTeX::Parser::Author::_is_von_token('\noop{von}Von'),1); -is(BibTeX::Parser::Author::_is_von_token('\noop{Von}von'),0); -is(BibTeX::Parser::Author::_is_von_token('\noop{AE}{\AE}schylus'),0); diff --git a/support/bibtexperllibs/BibTeX-Parser/t/13_output.t b/support/bibtexperllibs/BibTeX-Parser/t/13_output.t deleted file mode 100644 index 02fb1cd26f..0000000000 --- a/support/bibtexperllibs/BibTeX-Parser/t/13_output.t +++ /dev/null @@ -1,39 +0,0 @@ -#!/usr/bin/perl -w - -use Test::More; - -use BibTeX::Parser; -use IO::File; - - -my $fh = new IO::File "t/bibs/01.bib", "r" ; - -my $parser = new BibTeX::Parser $fh; - - - - -while (my $entry = $parser->next) { - if($entry->key eq 'key01') { - my $result1='@ARTICLE{key01, - year = {1950}, - author = {Duck, Donald and Else, Someone}, - editor = {Itor, E. D. and Other, A. N.}, - title = {Title text}, - month = {January~1}, -}'; - my $result2='@ARTICLE{key01, - year = {1950}, - author = {Donald Duck and Someone Else}, - editor = {E. D. Itor and A. N. Other}, - title = {Title text}, - month = {January~1}, -}'; - is($entry->to_string,$result1); - is($entry->to_string(canonize_names=>0),$result2); - } - -} - -done_testing(); - diff --git a/support/bibtexperllibs/BibTeX-Parser/t/14-extratext.t b/support/bibtexperllibs/BibTeX-Parser/t/14-extratext.t deleted file mode 100644 index 0a663b043a..0000000000 --- a/support/bibtexperllibs/BibTeX-Parser/t/14-extratext.t +++ /dev/null @@ -1,65 +0,0 @@ -#!/usr/bin/perl -w - - -use Test::More tests => 6; - -use BibTeX::Parser; -use IO::File; - - -my $fh = new IO::File "t/bibs/14-extratext.bib", "r" ; - -my $parser = new BibTeX::Parser $fh; - - - - -while (my $entry = $parser->next) { - - if($entry->key eq 'Partridge') { - my $result1= '@BOOK{Partridge, - author = {Partridge, Eric}, - title = {Use and Abuse: a Guide to Good {E}nglish}, - publisher = {Hamish Hamilton}, - edition = {4}, - year = {1970}, -}'; - my $result2 = "First published in 1947\n$result1"; - is($entry->to_string,$result1); - is($entry->to_string(print_pre=>1),$result2); - } - - if ($entry->key eq 'Cooper') { - my $result1 = '@BOOK{Cooper, - author = {Cooper, Bruce M.}, - title = {Writing Technical Reports}, - publisher = {Penguin}, - year = {1964}, -}'; - my $result2 = "\n\n$result1"; - is($entry->to_string,$result1); - is($entry->to_string(print_pre=>1),$result2); - } - - - if ($entry->key eq 'Fowler-ModernEnglish') { - - my $result1 = '@BOOK{Fowler-ModernEnglish, - author = {Fowler, H. W.}, - title = {[A Dictionary of] Modern {E}nglish Usage}, - publisher = {Oxford University Press}, - edition = {2}, - year = {1965}, -}'; - my $result2 = ' - - -First published in 1926 -'. $result1; - is($entry->to_string,$result1); - is($entry->to_string(print_pre=>1),$result2); - } -} - -done_testing(); - diff --git a/support/bibtexperllibs/BibTeX-Parser/t/15-capitalization.t b/support/bibtexperllibs/BibTeX-Parser/t/15-capitalization.t deleted file mode 100644 index 4254f5c12f..0000000000 --- a/support/bibtexperllibs/BibTeX-Parser/t/15-capitalization.t +++ /dev/null @@ -1,72 +0,0 @@ -#!/usr/bin/perl -w - -use Test::More tests=>7; - -use BibTeX::Parser; -use IO::File; - - -my $fh = new IO::File "t/bibs/01.bib", "r" ; - -my $parser = new BibTeX::Parser $fh; - - - - -while (my $entry = $parser->next) { - if($entry->key eq 'key01') { - my $result1='@ARTICLE{key01, - year = {1950}, - author = {Duck, Donald and Else, Someone}, - editor = {Itor, E. D. and Other, A. N.}, - title = {Title text}, - month = {January~1}, -}'; - my $result2='@ARTICLE{key01, - YEAR = {1950}, - AUTHOR = {Duck, Donald and Else, Someone}, - EDITOR = {Itor, E. D. and Other, A. N.}, - TITLE = {Title text}, - MONTH = {January~1}, -}'; - my $result3='@ARTICLE{key01, - Year = {1950}, - Author = {Duck, Donald and Else, Someone}, - Editor = {Itor, E. D. and Other, A. N.}, - Title = {Title text}, - Month = {January~1}, -}'; - my $result4='@article{key01, - year = {1950}, - author = {Duck, Donald and Else, Someone}, - editor = {Itor, E. D. and Other, A. N.}, - title = {Title text}, - month = {January~1}, -}'; - my $result5='@Article{key01, - year = {1950}, - author = {Duck, Donald and Else, Someone}, - editor = {Itor, E. D. and Other, A. N.}, - title = {Title text}, - month = {January~1}, -}'; - is($entry->to_string,$result1); - is($entry->to_string(field_capitalization=>'Lowercase'), - $result1); - is($entry->to_string(field_capitalization=>'Uppercase'), - $result2); - is($entry->to_string(field_capitalization=>'Titlecase'), - $result3); - - is($entry->to_string(type_capitalization=>'Lowercase'), - $result4); - is($entry->to_string(type_capitalization=>'Uppercase'), - $result1); - is($entry->to_string(type_capitalization=>'Titlecase'), - $result5); - } - -} - -done_testing(); - diff --git a/support/bibtexperllibs/BibTeX-Parser/t/bibs/01.bib b/support/bibtexperllibs/BibTeX-Parser/t/bibs/01.bib deleted file mode 100644 index 7f6233d177..0000000000 --- a/support/bibtexperllibs/BibTeX-Parser/t/bibs/01.bib +++ /dev/null @@ -1,7 +0,0 @@ -@ARTICLE{key01, - year = 1950, - author = {Donald Duck and Someone Else}, - editor = {E. D. Itor and A. N. Other}, - title = {Title text}, - month = jan # "~1" -} diff --git a/support/bibtexperllibs/BibTeX-Parser/t/bibs/06.bib b/support/bibtexperllibs/BibTeX-Parser/t/bibs/06.bib deleted file mode 100644 index 242ae662cc..0000000000 --- a/support/bibtexperllibs/BibTeX-Parser/t/bibs/06.bib +++ /dev/null @@ -1,27 +0,0 @@ -this is text, which is ignored by bibtex. - -@PREAMBLE{ - This is only used for BibTeX files used in LaTeX documents -} - -@Comment{ - Comments are ignored too. -} - -@ARTICLE{key1, - author = {Gerhard Gossen and Ludwig van Beethoven}, - title = "Paper title", - year = 2008, - month = aug, -} - -@STRING{ gerhard = "Gerhard" } - -@STRING{ gossen = "Gossen" } - -@BOOK{ key2, - author = gerhard # " " # gossen, - title = "Book title", - year = "2008", - month = aug, -} diff --git a/support/bibtexperllibs/BibTeX-Parser/t/bibs/09-complex.bib b/support/bibtexperllibs/BibTeX-Parser/t/bibs/09-complex.bib deleted file mode 100644 index cacf322723..0000000000 --- a/support/bibtexperllibs/BibTeX-Parser/t/bibs/09-complex.bib +++ /dev/null @@ -1,11 +0,0 @@ -@Article{Ahrenberg88, - author = "L. Ahrenberg and A. Jonsson", - title = "An interactive system for tagging dialogues", - journal = "Literary \& Linguistic Computing", - volume = "3", - number = "2", - pages = "66--70", - year = "1988", - keywords = "conver", -} - diff --git a/support/bibtexperllibs/BibTeX-Parser/t/bibs/10-funnyname.bib b/support/bibtexperllibs/BibTeX-Parser/t/bibs/10-funnyname.bib deleted file mode 100644 index 050fbc0534..0000000000 --- a/support/bibtexperllibs/BibTeX-Parser/t/bibs/10-funnyname.bib +++ /dev/null @@ -1,10 +0,0 @@ -@article{testkey, - year = {2008}, - title = "foo", - author = {A. Bar and L.M. M\"uller}, - journal = {journal}, - volume = {1}, - number = {1}, - pages = {1}, -} - diff --git a/support/bibtexperllibs/BibTeX-Parser/t/bibs/14-extratext.bib b/support/bibtexperllibs/BibTeX-Parser/t/bibs/14-extratext.bib deleted file mode 100644 index 56f96aa01b..0000000000 --- a/support/bibtexperllibs/BibTeX-Parser/t/bibs/14-extratext.bib +++ /dev/null @@ -1,22 +0,0 @@ -First published in 1947 -@BOOK{Partridge, - AUTHOR="Eric Partridge", - TITLE="Use and Abuse: a Guide to Good {E}nglish", - PUBLISHER="Hamish Hamilton", - EDITION="4", YEAR="1970"} - - -@BOOK{Cooper, - AUTHOR="Bruce M. Cooper", - TITLE="Writing Technical Reports", - PUBLISHER="Penguin", YEAR="1964"} - - - -First published in 1926 -@BOOK{Fowler-ModernEnglish, - AUTHOR="H. W. Fowler", - TITLE="[A Dictionary of] Modern {E}nglish Usage", - PUBLISHER="Oxford University Press", - EDITION="2", YEAR="1965"} - diff --git a/support/bibtexperllibs/BibTeX-Parser/t/bibs/braces.bib b/support/bibtexperllibs/BibTeX-Parser/t/bibs/braces.bib deleted file mode 100644 index 3791fb5760..0000000000 --- a/support/bibtexperllibs/BibTeX-Parser/t/bibs/braces.bib +++ /dev/null @@ -1,21 +0,0 @@ -@Article{scholkopf98kpca, - author = {Bernhard {Sch\"olkopf} and Alex Smola and K.R. Muller}, - title = {Nonlinear component analysis as a kernel eigenvalue -problem}, - journal = {Neural Computation}, - year = {1998}, - volume = {10}, - pages = {1299--1319} -} - -@article{brownetal93, - author = {Peter F. Brown and Stephen A. {Della Pietra} and - Vincent J. {Della Pietra} and Robert~L. Mercer}, - title = {The Mathematics of Statistical Machine Translation: - Parameter Estimation}, - journal = {Computational Linguistics}, - year = 1993, - volume = 19, - number = 2, - pages = {263-311} -} diff --git a/support/bibtexperllibs/BibTeX-Parser/t/bibs/endnote.txt b/support/bibtexperllibs/BibTeX-Parser/t/bibs/endnote.txt deleted file mode 100644 index e75f1d2050..0000000000 --- a/support/bibtexperllibs/BibTeX-Parser/t/bibs/endnote.txt +++ /dev/null @@ -1,6 +0,0 @@ -@article{ - volume = {59}, - number = {6}, - year = {1999} -} - diff --git a/support/bibtexperllibs/BibTeX-Parser/t/bibs/engineering_village.txt b/support/bibtexperllibs/BibTeX-Parser/t/bibs/engineering_village.txt deleted file mode 100644 index 256f5a853d..0000000000 --- a/support/bibtexperllibs/BibTeX-Parser/t/bibs/engineering_village.txt +++ /dev/null @@ -1,24 +0,0 @@ -@inproceedings{1997493856789 , -language = {English}, -year = {1997}, -} - - -@inproceedings{1998043944915 , -language = {English}, -year = {1997}, -} - - -@article{2003137419501 , -language = {English}, -year = {2002}, -} - - -@inproceedings{2002367072517 , -language = {English}, -year = {2002}, -} - - diff --git a/support/bibtexperllibs/BibTeX-Parser/t/bibs/english.bib b/support/bibtexperllibs/BibTeX-Parser/t/bibs/english.bib deleted file mode 100644 index f0f097409f..0000000000 --- a/support/bibtexperllibs/BibTeX-Parser/t/bibs/english.bib +++ /dev/null @@ -1,55 +0,0 @@ -$Id: @(#) english.bib 1.0 23-OCT-1989 17:10:00 Aston archive$ - -Please notify Adrian F Clark <alien@uk.ac.essex.ese> of any additions -or corrections to this list. - -@BOOK{Carey, - AUTHOR="G. V. Carey", - TITLE="Mind the Stop: A Brief Guide to Punctuation", - PUBLISHER="Penguin", YEAR="1958"} - -@BOOK{Cooper, - AUTHOR="Bruce M. Cooper", - TITLE="Writing Technical Reports", - PUBLISHER="Penguin", YEAR="1964"} - -@BOOK{Fowler-ModernEnglish, - AUTHOR="H. W. Fowler", - TITLE="[A Dictionary of] Modern {E}nglish Usage", - PUBLISHER="Oxford University Press", - EDITION="2", YEAR="1965"} - (but first published in 1926) - -@BOOK{Fowler-KingsEnglish, - AUTHOR="H. W. Fowler and F. G. Fowler", - TITLE="The {K}ing's {E}nglish", - PUBLISHER="Oxford University Press", - EDITION="3", YEAR="1931"} - (but first published in 1906) - -@BOOK{Gowers, - AUTHOR="Sir Ernest Gowers", - TITLE="The Complete Plain Words", - PUBLISHER="Penguin", YEAR="1954"} - (but first published by HMSO) - -@BOOK{Hart, - AUTHOR="Horace Hart", - TITLE="[Hart's] Rules for Compositors and Readers - [at the Oxford University Press]", - PUBLISHER="Oxford University Press", - EDITION="39", YEAR="1983"} - (but first published in 1893) - -@BOOK{Partridge, - AUTHOR="Eric Partridge", - TITLE="Use and Abuse: a Guide to Good {E}nglish", - PUBLISHER="Hamish Hamilton", - EDITION="4", YEAR="1970"} - (but first published in 1947) - -@BOOK{Quirk-CompGram, - AUTHOR="Randolph Quirk and Sydney Greenbaum and Geoffrey Leach and - Jan Svartnik", - TITLE="A Comprehensive Grammar of the {E}nglish Language", - PUBLISHER="Longman", YEAR="1985"} diff --git a/support/bibtexperllibs/BibTeX-Parser/t/bibs/mathscinet.txt b/support/bibtexperllibs/BibTeX-Parser/t/bibs/mathscinet.txt deleted file mode 100644 index eea5a05a70..0000000000 --- a/support/bibtexperllibs/BibTeX-Parser/t/bibs/mathscinet.txt +++ /dev/null @@ -1,40 +0,0 @@ -MathSciNet </mathscinet/index.html> - - * - Clipboard </mathscinet/clipboard.html> - * Home </mathscinet/index.html> - * Preferences </mathscinet/preferences.html> - * Help </mathscinet/help/headline_review_help_full.html> - * Support Mail </mathscinet/support_mail.html> - * Terms of Use </mathscinet/help/mathscinet_terms_of_use.html> - * University of Southampton - -@article {MR2254280, - VOLUME = {23}, - YEAR = {2006}, -} - - -@article {MR2254274, - VOLUME = {23}, - YEAR = {2006}, -} - - -@article {MR2248052, - VOLUME = {23}, - YEAR = {2006}, -} - - -*Matches:* 3 -Mirror Sites - - -© Copyright 2011, American Mathematical Society -<http://www.ams.org/ams/copyright.html> -Privacy Statement <http://www.ams.org/ams/privacy.html> -American Mathematical Society <http://www.ams.org> -American Mathematical Society -201 Charles Street -Providence, RI 02904-2294 diff --git a/support/bibtexperllibs/BibTeX-Parser/t/bug66325.t b/support/bibtexperllibs/BibTeX-Parser/t/bug66325.t deleted file mode 100644 index ac83b43aa9..0000000000 --- a/support/bibtexperllibs/BibTeX-Parser/t/bug66325.t +++ /dev/null @@ -1,71 +0,0 @@ -#!/usr/bin/perl -w - -use Test::More; - -use BibTeX::Parser; -use IO::File; - -{ - my $fh = new IO::File "t/bibs/endnote.txt", "r" ; - - if (defined $fh) { - my $parser = new BibTeX::Parser $fh; - - while (my $entry = $parser->next) { - isa_ok($entry, "BibTeX::Parser::Entry"); - ok($entry->parse_ok, "parse_ok"); - is($entry->key, undef, "key"); - is($entry->type, "ARTICLE", "type"); - is($entry->field("year"), 1999, "field"); - is($entry->field("volume"), 59, "first field"); - } - } -} - -{ - my $fh = new IO::File "t/bibs/mathscinet.txt", "r" ; - my @keys = qw(MR2254280 MR2254274 MR2248052); - - if (defined $fh) { - my $parser = new BibTeX::Parser $fh; - my $count = 0; - - while (my $entry = $parser->next) { - isa_ok($entry, "BibTeX::Parser::Entry"); - ok($entry->parse_ok, "parse_ok"); - is($entry->key, $keys[$count], "key"); - is($entry->type, "ARTICLE", "type"); - is($entry->field("volume"), 23, "first field"); - is($entry->field("year"), 2006, "field"); - $count++; - } - - is($count, 3, "number of entries"); - } -} - -{ - my $fh = new IO::File "t/bibs/engineering_village.txt", "r" ; - - my @types = qw( inproceedings inproceedings article inproceedings ); - my @keys = qw( 1997493856789 1998043944915 2003137419501 2002367072517 ); - my @years = qw( 1997 1997 2002 2002 ); - - if (defined $fh) { - my $parser = new BibTeX::Parser $fh; - my $count = 0; - - while (my $entry = $parser->next) { - isa_ok($entry, "BibTeX::Parser::Entry"); - ok($entry->parse_ok, "parse_ok"); - is($entry->key, $keys[$count], "key"); - is($entry->type, uc $types[$count], "type"); - is($entry->field("language"), "English", "first field"); - is($entry->field("year"), $years[$count], "field"); - $count++; - } - - is($count, 4, "number of entries"); - } -} -done_testing; diff --git a/support/bibtexperllibs/BibTeX-Parser/t/bug67419.t b/support/bibtexperllibs/BibTeX-Parser/t/bug67419.t deleted file mode 100644 index 0f944f373a..0000000000 --- a/support/bibtexperllibs/BibTeX-Parser/t/bug67419.t +++ /dev/null @@ -1,29 +0,0 @@ -#!/usr/bin/perl -w - -use Test::More; - -use BibTeX::Parser; -use IO::File; - -my $fh = new IO::File "t/bibs/braces.bib", "r" ; -my $parser = new BibTeX::Parser $fh; -while (my $entry=$parser->next) { - is($entry->parse_ok,1); - if ($entry->key eq 'scholkopf98kpca') { - @authors=$entry->author; - is(scalar @authors,3); - is("$authors[0]", '{Sch\"olkopf}, Bernhard'); - is("$authors[1]", 'Smola, Alex'); - is("$authors[2]", 'Muller, K.R.'); - } - if ($entry->key eq 'brownetal93') { - @authors=$entry->author; - is(scalar @authors,4); - is("$authors[0]", 'Brown, Peter F.'); - is("$authors[1]", '{Della Pietra}, Stephen A.'); - is("$authors[2]", '{Della Pietra}, Vincent J.'); - is("$authors[3]", 'Mercer, Robert~L.'); - } -} - -done_testing(); diff --git a/support/bibtexperllibs/BibTeX-Parser/t/cleaned_field.t b/support/bibtexperllibs/BibTeX-Parser/t/cleaned_field.t deleted file mode 100644 index 980fb1d60d..0000000000 --- a/support/bibtexperllibs/BibTeX-Parser/t/cleaned_field.t +++ /dev/null @@ -1,143 +0,0 @@ -#!/usr/bin/perl - -use strict; -use warnings; -use utf8; - -use Test::More; -use BibTeX::Parser::Entry; - -sub new_entry { - BibTeX::Parser::Entry->new( 'ARTICLE', 'Foo2010', 1, { @_ } ); -} -{ - my @german_tests = ( - [ '"a' => 'ä' ], - ['"`' => '„' ], - ["\"'" => '“' ], - ); - - foreach my $test ( @german_tests ) { - my $entry = new_entry( foo => $test->[0] ); - is( $entry->cleaned_field( 'foo', german => 1 ), $test->[1], "Convert $test->[0], german => 1" ); - } -} - -{ - binmode( DATA, ':utf8' ); - while (<DATA>) { - chomp; - my ( $tex, $result ) = split /\t/; - is( new_entry( foo => $tex )->cleaned_field( 'foo' ), $result, "Convert $tex" ); - } - close DATA; -} - -{ - my $entry_with_authors = new_entry( author => 'F{\"o}o Bar and B"ar, F.' ); - my @authors = $entry_with_authors->author; - is( scalar @authors, 2, "Number of authors is correct"); - is( $authors[0]->first, 'F{\"o}o', "non-cleaned version of first" ); - is( $authors[0]->last, 'Bar', "non-cleaned version of last" ); - - is( $authors[1]->first, 'F.', "non-cleaned version of first" ); - is( $authors[1]->last, 'B"ar', "non-cleaned version of last" ); - - my @clean_authors = $entry_with_authors->cleaned_author; - is( $clean_authors[0]->first, 'Föo', "cleaned version of first" ); - is( $clean_authors[0]->last, 'Bar', "cleaned version of last" ); - - is( $clean_authors[1]->first, 'F.', "cleaned version of first" ); - is( $clean_authors[1]->last, 'B"ar', "cleaned version of last" ); -} -done_testing; - -__DATA__ -\# # -\& & -{\`a} à -{\^a} â -{\~a} ã -{\'a} á -{\'{a}} á -{\"a} ä -{\`A} À -{\'A} Á -{\"A} Ä -{\aa} å -{\AA} Å -{\ae} æ -{\bf 12} 12 -{\'c} ć -{\cal P} P -{\c{c}} ç -{\c{C}} Ç -{\c{e}} ȩ -{\c{s}} ş -{\c{S}} Ş -{\c{t}} ţ -{\-d} d -{\`e} è -{\^e} ê -{\'e} é -{\"e} ë -{\'E} É -{\em bits} bits -{\H{o}} ő -{\`i} ì -{\^i} î -{\i} ı -{\`i} ì -{\'i} í -{\"i} ï -{\`\i} ì -{\'\i} í -{\"\i} ï -{\`{\i}} ì -{\'{\i}} í -{\"{\i}} ï -{\it Note} Note -{\k{e}} ę -{\l} ł -{\-l} l -{\log} log -{\~n} ñ -{\'n} ń -{\^o} ô -{\o} ø -{\'o} ó -{\"o} ö -{\"{o}} ö -{\'O} Ó -{\"O} Ö -{\"{O}} Ö -{\rm always} always -{\-s} s -{\'s} ś -{\sc JoiN} JoiN -{\sl bit\/ \bf 7} bit 7 -{\sl L'Informatique Nouvelle} L’Informatique Nouvelle -{\small and} and -{\ss} ß -{\TeX} TeX -{\TM} ™ -{\tt awk} awk -{\^u} û -{\'u} ú -{\"u} ü -{\"{u}} ü -{\'U} Ú -{\"U} Ü -{\u{a}} ă -{\u{g}} ğ -{\v{c}} č -{\v{C}} Č -{\v{e}} ě -{\v{n}} ň -{\v{r}} ř -{\v{s}} š -{\v{S}} Š -{\v{z}} ž -{\v{Z}} Ž -{\'y} ý -{\.{z}} ż diff --git a/support/bibtexperllibs/BibTeX-Parser/t/pod-coverage.t b/support/bibtexperllibs/BibTeX-Parser/t/pod-coverage.t deleted file mode 100644 index fc40a57c2a..0000000000 --- a/support/bibtexperllibs/BibTeX-Parser/t/pod-coverage.t +++ /dev/null @@ -1,18 +0,0 @@ -use strict; -use warnings; -use Test::More; - -# Ensure a recent version of Test::Pod::Coverage -my $min_tpc = 1.08; -eval "use Test::Pod::Coverage $min_tpc"; -plan skip_all => "Test::Pod::Coverage $min_tpc required for testing POD coverage" - if $@; - -# Test::Pod::Coverage doesn't require a minimum Pod::Coverage version, -# but older versions don't recognize some common documentation styles -my $min_pc = 0.18; -eval "use Pod::Coverage $min_pc"; -plan skip_all => "Pod::Coverage $min_pc required for testing POD coverage" - if $@; - -all_pod_coverage_ok(); diff --git a/support/bibtexperllibs/BibTeX-Parser/t/pod.t b/support/bibtexperllibs/BibTeX-Parser/t/pod.t deleted file mode 100644 index e22a39b524..0000000000 --- a/support/bibtexperllibs/BibTeX-Parser/t/pod.t +++ /dev/null @@ -1,12 +0,0 @@ -#!/usr/bin/perl -w - -use strict; -use warnings; -use Test::More; - -# Ensure a recent version of Test::Pod -my $min_tp = 1.22; -eval "use Test::Pod $min_tp"; -plan skip_all => "Test::Pod $min_tp required for testing POD" if $@; - -all_pod_files_ok(); diff --git a/support/bibtexperllibs/BibTeX-Parser/t/release-pod-coverage.t b/support/bibtexperllibs/BibTeX-Parser/t/release-pod-coverage.t deleted file mode 100644 index 3a818499f0..0000000000 --- a/support/bibtexperllibs/BibTeX-Parser/t/release-pod-coverage.t +++ /dev/null @@ -1,21 +0,0 @@ -#!perl - -BEGIN { - unless ($ENV{RELEASE_TESTING}) { - require Test::More; - Test::More::plan(skip_all => 'these tests are for release candidate testing'); - } -} - - -use Test::More; - -eval "use Test::Pod::Coverage 1.08"; -plan skip_all => "Test::Pod::Coverage 1.08 required for testing POD coverage" - if $@; - -eval "use Pod::Coverage::TrustPod"; -plan skip_all => "Pod::Coverage::TrustPod required for testing POD coverage" - if $@; - -all_pod_coverage_ok({ coverage_class => 'Pod::Coverage::TrustPod' }); diff --git a/support/bibtexperllibs/BibTeX-Parser/t/release-pod-syntax.t b/support/bibtexperllibs/BibTeX-Parser/t/release-pod-syntax.t deleted file mode 100644 index d46a955694..0000000000 --- a/support/bibtexperllibs/BibTeX-Parser/t/release-pod-syntax.t +++ /dev/null @@ -1,15 +0,0 @@ -#!perl - -BEGIN { - unless ($ENV{RELEASE_TESTING}) { - require Test::More; - Test::More::plan(skip_all => 'these tests are for release candidate testing'); - } -} - -use Test::More; - -eval "use Test::Pod 1.41"; -plan skip_all => "Test::Pod 1.41 required for testing POD" if $@; - -all_pod_files_ok(); diff --git a/support/bibtexperllibs/LaTeX-ToUnicode/Changes b/support/bibtexperllibs/LaTeX-ToUnicode/Changes deleted file mode 100644 index 3db5c19724..0000000000 --- a/support/bibtexperllibs/LaTeX-ToUnicode/Changes +++ /dev/null @@ -1,27 +0,0 @@ -Changes for LaTeX::ToUnicode - -0.54 2023-11-17 Better handling of \{ \}. New release - -0.53 2023-08-20 Tests fixed, new release - -0.52 2022-11-07 Support many more control sequences, \kern removal, - \<newline>, etc. Add ltxunitxt script to access functionality - from command line. - -0.11 2020-12-12 Updates and cleaing - -0.05 2016-11-23 02:28:35+00:00 - Compatibility with perl 5.25 (Alexandr Ciornii) - -0.04 2015-12-25 19:16:41+00:00 - Macrons are handled properly - -0.03 2010-10-18 18:04:14 - Specify minimal perl version (5.8.0) for UTF-8 support - -0.02 2010/07/09 - Handle accents with \i - Add script used to generate accents table - -0.01 2010/07/09 - First release. diff --git a/support/bibtexperllibs/LaTeX-ToUnicode/LICENSE b/support/bibtexperllibs/LaTeX-ToUnicode/LICENSE deleted file mode 100644 index c3402b3869..0000000000 --- a/support/bibtexperllibs/LaTeX-ToUnicode/LICENSE +++ /dev/null @@ -1,375 +0,0 @@ -Copyright 2010-2023 Gerhard Gossen, Boris Veytsman, Karl Berry - -This is free software; you can redistribute it and/or modify it under -the same terms as the Perl 5 programming language system itself. - -Terms of the Perl programming language system itself - -a) the GNU General Public License as published by the Free - Software Foundation; either version 1, or (at your option) any - later version, or -b) the "Artistic License" - ---- The GNU General Public License, Version 1, February 1989 --- - -This is free software, licensed under: - - The GNU General Public License, Version 1, February 1989 - - GNU GENERAL PUBLIC LICENSE - Version 1, February 1989 - - Copyright (C) 1989 Free Software Foundation, Inc. - 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The license agreements of most software companies try to keep users -at the mercy of those companies. By contrast, our General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. The -General Public License applies to the Free Software Foundation's -software and to any other program whose authors commit to using it. -You can use it for your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Specifically, the General Public License is designed to make -sure that you have the freedom to give away or sell copies of free -software, that you receive source code or can get it if you want it, -that you can change the software or use pieces of it in new free -programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of a such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must tell them their rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License Agreement applies to any program or other work which -contains a notice placed by the copyright holder saying it may be -distributed under the terms of this General Public License. The -"Program", below, refers to any such program or work, and a "work based -on the Program" means either the Program or any work containing the -Program or a portion of it, either verbatim or with modifications. Each -licensee is addressed as "you". - - 1. You may copy and distribute verbatim copies of the Program's source -code as you receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice and -disclaimer of warranty; keep intact all the notices that refer to this -General Public License and to the absence of any warranty; and give any -other recipients of the Program a copy of this General Public License -along with the Program. You may charge a fee for the physical act of -transferring a copy. - - 2. You may modify your copy or copies of the Program or any portion of -it, and copy and distribute such modifications under the terms of Paragraph -1 above, provided that you also do the following: - - a) cause the modified files to carry prominent notices stating that - you changed the files and the date of any change; and - - b) cause the whole of any work that you distribute or publish, that - in whole or in part contains the Program or any part thereof, either - with or without modifications, to be licensed at no charge to all - third parties under the terms of this General Public License (except - that you may choose to grant warranty protection to some or all - third parties, at your option). - - c) If the modified program normally reads commands interactively when - run, you must cause it, when started running for such interactive use - in the simplest and most usual way, to print or display an - announcement including an appropriate copyright notice and a notice - that there is no warranty (or else, saying that you provide a - warranty) and that users may redistribute the program under these - conditions, and telling the user how to view a copy of this General - Public License. - - d) You may charge a fee for the physical act of transferring a - copy, and you may at your option offer warranty protection in - exchange for a fee. - -Mere aggregation of another independent work with the Program (or its -derivative) on a volume of a storage or distribution medium does not bring -the other work under the scope of these terms. - - 3. You may copy and distribute the Program (or a portion or derivative of -it, under Paragraph 2) in object code or executable form under the terms of -Paragraphs 1 and 2 above provided that you also do one of the following: - - a) accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of - Paragraphs 1 and 2 above; or, - - b) accompany it with a written offer, valid for at least three - years, to give any third party free (except for a nominal charge - for the cost of distribution) a complete machine-readable copy of the - corresponding source code, to be distributed under the terms of - Paragraphs 1 and 2 above; or, - - c) accompany it with the information you received as to where the - corresponding source code may be obtained. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form alone.) - -Source code for a work means the preferred form of the work for making -modifications to it. For an executable file, complete source code means -all the source code for all modules it contains; but, as a special -exception, it need not include source code for modules which are standard -libraries that accompany the operating system on which the executable -file runs, or for standard header files or definitions files that -accompany that operating system. - - 4. You may not copy, modify, sublicense, distribute or transfer the -Program except as expressly provided under this General Public License. -Any attempt otherwise to copy, modify, sublicense, distribute or transfer -the Program is void, and will automatically terminate your rights to use -the Program under this License. However, parties who have received -copies, or rights to use copies, from you under this General Public -License will not have their licenses terminated so long as such parties -remain in full compliance. - - 5. By copying, distributing or modifying the Program (or any work based -on the Program) you indicate your acceptance of this license to do so, -and all its terms and conditions. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the original -licensor to copy, distribute or modify the Program subject to these -terms and conditions. You may not impose any further restrictions on the -recipients' exercise of the rights granted herein. - - 7. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of the license which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -the license, you may choose any version ever published by the Free Software -Foundation. - - 8. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 9. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 10. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - Appendix: How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to humanity, the best way to achieve this is to make it -free software which everyone can redistribute and change under these -terms. - - To do so, attach the following notices to the program. It is safest to -attach them to the start of each source file to most effectively convey -the exclusion of warranty; and each file should have at least the -"copyright" line and a pointer to where the full notice is found. - - <one line to give the program's name and a brief idea of what it does.> - Copyright (C) 19yy <name of author> - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 1, or (at your option) - any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software Foundation, - Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) 19xx name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the -appropriate parts of the General Public License. Of course, the -commands you use may be called something other than `show w' and `show -c'; they could even be mouse-clicks or menu items--whatever suits your -program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the - program `Gnomovision' (a program to direct compilers to make passes - at assemblers) written by James Hacker. - - <signature of Ty Coon>, 1 April 1989 - Ty Coon, President of Vice - -That's all there is to it! - - ---- The Artistic License 1.0 --- - -This software is Copyright (c) 2010 by Gerhard Gossen. - -This is free software, licensed under: - - The Artistic License 1.0 - -The Artistic License - -Preamble - -The intent of this document is to state the conditions under which a Package -may be copied, such that the Copyright Holder maintains some semblance of -artistic control over the development of the package, while giving the users of -the package the right to use and distribute the Package in a more-or-less -customary fashion, plus the right to make reasonable modifications. - -Definitions: - - - "Package" refers to the collection of files distributed by the Copyright - Holder, and derivatives of that collection of files created through - textual modification. - - "Standard Version" refers to such a Package if it has not been modified, - or has been modified in accordance with the wishes of the Copyright - Holder. - - "Copyright Holder" is whoever is named in the copyright or copyrights for - the package. - - "You" is you, if you're thinking about copying or distributing this Package. - - "Reasonable copying fee" is whatever you can justify on the basis of media - cost, duplication charges, time of people involved, and so on. (You will - not be required to justify it to the Copyright Holder, but only to the - computing community at large as a market that must bear the fee.) - - "Freely Available" means that no fee is charged for the item itself, though - there may be fees involved in handling the item. It also means that - recipients of the item may redistribute it under the same conditions they - received it. - -1. You may make and give away verbatim copies of the source form of the -Standard Version of this Package without restriction, provided that you -duplicate all of the original copyright notices and associated disclaimers. - -2. You may apply bug fixes, portability fixes and other modifications derived -from the Public Domain or from the Copyright Holder. A Package modified in such -a way shall still be considered the Standard Version. - -3. You may otherwise modify your copy of this Package in any way, provided that -you insert a prominent notice in each changed file stating how and when you -changed that file, and provided that you do at least ONE of the following: - - a) place your modifications in the Public Domain or otherwise make them - Freely Available, such as by posting said modifications to Usenet or an - equivalent medium, or placing the modifications on a major archive site - such as ftp.uu.net, or by allowing the Copyright Holder to include your - modifications in the Standard Version of the Package. - - b) use the modified Package only within your corporation or organization. - - c) rename any non-standard executables so the names do not conflict with - standard executables, which must also be provided, and provide a separate - manual page for each non-standard executable that clearly documents how it - differs from the Standard Version. - - d) make other distribution arrangements with the Copyright Holder. - -4. You may distribute the programs of this Package in object code or executable -form, provided that you do at least ONE of the following: - - a) distribute a Standard Version of the executables and library files, - together with instructions (in the manual page or equivalent) on where to - get the Standard Version. - - b) accompany the distribution with the machine-readable source of the Package - with your modifications. - - c) accompany any non-standard executables with their corresponding Standard - Version executables, giving the non-standard executables non-standard - names, and clearly documenting the differences in manual pages (or - equivalent), together with instructions on where to get the Standard - Version. - - d) make other distribution arrangements with the Copyright Holder. - -5. You may charge a reasonable copying fee for any distribution of this -Package. You may charge any fee you choose for support of this Package. You -may not charge a fee for this Package itself. However, you may distribute this -Package in aggregate with other (possibly commercial) programs as part of a -larger (possibly commercial) software distribution provided that you do not -advertise this Package as a product of your own. - -6. The scripts and library files supplied as input to or produced as output -from the programs of this Package do not automatically fall under the copyright -of this Package, but belong to whomever generated them, and may be sold -commercially, and may be aggregated with this Package. - -7. C or perl subroutines supplied by you and linked into this Package shall not -be considered part of this Package. - -8. The name of the Copyright Holder may not be used to endorse or promote -products derived from this software without specific prior written permission. - -9. THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED -WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF -MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - -The End - diff --git a/support/bibtexperllibs/LaTeX-ToUnicode/MANIFEST b/support/bibtexperllibs/LaTeX-ToUnicode/MANIFEST deleted file mode 100644 index 2aa0688c10..0000000000 --- a/support/bibtexperllibs/LaTeX-ToUnicode/MANIFEST +++ /dev/null @@ -1,17 +0,0 @@ -LICENSE -Changes -MANIFEST -t/release-pod-coverage.t -t/release-pod-syntax.t -t/convert.t -t/release-synopsis.t -README -script/ltx2unitxt -script/convert.pl -lib/LaTeX/ToUnicode/Tables.pm -lib/LaTeX/ToUnicode.pm -Makefile.PL -head.ltx -Makefile.TDS -weaver.ini -dist.ini diff --git a/support/bibtexperllibs/LaTeX-ToUnicode/Makefile.PL b/support/bibtexperllibs/LaTeX-ToUnicode/Makefile.PL deleted file mode 100644 index 7aa2b21234..0000000000 --- a/support/bibtexperllibs/LaTeX-ToUnicode/Makefile.PL +++ /dev/null @@ -1,51 +0,0 @@ - -use strict; -use warnings; - -BEGIN { require 5.8.0; } - -use ExtUtils::MakeMaker 6.31; - - - -my %WriteMakefileArgs = ( - 'ABSTRACT' => 'Convert LaTeX commands to Unicode', - 'AUTHOR' => 'Gerhard Gossen <gerhard.gossen@googlemail.com> and Boris Veytsman <boris@varphi.com> and Karl Berry <karl@freefriends.com>', - 'BUILD_REQUIRES' => { - 'Pod-LaTeX' => '0.61' - }, - 'CONFIGURE_REQUIRES' => { - 'ExtUtils::MakeMaker' => '6.31' - }, - 'DISTNAME' => 'LaTeX-ToUnicode', - 'EXE_FILES' => ['script/ltx2unitxt'], - 'LICENSE' => 'perl', - 'NAME' => 'LaTeX::ToUnicode', - 'PREREQ_PM' => {}, - 'VERSION_FROM' => 'lib/LaTeX/ToUnicode.pm', - 'test' => { - 'TESTS' => 't/*.t' - } -); - - -unless ( eval { ExtUtils::MakeMaker->VERSION(6.56) } ) { - my $br = delete $WriteMakefileArgs{BUILD_REQUIRES}; - my $pp = $WriteMakefileArgs{PREREQ_PM}; - for my $mod ( keys %$br ) { - if ( exists $pp->{$mod} ) { - $pp->{$mod} = $br->{$mod} if $br->{$mod} > $pp->{$mod}; - } - else { - $pp->{$mod} = $br->{$mod}; - } - } -} - -delete $WriteMakefileArgs{CONFIGURE_REQUIRES} - unless eval { ExtUtils::MakeMaker->VERSION(6.52) }; - -WriteMakefile(%WriteMakefileArgs); - - - diff --git a/support/bibtexperllibs/LaTeX-ToUnicode/Makefile.TDS b/support/bibtexperllibs/LaTeX-ToUnicode/Makefile.TDS deleted file mode 100644 index 4255cfa6b6..0000000000 --- a/support/bibtexperllibs/LaTeX-ToUnicode/Makefile.TDS +++ /dev/null @@ -1,53 +0,0 @@ -# -# This is Makefile for TDS-compliant TeX distributions -# Written by Boris Veytsman, boris@varphi.com -# -# This file is in public domain -# -PREFIX = /usr/local - -LIBDIR = $(PREFIX)/scripts/bibtexperllibs - -DOCDIR = $(PREFIX)/doc/bibtex/bibtexperllibs - -DOCS = latex-tounicode.pdf ltx2unitxt.pdf ltx2unitxt.1 - -all: - -docs: $(DOCS) - -latex-tounicode.pdf: latex-tounicode.tex ltx2unitxt.pdf - texfot pdflatex $< || { rm -f $@; exit 1; } - -ToUnicode = lib/LaTeX/ToUnicode - -latex-tounicode.tex: $(ToUnicode).pm $(ToUnicode)/Tables.pm - pod2latex -modify -full -prefile head.ltx -out $@ $^ - -latex-tounicode.tex: head.ltx -# unfortunately pod2latex doesn't recognize =encoding, so there -# are two warnings of "Command encoding not recognised ...". Oh well. - -ltx2unitxt.1: script/ltx2unitxt -# don't run --version since the --help message includes --version output. - help2man --no-info --version-string=" " \ ---name="convert LaTeX source fragment to plain (Unicode) text or simple html" \ - $< >$@ \ - || { rm -f $@; exit 1; } -ltx2unitxt.pdf: ltx2unitxt.1 - sed 's/^Releases:/\nReleases:/' $< | groff -man -t -rS11 - | ps2pdf - $@ - -force: - -install: all docs - mkdir -p $(LIBDIR) - cp -r lib/* $(LIBDIR) - mkdir -p $(DOCDIR) - cp -r man/man3/* $(DOCDIR) - cp -r latex-tounicode.pdf ltx2unitxt.pdf ltx2unitxt.1 $(DOCDIR) - -clean: - $(RM) *.log *.aux *.out *.toc latex-tounicode.tex *.tar.gz - -distclean: clean - $(RM) $(DOCS)
\ No newline at end of file diff --git a/support/bibtexperllibs/LaTeX-ToUnicode/README b/support/bibtexperllibs/LaTeX-ToUnicode/README deleted file mode 100644 index 1f241e3979..0000000000 --- a/support/bibtexperllibs/LaTeX-ToUnicode/README +++ /dev/null @@ -1,13 +0,0 @@ -This is the LaTeX::ToUnicode Perl package: - - Convert LaTeX source fragments to Unicode plain text or simple html - -Dev sources, bug tracker: https://github.com/borisveytsman/bibtexperllibs -Releases: https://ctan.org/pkg/bibtexperllibs - -Copyright 2010-2022 Gerhard Gossen, Boris Veytsman, Karl Berry - -This is free software; you can redistribute it and/or modify it under -the same terms as the Perl5 programming language system itself. - - diff --git a/support/bibtexperllibs/LaTeX-ToUnicode/dist.ini b/support/bibtexperllibs/LaTeX-ToUnicode/dist.ini deleted file mode 100644 index 5c038d1985..0000000000 --- a/support/bibtexperllibs/LaTeX-ToUnicode/dist.ini +++ /dev/null @@ -1,16 +0,0 @@ -name = LaTeX-ToUnicode -author = Gerhard Gossen <gerhard.gossen@googlemail.com> and Boris Veytsman <boris@varphi.com> and Karl Berry <karl@freefriends.org> -license = Perl_5 -copyright_holder = Gerhard Gossen and Boris Veytsman -copyright_year = 2010-2023 -version = 0.53 - -[@Classic] -[Prereqs] -perl = 5.8.0 -[NextRelease] -format = %-7v %{yyyy-MM-dd HH:mm:ss}d -[PodWeaver] -[Repository] -[@Git] -[SynopsisTests] diff --git a/support/bibtexperllibs/LaTeX-ToUnicode/head.ltx b/support/bibtexperllibs/LaTeX-ToUnicode/head.ltx deleted file mode 100644 index 3f946fcba0..0000000000 --- a/support/bibtexperllibs/LaTeX-ToUnicode/head.ltx +++ /dev/null @@ -1,28 +0,0 @@ -% documentation for LaTeX::ToUnicode. -% head.ltx file public domain. -% -\documentclass[11pt]{article} -\usepackage{fullpage,pdfpages} -\usepackage[hidelinks]{hyperref} -\let\printindex=\empty % index is not useful -\sloppy \hbadness=3000 % not aiming for good typesetting - -% Silence useless font warning about braces in cmsy instead of cmtt: -\makeatletter\def\@font@warning#1{}\makeatother - -% https://tex.stackexchange.com/questions/68272 -\newcommand\invisiblesection[1]{% - \refstepcounter{section}% - \addcontentsline{toc}{section}{\protect\numberline{\thesection}#1}% - \sectionmark{#1}% -} - -\begin{document} -\title{\texttt{LaTeX::ToUnicode} documentation} -\author{Boris Veytsman\thanks{borisv@lk.net}} -\maketitle -\tableofcontents - -\invisiblesection{ltx2unitxt---convert \LaTeX\ source fragments} - -\includepdf[pages=-]{ltx2unitxt} diff --git a/support/bibtexperllibs/LaTeX-ToUnicode/latex-tounicode.pdf b/support/bibtexperllibs/LaTeX-ToUnicode/latex-tounicode.pdf Binary files differdeleted file mode 100644 index b319b6ebcb..0000000000 --- a/support/bibtexperllibs/LaTeX-ToUnicode/latex-tounicode.pdf +++ /dev/null diff --git a/support/bibtexperllibs/LaTeX-ToUnicode/lib/LaTeX/ToUnicode.pm b/support/bibtexperllibs/LaTeX-ToUnicode/lib/LaTeX/ToUnicode.pm deleted file mode 100644 index 1759a6acd6..0000000000 --- a/support/bibtexperllibs/LaTeX-ToUnicode/lib/LaTeX/ToUnicode.pm +++ /dev/null @@ -1,778 +0,0 @@ -use strict; -use warnings; -package LaTeX::ToUnicode; -BEGIN { - $LaTeX::ToUnicode::VERSION = '0.54'; -} -#ABSTRACT: Convert LaTeX commands to Unicode (simplistically) - -require Exporter; -our @ISA = qw(Exporter); -our @EXPORT_OK = qw( convert debuglevel $endcw ); - -use utf8; -use Encode; -use LaTeX::ToUnicode::Tables; - -# Terminating a control word (not symbol) the way TeX does: at the -# boundary between a letter (lookbehind) and a nonletter (lookahead), -# and then ignore any following whitespace. -our $endcw = qr/(?<=[a-zA-Z])(?=[^a-zA-Z]|$)\s*/; - -# all we need for is debugging being on and off. And it's pretty random -# what gets output. -my $debug = 0; - -sub debuglevel { $debug = shift; } -sub _debug { - return unless $debug; - # The backtrace info is split between caller(0) and caller(1), sigh. - # We don't need the package name, it's included in $subr in practice. - my (undef,$filename,$line,undef) = caller(0); - my (undef,undef,undef,$subr) = caller(1); - warn @_, " at $filename:$line ($subr)\n"; -} - -# The main conversion function. -# -sub convert { - my ($string, %options) = @_; - #warn debug_hash_as_string("starting with: $string", %options); - - # First, remove leading and trailing horizontal whitespace - # on each line of the possibly-multiline string we're given. - $string =~ s/^[ \t]*//m; - $string =~ s/[ \t]*$//m; - - # For HTML output, must convert special characters that were in the - # TeX text (&<>) to their entities to avoid misparsing. We want to - # do this first, because conversion of the markup commands might - # output HTML tags like <tt>, and we don't want to convert those <>. - # Although <tt> works, better to keep the output HTML as - # human-readable as we can. - # - if ($options{html}) { - $string =~ s/([^\\]|^)&/$1&/g; - $string =~ s/</</g; - $string =~ s/>/>/g; - } - - my $user_hook = $options{hook}; - if ($user_hook) { - $string = &$user_hook($string, \%options); - _debug("after user hook: $string"); - } - - # Convert general commands that take arguments, since (1) they might - # insert TeX commands that need to be converted, and (2) because - # their arguments could well contain constructs that will map to a - # Perl string \x{nnnn} for Unicode character nnnn; those Perl braces - # for the \x will confuse further parsing of the TeX. - # - $string = _convert_commands_with_arg($string); - _debug("after commands with arg: $string"); - - # Convert markups (\texttt, etc.); they have the same brace-parsing issue. - $string = _convert_markups($string, \%options); - _debug("after markups: $string"); - - # And urls, a special case of commands with arguments. - $string = _convert_urls($string, \%options); - _debug("after urls: $string"); - - $string = _convert_control_words($string); - _debug("after control words: $string"); - - $string = _convert_control_symbols($string); - _debug("after control symbols: $string"); - - $string = _convert_accents($string); - $string = _convert_german($string) if $options{german}; - $string = _convert_symbols($string); - $string = _convert_ligatures($string); - - # Let's handle ties here, after all the other conversions, since - # they don't fit well with any of the tables. - # - # /~, or ~ at the beginning of a line, is probably part of a url or - # path, not a tie. Otherwise, consider it a space, since a no-break - # spot in TeX is most likely fine to break in text or HTML. - # - $string =~ s,([^/])~,$1 ,g; - - # Remove kerns. Clearly needs generalizing/sharpening to recognize - # dimens better, and plenty of other commands could use it. - #_debug("before kern: $string"); - my $dimen_re = qr/[-+]?[0-9., ]+[a-z][a-z]\s*/; - $string =~ s!\\kern${endcw}${dimen_re}!!g; - - # What the heck, let's do \hfuzz and \vfuzz too. They come up pretty - # often and practically the same thing (plus ignore optional =).. - $string =~ s!\\[hv]fuzz${endcw}=?\s*${dimen_re}!!g; - - # After all the conversions, $string contains \x{....} constructs - # (Perl Unicode characters) where translations have happened. Change - # those to the desired output format. Thus we assume that the - # Unicode \x{....}'s are not themselves involved in further - # translations, which is, so far, true. - # - if (! $options{entities}) { - # Convert our \x strings from Tables.pm to the binary characters. - - # As an extra-special case, we want to preserve the translation of - # \{ and \} as 007[bd] entities even if the --entities option is - # not give; otherwise they'd get eliminated like all other braces. - # Use a temporary cs \xx to keep them marked, and don't use braces - # to delimit the argument since they'll get deleted. - $string =~ s/\\x\{(007[bd])\}/\\xx($1)/g; - - # Convert all other characters to characters. - # Assume exactly four hex digits, since we wrote Tables.pm that way. - $string =~ s/\\x\{(....)\}/ pack('U*', hex($1))/eg; - - } elsif ($options{entities}) { - # Convert the XML special characters that appeared in the input, - # e.g., from a TeX \&. Unless we're generating HTML output, in - # which case they have already been converted. - if (! $options{html}) { - $string =~ s/&/&/g; - $string =~ s/</</g; - $string =~ s/>/>/g; - } - - # Our values in Tables.pm are simple ASCII strings \x{....}, - # so we can replace them with hex entities with no trouble. - # Fortunately TeX does not have a standard \x control sequence. - $string =~ s/\\x\{(....)\}/&#x$1;/g; - - # The rest of the job is about binary Unicode characters in the - # input. We want to transform them into entities also. As always - # in Perl, there's more than one way to do it, and several are - # described here, just for the fun of it. - my $ret = ""; - # - # decode_utf8 is described in https://perldoc.perl.org/Encode. - # Without the decode_utf8, all of these methods output each byte - # separately; apparently $string is a byte string at this point, - # not a Unicode string. I don't know why that is. - $ret = decode_utf8($string); - # - # Transform everything that's not printable ASCII or newline into - # entities. - $ret =~ s/([^ -~\n])/ sprintf("&#x%04x;", ord($1)) /eg; - # - # This method leaves control characters as literal; doesn't matter - # for XML output, since control characters aren't allowed, but - # let's use the regexp method anyway. - #$ret = encode("ascii", decode_utf8($string), Encode::FB_XMLCREF); - # - # The nice_string function from perluniintro also works. - # - # This fails, just outputs numbers (that is, ord values): - # foreach my $c (unpack("U*", $ret)) { - # - # Without the decode_utf8, outputs each byte separately. - # With the decode_utf8, works, but the above seems cleaner. - #foreach my $c (split(//, $ret)) { - # if (ord($c) <= 31 || ord($c) >= 128) { - # $ret .= sprintf("&#x%04x;", ord($c)); - # } else { - # $ret .= $c; - # } - #} - # - $string = $ret; # assigned from above. - } - - if ($string =~ /\\x\{/) { - warn "LaTeX::ToUnicode::convert: untranslated \\x remains: $string\n"; - warn "LaTeX::ToUnicode::convert: please report as bug.\n"; - } - - # Drop all remaining braces. - $string =~ s/[{}]//g; - - if (! $options{entities}) { - # With all the other braces gone, now we can convert the preserved - # brace entities from \{ and \} to actual braces. - $string =~ s/\\xx\((007[bd])\)/ pack('U*', hex($1))/eg; - } - - # Backslashes might remain. Don't remove them, as it makes for a - # useful way to find unhandled commands. - - # leave newlines alone, but trim spaces and tabs. - $string =~ s/^[ \t]+//s; # remove leading whitespace - $string =~ s/[ \t]+$//s; # remove trailing whitespace - $string =~ s/[ \t]+/ /gs; # collapse all remaining whitespace to one space - - $string; -} - -# Convert commands that take a single braced argument. The table -# defines text we're supposed to insert before and after the argument. -# We let future processing handle conversion of both the inserted text -# and the argument. -# -sub _convert_commands_with_arg { - my $string = shift; - - foreach my $cmd ( keys %LaTeX::ToUnicode::Tables::ARGUMENT_COMMANDS ) { - my $repl = $LaTeX::ToUnicode::Tables::ARGUMENT_COMMANDS{$cmd}; - my $lft = $repl->[0]; # ref to two-element list - my $rht = $repl->[1]; - # \cmd{foo} -> LFT foo RHT - $string =~ s/\\$cmd${endcw}\{(.*?)\}/$lft$1$rht/g; - #warn "replaced arg $cmd, yielding $string\n"; - } - - $string; -} - -# Convert url commands in STRING. This is a special case of commands -# with arguments: \url{u} and \href{u}{desc text}. The HTML output -# (generated if $OPTIONS{html} is set) is just too special to be handled -# in a table; further, \href is the only two-argument command we are -# currently handling. -# -sub _convert_urls { - my ($string,$options) = @_; - - if ($options->{html}) { - # HTML output. - # \url{URL} -> <a href="URL">URL</a> - $string =~ s,\\url$endcw\{([^}]*)\} - ,<a href="$1">$1</a>,gx; - # - # \href{URL}{TEXT} -> <a href="URL">TEXT</a> - $string =~ s,\\href$endcw\{([^}]*)\}\s*\{([^}]*)\} - ,<a href="$1">$2</a>,gx; - - } else { - # plain text output. - # \url{URL} -> URL - $string =~ s/\\url$endcw\{([^}]*)\}/$1/g; - # - # \href{URL}{TEXT} -> TEXT (URL) - # but, as a special case, if URL ends with TEXT, just output URL, - # as in: - # \href{https://doi.org/10/fjzzc8}{10/fjzzc8} - # -> - # https://doi.org/10/fjzzc8 - # - # Yet more specialness: the TEXT might have extra braces, as in - # \href{https://doi.org/10/fjzzc8}{{10/fjzzc8}} - # left over from previous markup commands (\path) which got - # removed. We want to accept and ignore such extra braces, - # hence the \{+ ... \}+ in recognizing TEXT. - # -#warn "txt url: starting with $string\n"; - if ($string =~ m/\\href$endcw\{([^}]*)\}\s*\{+([^}]*)\}+/) { - my $url = $1; - my $text = $2; -#warn " url: $url\n"; -#warn " text: $text\n"; - my $repl = ($url =~ m!$text$!) ? $url : "$text ($url)"; -#warn " repl: $repl\n"; - $string =~ s/\\href$endcw\{([^}]*)\}\s*\{+([^}]*)\}+/$repl/; -#warn " str: $string\n"; - } - } - - $string; -} - -# Convert control words (not symbols), that is, a backslash and an -# alphabetic sequence of characters terminated by a non-alphabetic -# character. Following whitespace is ignored. -# -sub _convert_control_words { - my $string = shift; - - foreach my $command ( keys %LaTeX::ToUnicode::Tables::CONTROL_WORDS ) { - my $repl = $LaTeX::ToUnicode::Tables::CONTROL_WORDS{$command}; - # replace {\CMD}, whitespace ignored after \CMD. - $string =~ s/\{\\$command$endcw\}/$repl/g; - - # replace \CMD, preceded by not-consumed non-backslash. - $string =~ s/(?<=[^\\])\\$command$endcw/$repl/g; - - # replace \CMD at beginning of whole string, which otherwise - # wouldn't be matched. Two separate regexps to avoid - # variable-length lookbehind. - $string =~ s/^\\$command$endcw/$repl/g; - } - - $string; -} - -# Convert control symbols, other than accents. Much simpler than -# control words, since are self-delimiting, don't take arguments, and -# don't consume any following text. -# -sub _convert_control_symbols { - my $string = shift; - - foreach my $symbol ( keys %LaTeX::ToUnicode::Tables::CONTROL_SYMBOLS ) { - my $repl = $LaTeX::ToUnicode::Tables::CONTROL_SYMBOLS{$symbol}; - - # because these are not alphabetic, we can quotemeta them, - # and we need to because "\" is one of the symbols. - my $rx = quotemeta($symbol); - - # the preceding character must not be a backslash, else "\\ " - # could have the "\ " seen first as a control space, leaving - # a spurious \ behind. Don't consume the preceding. - # Or it could be at the beginning of a line. - # - $string =~ s/(^|(?<=[^\\]))\\$rx/$repl/g; - #warn "after sym $symbol (\\$rx -> $repl), have: $string\n"; - } - - $string; -} - -# Convert accents. -# -sub _convert_accents { - my $string = shift; - - # first the non-alphabetic accent commands, like \". - my %tbl = %LaTeX::ToUnicode::Tables::ACCENT_SYMBOLS; - $string =~ s/(\{\\(.)\s*\{(\\?\w{1,2})\}\})/$tbl{$2}{$3} || $1/eg; #{\"{a}} - $string =~ s/(\{\\(.)\s*(\\?\w{1,2})\})/ $tbl{$2}{$3} || $1/eg; # {\"a} - $string =~ s/(\\(.)\s*(\\?\w{1,1}))/ $tbl{$2}{$3} || $1/eg; # \"a - $string =~ s/(\\(.)\s*\{(\\?\w{1,2})\})/ $tbl{$2}{$3} || $1/eg; # \"{a} - - # second the alphabetic commands, like \c. They have to be handled - # differently because \cc is not \c{c}! The only difference in the - # regular expressions is using $endcw instead of just \s*. - # - %tbl = %LaTeX::ToUnicode::Tables::ACCENT_LETTERS; - $string =~ s/(\{\\(.)$endcw\{(\\?\w{1,2})\}\})/$tbl{$2}{$3} || $1/eg; #{\"{a}} - $string =~ s/(\{\\(.)$endcw(\\?\w{1,2})\})/ $tbl{$2}{$3} || $1/eg; # {\"a} - $string =~ s/(\\(.)$endcw(\\?\w{1,1}))/ $tbl{$2}{$3} || $1/eg; # \"a - $string =~ s/(\\(.)$endcw\{(\\?\w{1,2})\})/ $tbl{$2}{$3} || $1/eg; # \"{a} - - - # The argument is just one \w character for the \"a case, not two, - # because otherwise we might consume a following character that is - # not part of the accent, e.g., a backslash (\"a\'e). - # - # Others can be two because of the \t tie-after accent. Even {\t oo} is ok. - # - # Allow whitespace after the \CMD in all cases, e.g., "\c c". Even - # for the control symbols, it turns out spaces are ignored there - # (as in \" o), unlike the usual syntax. - # - # Some non-word constituents would work, but in practice we hope - # everyone just uses letters. - - $string; -} - -# For the [n]german package. -sub _convert_german { - my $string = shift; - - foreach my $symbol ( keys %LaTeX::ToUnicode::Tables::GERMAN ) { - $string =~ s/\Q$symbol\E/$LaTeX::ToUnicode::Tables::GERMAN{$symbol}/g; - } - $string; -} - -# Control words that produce printed symbols (and letters in languages -# other than English), that is. -# -sub _convert_symbols { - my $string = shift; - - foreach my $symbol ( keys %LaTeX::ToUnicode::Tables::SYMBOLS ) { - my $repl = $LaTeX::ToUnicode::Tables::SYMBOLS{$symbol}; - # preceded by a (non-consumed) non-backslash, - # usual termination for a control word. - # These commands don't take arguments. - $string =~ s/(?<=[^\\])\\$symbol$endcw/$repl/g; - - # or the beginning of the whole string: - $string =~ s/^\\$symbol$endcw/$repl/g; - } - $string; -} - -# Special character sequences, not \commands. They aren't all -# technically ligatures, but no matter. -# -sub _convert_ligatures { - my $string = shift; - - # have to convert these in order specified. - my @ligs = @LaTeX::ToUnicode::Tables::LIGATURES; - for (my $i = 0; $i < @ligs; $i+=2) { - my $in = $ligs[$i]; - my $out = $ligs[$i+1]; - $string =~ s/\Q$in\E/$out/g; - } - $string; -} - -# -# Convert LaTeX markup commands in STRING like \textbf{...} and -# {\bfshape ...} and {\bf ...}. -# -# If we're aiming for plain text output, they are just cleared away (the -# braces are not removed). -# -# If we're generating HTML output ("html" key is set in $OPTIONS hash -# ref), we use the value in the hash, so that \textbf{foo} becomes -# <b>foo</b>. Nested markup doesn't work. -# -sub _convert_markups { - my ($string, $options) = @_; - - # HTML is different. - return _convert_markups_html($string) if $options->{html}; - - # Not HTML, so here we'll "convert" to plain text by removing the - # markup commands. - - # we can do all the markup commands at once. - my $markups = join('|', keys %LaTeX::ToUnicode::Tables::MARKUPS); - - # Remove \textMARKUP{...}, leaving just the {...} - $string =~ s/\\text($markups)$endcw//g; - - # Similarly remove \MARKUPshape, plus remove \upshape. - $string =~ s/\\($markups|up)shape$endcw//g; - - # Remove braces and \command in: {... \MARKUP ...} - $string =~ s/(\{[^{}]+)\\(?:$markups)$endcw([^{}]+\})/$1$2/g; - - # Remove braces and \command in: {\MARKUP ...} - $string =~ s/\{\\(?:$markups)$endcw([^{}]*)\}/$1/g; - - # Remove: {\MARKUP - # Although this will leave unmatched } chars behind, there's no - # alternative without full parsing, since the bib entry will often - # look like: {\em {The TeX{}book}}. Also might, in principle, be - # at the end of a line. - $string =~ s/\{\\(?:$markups)$endcw//g; - - # Ultimately we remove all braces in ltx2crossrefxml SanitizeText fns, - # so the unmatched braces don't matter ... that code should be moved. - - $string; -} - -# Convert \markup in STRING to html. We can't always figure out where to -# put the end tag, but we always put it somewhere. We don't even attempt -# to handle nested markup. -# -sub _convert_markups_html { - my ($string) = @_; - - my %MARKUPS = %LaTeX::ToUnicode::Tables::MARKUPS; - # have to consider each markup \command separately. - for my $markup (keys %MARKUPS) { - my $hcmd = $MARKUPS{$markup}; # some TeX commands don't translate - my $tag = $hcmd ? "<$hcmd>" : ""; - my $end_tag = $hcmd ? "</$hcmd>" : ""; - - # The easy one: \textMARKUP{...} - $string =~ s/\\text$markup$endcw\{(.*?)\}/$tag$1$end_tag/g; - - # {x\MARKUP(shape) y} -> x<mk>y</mk> (leave out braces) - $string =~ s/\{([^{}]+)\\$markup(shape)?$endcw([^{}]+)\} - /$1$tag$3$end_tag/gx; - - # {\MARKUP(shape) y} -> <mk>y</mk>. Same as previous but without - # the x part. Could do it in one regex but this seems clearer. - $string =~ s/\{\\$markup(shape)?$endcw([^{}]+)\} - /$tag$2$end_tag/gx; - - # for {\MARKUP(shape) ... with no matching brace, we don't know - # where to put the end tag, so seems best to do nothing. - } - - $string; -} - - -############################################################## -# debug_hash_as_string($LABEL, HASH) -# -# Return LABEL followed by HASH elements, followed by a newline, as a -# single string. If HASH is a reference, it is followed (but no recursive -# derefencing). -############################################################### -sub debug_hash_as_string { - my ($label) = shift; - my (%hash) = (ref $_[0] && $_[0] =~ /.*HASH.*/) ? %{$_[0]} : @_; - - my $str = "$label: {"; - my @items = (); - for my $key (sort keys %hash) { - my $val = $hash{$key}; - $val = ".undef" if ! defined $val; - $key =~ s/\n/\\n/g; - $val =~ s/\n/\\n/g; - push (@items, "$key:$val"); - } - $str .= join (",", @items); - $str .= "}"; - - return "$str\n"; -} - -1; - -__END__ -=pod - -=encoding UTF-8 - -=head1 NAME - -LaTeX::ToUnicode - Convert LaTeX commands to Unicode - -=head1 VERSION - -version 0.54 - -=head1 SYNOPSIS - - use LaTeX::ToUnicode qw( convert debuglevel $endcw ); - - # simple examples: - convert( '{\"a}' ) eq 'ä'; # true - convert( '{\"a}', entities=>1 ) eq '�EF;'; # true - convert( '"a', german=>1 ) eq 'ä'; # true, `german' package syntax - convert( '"a', ) eq '"a'; # false, not enabled by default - - # more generally: - my $latexstr; - my $unistr = convert($latexstr); # get literal (binary) Unicode characters - - my $entstr = convert($latexstr, entities=>1); # get &#xUUUU; - - my $htmstr = convert($latexstr, entities=>1, html=>1); # also html markup - - my $unistr = convert($latexstr, hook=>\&my_hook); # user-defined hook - - # if nonzero, dumps various info; perhaps other levels in the future. - LaTeX::ToUnicode::debuglevel($verbose); - - # regexp for terminating TeX control words, e.g., in hooks. - my $endcw = $LaTeX::ToUnicode::endcw; - $string =~ s/\\newline$endcw/ /g; # translate \newline to space - -=head1 DESCRIPTION - -This module provides a method to convert LaTeX markups for accents etc. -into their Unicode equivalents. It translates some commands for special -characters or accents into their Unicode (or HTML) equivalents and -removes formatting commands. It is not at all bulletproof or complete. - -This module is intended to convert fragments of LaTeX source, such as -bibliography entries and abstracts, into plain text (or, optionally, -simplistic HTML). It is not a document conversion system. Math, tables, -figures, sectioning, etc., are not handled in any way, and mostly left -in their TeX form in the output. The translations assume standard LaTeX -meanings for characters and control sequences; macros in the input are -not considered. - -The aim for all the output is utter simplicity and minimalism, not -faithful translation. For example, although Unicode has a code point for -a thin space, the LaTeX C<\thinspace> (etc.) command is translated to -the empty string; such spacing refinements desirable in the TeX output -are, in our experience, generally not desired in the HTML output from -this tool. - -As another example, TeX C<%> comments are not removed, even on lines by -themselves, because they may be inside verbatim blocks, and we don't -attempt to keep any such context. In practice, TeX comments are rare in -the text fragments intended to be handled, so removing them in advance -has not been a great burden. - -As another example, LaTeX ties, C<~> characters, are replaced with -normal spaces (exception: unless they follow a C</> character or at the -beginning of a line, when they're assumed to be part of a url or a -pathname), rather than a no-break space character, because in our -experience most ties intended for the TeX output would just cause -trouble in plain text or HTML. - -Regarding normal whitespace: all leading and trailing horizontal -whitespace (that is, SPC and TAB) is removed. All internal horizontal -whitespace sequences are collapsed to a single space. - -After the conversions, all brace characters (C<{}>) are simply removed -from the returned string. This turns out to be a significant convenience -in practice, since many LaTeX commands which take arguments don't need -to do anything for our purposes except output the argument. - -On the other hand, backslashes are not removed. This is so the caller -can check for C<\\> and thus discover untranslated commands. Of course -there are many other constructs that might not be translated, or -translated wrongly. There is no escaping the need to carefully look at -the output. - -Suggestions and bug reports are welcome for practical needs; we know -full well that there are hundreds of commands not handled that could be. -Virtually all the behavior mentioned here would be easily made -customizable, if there is a need to do so. - -=head1 FUNCTIONS - -=head2 convert( $latex_string, %options ) - -Convert the text in C<$latex_string> into a plain(er) Unicode string. -Escape sequences for accented and special characters (e.g., C<\i>, -C<\"a>, ...) are converted. A few basic formatting commands (e.g., -C<{\it ...}>) are removed. See the L<LaTeX::ToUnicode::Tables> submodule -for the full conversion tables. - -These keys are recognized in C<%options>: - -=over - -=item C<entities> - -Output C<&#xUUUU;> entities (valid in XML); in this case, also convert -the E<lt>, E<gt>, C<&> metacharacters to entities. Recognized non-ASCII -Unicode characters in the original input are also converted to entities, -not only the translations from TeX commands. - -The default is to output literal (binary) Unicode characters, and -not change any metacharacters. - -=item C<german> - -If this option is set, the commands introduced by the package `german' -(e.g. C<"a> eq C<ä>, note the missing backslash) are also -handled. - -=item C<html> - -If this option is set, the output is simplistic html rather than plain -text. This affects only a few things: S<1) the> output of urls from -C<\url> and C<\href>; S<2) the> output of markup commands like -C<\textbf> (but nested markup commands don't work); S<3) two> other -random commands, C<\enquote> and C<\path>, because they are needed. - -=item C<hook> - -The value must be a function that takes two arguments and returns a -string. The first argument is the incoming string (may be multiple -lines), and the second argument is a hash reference of options, exactly -what was passed to this C<convert> function. Thus the hook can detect -whether html is needed. - -The hook is called (almost) right away, before any of the other -conversions have taken place. That way the hook can make use of the -predefined conversions instead of repeating them. The only changes made -to the input string before the hook is called are trivial: leading and -trailing whitespace (space and tab) on each line are removed, and, for -HTML output, incoming ampersand, less-than, and greater-than characters -are replaced with their entities. - -Any substitutions that result in Unicode code points must use -C<\\x{nnnn}> on the right hand side: that's two backslashes and a -four-digit hex number. - -As an example, here is a skeleton of the hook function for TUGboat: - - sub LaTeX_ToUnicode_convert_hook { - my ($string,$options) = @_; - - my $endcw = $LaTeX::ToUnicode::endcw; - die "no endcw regexp in LaTeX::ToUnicode??" if ! $endcw; - - ... - $string =~ s/\\newline$endcw/ /g; - - # TUB's \acro{} takes an argument, but we do nothing with it. - # The braces will be removed by convert(). - $string =~ s/\\acro$endcw//g; - ... - $string =~ s/\\CTAN$endcw/CTAN/g; - $string =~ s/\\Dash$endcw/\\x{2014}/g; # em dash; replacement is string - ... - - # ignore \begin{abstract} and \end{abstract} commands. - $string =~ s,\\(begin|end)$endcw\{abstract\}\s*,,g; - - # Output for our url abbreviations, and other commands, depends on - # whether we're generating plain text or HTML. - if ($options->{html}) { - # HTML. - # \tbsurl{URLBASE} -> <a href="https://URLBASE">URLBASE</a> - $string =~ s,\\tbsurl$endcw\{([^}]*)\} - ,<a href="https://$1">$1</a>,gx; - ... - # varepsilon, and no line break at hyphen. - $string =~ s,\\eTeX$endcw,\\x{03B5}<nobr>-</nobr>TeX,g; - - } else { - # for plain text, we can just prepend the protocol://. - $string =~ s,\\tbsurl$endcw,https://,g; - ... - $string =~ s,\\eTeX$endcw,\\x{03B5}-TeX,g; - } - ... - return $string; - } - -As shown here for C<\eTeX> (an abbreviation macro defined in the -TUGboat style files), if markup is desired in the output, the -substitutions must be different for HTML and plain text. Otherwise, the -desired HTML markup is transliterated as if it were plain text. Or else -the translations must be extended so that TeX markup can be used on the -rhs to be replaced with the desired HTML (C<<nobr>> in this case). - -For the full definition (and plenty of additional information), -see the file C<ltx2crossrefxml-tugboat.cfg> in the TUGboat source -repository at -<https://github.com/TeXUsersGroup/tugboat/tree/trunk/capsules/crossref>. - -The hook function is specified in the C<convert()> call like this: - - LaTeX::ToUnicode::convert(..., { hook => \&LaTeX_ToUnicode_convert_hook }) - -=back - -=head2 debuglevel( $level ) - -Output debugging information if C<$level> is nonzero. - -=head2 $endcw - -A predefined regexp for terminating TeX control words (not control -symbols!). Can be used in, for example, hook functions: - - my $endcw = $LaTeX::ToUnicode::endcw; - $string =~ s/\\newline$endcw/ /g; # translate \newline to space - -It's defined as follows: - - our $endcw = qr/(?<=[a-zA-Z])(?=[^a-zA-Z]|$)\s*/; - -That is, look behind for an alphabetic character, then look ahead for a -non-alphabetic character (or end of line), then consume whitespace. -Fingers crossed. - -=head1 AUTHOR - -Gerhard Gossen <gerhard.gossen@googlemail.com>, -Boris Veytsman <boris@varphi.com>, -Karl Berry <karl@freefriends.org> - -L<https://github.com/borisveytsman/bibtexperllibs> - -=head1 COPYRIGHT AND LICENSE - -Copyright 2010-2023 Gerhard Gossen, Boris Veytsman, Karl Berry - -This is free software; you can redistribute it and/or modify it under -the same terms as the Perl5 programming language system itself. - -=cut diff --git a/support/bibtexperllibs/LaTeX-ToUnicode/lib/LaTeX/ToUnicode/Tables.pm b/support/bibtexperllibs/LaTeX-ToUnicode/lib/LaTeX/ToUnicode/Tables.pm deleted file mode 100644 index dd02926e03..0000000000 --- a/support/bibtexperllibs/LaTeX-ToUnicode/lib/LaTeX/ToUnicode/Tables.pm +++ /dev/null @@ -1,726 +0,0 @@ -package LaTeX::ToUnicode::Tables; -BEGIN { - $LaTeX::ToUnicode::Tables::VERSION = '0.54'; -} -use strict; -use warnings; -#ABSTRACT: Character tables for LaTeX::ToUnicode - -use utf8; # just for the german support - -# Technically not all of these are ligatures, but close enough. -# Order is important, so has to be a list, not a hash. -# -our @LIGATURES = ( - "---" => '\x{2014}', # em dash - "--" => '\x{2013}', # en dash - "!`" => '\x{00A1}', # inverted exclam - "?`" => '\x{00A1}', # inverted question - "``" => '\x{201c}', # left double - "''" => '\x{201d}', # right double - "`" => '\x{2018}', # left single - "'" => '\x{2019}', # right single -); -# test text: em---dash, en--dash, exc!`am, quest?`ion, ``ld, rd'', `ls, rs'. -# -# Some additional ligatures supported in T1 encoding, but we won't (from -# tex-text.map): -# U+002C U+002C <> U+201E ; ,, -> DOUBLE LOW-9 QUOTATION MARK -# U+003C U+003C <> U+00AB ; << -> LEFT POINTING GUILLEMET -# U+003E U+003E <> U+00BB ; >> -> RIGHT POINTING GUILLEMET - -# for {\MARKUP(shape) ...} and \textMARKUP{...}; although not all -# command names are defined in LaTeX for all markups, we translate them -# anyway. Also, LaTeX has more font axes not included here: md, ulc, sw, -# ssc, etc. See ltfntcmd.dtx and ltfssaxes.dtx if we ever want to try -# for completeness. -# -our %MARKUPS = ( - 'bf' => 'b', - 'cal' => '', - 'em' => 'em', - 'it' => 'i', - 'rm' => '', - 'sc' => '', # qqq should uppercasify - 'sf' => '', - 'sl' => 'i', - 'small' => '', - 'subscript' => 'sub', - 'superscript' => 'sup', - 'tt' => 'tt', -); - -# More commands taking arguments that we want to handle. -# -our %ARGUMENT_COMMANDS = ( - 'emph' => ['\textem{', '}'], # \textem doesn't exist, but we handle it - 'enquote' => ["`", "'"], - 'path' => ['\texttt{', '}'], # ugh, might not be a braced argument -); - -# Non-alphabetic \COMMANDs, other than accents and special cases. -# -our %CONTROL_SYMBOLS = ( - ' ' => ' ', # control space - "\t" => ' ', # control space - "\n" => '\x{0020}', # control space; use entity to avoid being trimmed - '!' => '', # negative thin space - # " umlaut - '#' => '#', # sharp sign - '$' => '$', # dollar sign - '%' => '%', # percent sign - '&' => '\x{0026}', # ampersand, entity to avoid html conflict - # ' acute accent - '(' => '', # start inline math - ')' => '', # end inline math - '*' => '', # discretionary multiplication - '+' => '', # tabbing: tab stop to right - ',' => '', # thin space - '-' => '', # discretionary hyphenation - # . overdot accent - '/' => '', # italic correction - # 0..9 undefined - ':' => '', # medium space - ';' => ' ', # thick space - '<' => '', # tabbing: text to left of margin - # = macron accent - '>' => '', # tabbing: next tab stop - # ? undefined - '@' => '#', # end of sentence - # A..Z control words, not symbols - '[' => '', # start display math - '\\' => ' ', # line break - ']' => '', # end display math - # ^ circumflex accent - '_' => '_', # underscore - # ` grave accent - # a..z control words, not symbols - '{' => '\x{007b}', # lbrace - '|' => '\x{2225}', # parallel - '}' => '\x{007d}', # rbrace - # ~ tilde accent -); - -# Alphabetic \COMMANDs that map to nothing. This is simply -# interpolated into %CONTROL_WORDS (next), not used directly, so we -# redundantly specify the '' on every line. -# -our %CONTROL_WORDS_EMPTY = ( - 'begingroup' => '', - 'bgroup' => '', - 'checkcomma' => '', - #'cite' => '', # keep \cite undefined since it needs manual work - 'clearpage' => '', - 'doi' => '', - 'egroup' => '', - 'endgroup' => '', - 'ensuremath' => '', - 'hbox' => '', - 'ignorespaces' => '', - 'mbox' => '', - 'medspace' => '', - 'negmedspace' => '', - 'negthickspace' => '', - 'negthinspace' => '', - 'newblock' => '', - 'newpage' => '', - 'noindent' => '', - 'nolinkurl' => '', - 'oldstylenums' => '', - 'pagebreak' => '', - 'protect' => '', - 'raggedright' => '', - 'relax' => '', - 'thinspace' => '', - 'unskip' => '', - 'urlprefix' => '', -); - -# Alphabetic commands, that expand to nothing (above) and to -# something (below). -# -our %CONTROL_WORDS = ( - %CONTROL_WORDS_EMPTY, - 'BibLaTeX' => 'BibLaTeX', - 'BibTeX' => 'BibTeX', - 'LaTeX' => 'LaTeX', - 'LuaLaTeX' => 'LuaLaTeX', - 'LuaTeX' => 'LuaTeX', - 'MF' => 'Metafont', - 'MP' => 'MetaPost', - 'Omega' => '\x{03A9}', - 'TeX' => 'TeX', - 'XeLaTeX' => 'XeLaTeX', - 'XeTeX' => 'XeTeX', - 'bullet' => '\x{2022}', - 'dag' => '\x{2020}', - 'ddag' => '\x{2021}', - 'dots' => '\x{2026}', - 'epsilon' => '\x{03F5}', - 'hookrightarrow' => '\x{2194}', - 'ldots' => '\x{2026}', - 'log' => 'log', - 'omega' => '\x{03C9}', - 'par' => "\n\n", - 'qquad' => ' ', # 2em space - 'quad' => ' ', # em space - 'textbackslash' => '\x{005C}', # entities so \ in output indicates - # untranslated TeX source - 'textbraceleft' => '\x{007B}', # entities so our bare-brace removal - 'textbraceright' => '\x{007D}', # skips them - 'textgreater' => '\x{003E}', - 'textless' => '\x{003C}', - 'textquotedbl' => '"', - 'thickspace' => ' ', - 'varepsilon' => '\x{03B5}', -); - -# Control words (not symbols) that generate various non-English -# letters and symbols. Lots more could be added. -# -our %SYMBOLS = ( # Table 3.2 in Lamport, plus more - 'AA' => '\x{00C5}', # A with ring - 'aa' => '\x{00E5}', - 'AE' => '\x{00C6}', # AE - 'ae' => '\x{00E6}', - 'DH' => '\x{00D0}', # ETH - 'dh' => '\x{00F0}', - 'DJ' => '\x{0110}', # D with stroke - 'dj' => '\x{0111}', - 'i' => '\x{0131}', # small dotless i - 'L' => '\x{0141}', # L with stroke - 'l' => '\x{0142}', - 'NG' => '\x{014A}', # ENG - 'ng' => '\x{014B}', - 'OE' => '\x{0152}', # OE - 'oe' => '\x{0153}', - 'O' => '\x{00D8}', # O with stroke - 'o' => '\x{00F8}', - 'SS' => 'SS', # lately also U+1E9E, but SS seems good enough - 'ss' => '\x{00DF}', - 'TH' => '\x{00DE}', # THORN - 'textordfeminine' => '\x{00AA}', - 'textordmasculine' => '\x{00BA}', - 'textregistered' => '\x{00AE}', - 'th' => '\x{00FE}', - 'TM' => '\x{2122}', # trade mark sign -); - -# Accent commands that are not alphabetic. -# -our %ACCENT_SYMBOLS = ( - "\"" => { # with diaresis - A => '\x{00C4}', - E => '\x{00CB}', - H => '\x{1E26}', - I => '\x{00CF}', - O => '\x{00D6}', - U => '\x{00DC}', - W => '\x{1E84}', - X => '\x{1E8c}', - Y => '\x{0178}', - "\\I" => '\x{00CF}', - "\\i" => '\x{00EF}', - a => '\x{00E4}', - e => '\x{00EB}', - h => '\x{1E27}', - i => '\x{00EF}', - o => '\x{00F6}', - t => '\x{1E97}', - u => '\x{00FC}', - w => '\x{1E85}', - x => '\x{1E8d}', - y => '\x{00FF}', - }, - "'" => { # with acute - A => '\x{00C1}', - AE => '\x{01FC}', - C => '\x{0106}', - E => '\x{00C9}', - G => '\x{01F4}', - I => '\x{00CD}', - K => '\x{1E30}', - L => '\x{0139}', - M => '\x{1E3E}', - N => '\x{0143}', - O => '\x{00D3}', - P => '\x{1E54}', - R => '\x{0154}', - S => '\x{015A}', - U => '\x{00DA}', - W => '\x{1E82}', - Y => '\x{00DD}', - Z => '\x{0179}', - "\\I" => '\x{00CD}', - "\\i" => '\x{00ED}', - a => '\x{00E1}', - ae => '\x{01FD}', - c => '\x{0107}', - e => '\x{00E9}', - g => '\x{01F5}', - i => '\x{00ED}', - k => '\x{1E31}', - l => '\x{013A}', - m => '\x{1E3f}', - n => '\x{0144}', - o => '\x{00F3}', - p => '\x{1E55}', - r => '\x{0155}', - s => '\x{015B}', - u => '\x{00FA}', - w => '\x{1E83}', - y => '\x{00FD}', - z => '\x{017A}', - }, - "^" => { # with circumflex - A => '\x{00C2}', - C => '\x{0108}', - E => '\x{00CA}', - G => '\x{011C}', - H => '\x{0124}', - I => '\x{00CE}', - J => '\x{0134}', - O => '\x{00D4}', - R => 'R\x{0302}', - S => '\x{015C}', - U => '\x{00DB}', - W => '\x{0174}', - Y => '\x{0176}', - Z => '\x{1E90}', - "\\I" => '\x{00CE}', - "\\J" => '\x{0134}', - "\\i" => '\x{00EE}', - "\\j" => '\x{0135}', - a => '\x{00E2}', - c => '\x{0109}', - e => '\x{00EA}', - g => '\x{011D}', - h => '\x{0125}', - i => '\x{00EE}', - j => '\x{0135}', - o => '\x{00F4}', - s => '\x{015D}', - u => '\x{00FB}', - w => '\x{0175}', - y => '\x{0177}', - z => '\x{1E91}', - }, - "`" => { # with grave - A => '\x{00C0}', - E => '\x{00C8}', - I => '\x{00CC}', - N => '\x{01F8}', - O => '\x{00D2}', - U => '\x{00D9}', - W => '\x{1E80}', - Y => '\x{1Ef2}', - "\\I" => '\x{00CC}', - "\\i" => '\x{00EC}', - a => '\x{00E0}', - e => '\x{00E8}', - i => '\x{00EC}', - n => '\x{01F9}', - o => '\x{00F2}', - u => '\x{00F9}', - w => '\x{1E81}', - y => '\x{1EF3}', - }, - "." => { # with dot above - A => '\x{0226}', - B => '\x{1E02}', - C => '\x{010A}', - D => '\x{1E0A}', - E => '\x{0116}', - F => '\x{1E1E}', - G => '\x{0120}', - H => '\x{1E22}', - I => '\x{0130}', - M => '\x{1E40}', - N => '\x{1E44}', - O => '\x{022E}', - P => '\x{1E56}', - R => '\x{1E58}', - S => '\x{1E60}', - T => '\x{1E6a}', - W => '\x{1E86}', - X => '\x{1E8A}', - Y => '\x{1E8E}', - Z => '\x{017B}', - "\\I" => '\x{0130}', - a => '\x{0227}', - b => '\x{1E03}', - c => '\x{010B}', - d => '\x{1E0B}', - e => '\x{0117}', - f => '\x{1e1f}', - g => '\x{0121}', - h => '\x{1E23}', - m => '\x{1E41}', - n => '\x{1E45}', - o => '\x{022F}', - p => '\x{1E57}', - r => '\x{1E59}', - s => '\x{1E61}', - t => '\x{1E6b}', - w => '\x{1E87}', - x => '\x{1E8b}', - y => '\x{1E8f}', - z => '\x{017C}', - }, - '=' => { # with macron - A => '\x{0100}', - AE => '\x{01E2}', - E => '\x{0112}', - G => '\x{1E20}', - I => '\x{012A}', - O => '\x{014C}', - U => '\x{016A}', - Y => '\x{0232}', - "\\I" => '\x{012A}', - "\\i" => '\x{012B}', - a => '\x{0101}', - ae => '\x{01E3}', - e => '\x{0113}', - g => '\x{1E21}', - i => '\x{012B}', - o => '\x{014D}', - u => '\x{016B}', - y => '\x{0233}', - }, - "~" => { # with tilde - A => '\x{00C3}', - E => '\x{1EBC}', - I => '\x{0128}', - N => '\x{00D1}', - O => '\x{00D5}', - U => '\x{0168}', - V => '\x{1E7C}', - Y => '\x{1EF8}', - "\\I" => '\x{0128}', - "\\i" => '\x{0129}', - a => '\x{00E3}', - e => '\x{1EBD}', - i => '\x{0129}', - n => '\x{00F1}', - o => '\x{00F5}', - u => '\x{0169}', - v => '\x{1E7D}', - y => '\x{1EF9}', - }, -); - -# Accent commands that are alphabetic. -# -our %ACCENT_LETTERS = ( - "H" => { # with double acute - O => '\x{0150}', - U => '\x{0170}', - o => '\x{0151}', - u => '\x{0171}', - }, - "c" => { # with cedilla - C => '\x{00C7}', - D => '\x{1E10}', - E => '\x{0228}', - G => '\x{0122}', - H => '\x{1E28}', - K => '\x{0136}', - L => '\x{013B}', - N => '\x{0145}', - R => '\x{0156}', - S => '\x{015E}', - T => '\x{0162}', - c => '\x{00E7}', - d => '\x{1E11}', - e => '\x{0229}', - g => '\x{0123}', - h => '\x{1E29}', - k => '\x{0137}', - l => '\x{013C}', - n => '\x{0146}', - r => '\x{0157}', - s => '\x{015F}', - t => '\x{0163}', - }, - "d" => { # with dot below - A => '\x{1EA0}', - B => '\x{1E04}', - D => '\x{1E0C}', - E => '\x{1EB8}', - H => '\x{1E24}', - I => '\x{1ECA}', - K => '\x{1E32}', - L => '\x{1E36}', - M => '\x{1E42}', - N => '\x{1E46}', - O => '\x{1ECC}', - R => '\x{1E5A}', - S => '\x{1E62}', - T => '\x{1E6C}', - U => '\x{1EE4}', - V => '\x{1E7E}', - W => '\x{1E88}', - Y => '\x{1Ef4}', - Z => '\x{1E92}', - "\\I" => '\x{1ECA}', - "\\i" => '\x{1ECB}', - a => '\x{1EA1}', - b => '\x{1E05}', - d => '\x{1E0D}', - e => '\x{1EB9}', - h => '\x{1E25}', - i => '\x{1ECB}', - k => '\x{1E33}', - l => '\x{1E37}', - m => '\x{1E43}', - n => '\x{1E47}', - o => '\x{1ECD}', - r => '\x{1E5b}', - s => '\x{1E63}', - t => '\x{1E6D}', - u => '\x{1EE5}', - v => '\x{1E7F}', - w => '\x{1E89}', - y => '\x{1EF5}', - z => '\x{1E93}', - }, - "h" => { # with hook above - A => '\x{1EA2}', - E => '\x{1EBA}', - I => '\x{1EC8}', - O => '\x{1ECe}', - U => '\x{1EE6}', - Y => '\x{1EF6}', - "\\I" => '\x{1EC8}', - "\\i" => '\x{1EC9}', - a => '\x{1EA3}', - e => '\x{1EBB}', - i => '\x{1EC9}', - o => '\x{1ECF}', - u => '\x{1EE7}', - y => '\x{1EF7}', - }, - "k" => { # with ogonek - A => '\x{0104}', - E => '\x{0118}', - I => '\x{012E}', - O => '\x{01EA}', - U => '\x{0172}', - "\\I" => '\x{012E}', - "\\i" => '\x{012F}', - a => '\x{0105}', - e => '\x{0119}', - i => '\x{012F}', - o => '\x{01EB}', - u => '\x{0173}', - }, - "r" => { # with ring above - A => '\x{00C5}', - U => '\x{016E}', - a => '\x{00E5}', - u => '\x{016F}', - w => '\x{1E98}', - y => '\x{1E99}', - }, - "u" => { # with breve - A => '\x{0102}', - E => '\x{0114}', - G => '\x{011E}', - I => '\x{012C}', - O => '\x{014E}', - U => '\x{016C}', - "\\I" => '\x{012C}', - "\\i" => '\x{012D}', - a => '\x{0103}', - e => '\x{0115}', - g => '\x{011F}', - i => '\x{012D}', - o => '\x{014F}', - u => '\x{016D}', - }, - "v" => { # with caron - A => '\x{01CD}', - C => '\x{010C}', - D => '\x{010E}', - DZ => '\x{01C4}', - E => '\x{011A}', - G => '\x{01E6}', - H => '\x{021E}', - I => '\x{01CF}', - K => '\x{01E8}', - L => '\x{013D}', - N => '\x{0147}', - O => '\x{01D1}', - R => '\x{0158}', - S => '\x{0160}', - T => '\x{0164}', - U => '\x{01D3}', - Z => '\x{017D}', - "\\I" => '\x{01CF}', - "\\i" => '\x{01D0}', - "\\j" => '\x{01F0}', - a => '\x{01CE}', - c => '\x{010D}', - d => '\x{010F}', - dz => '\x{01C6}', - e => '\x{011B}', - g => '\x{01E7}', - h => '\x{021F}', - i => '\x{01D0}', - j => '\x{01F0}', - k => '\x{01E9}', - l => '\x{013E}', - n => '\x{0148}', - o => '\x{01D2}', - r => '\x{0159}', - s => '\x{0161}', - t => '\x{0165}', - u => '\x{01D4}', - z => '\x{017E}', - }, -); - -# -our %GERMAN = ( # for package `german'/`ngerman' - '"a' => 'ä', - '"A' => 'Ä', - '"e' => 'ë', - '"E' => 'Ë', - '"i' => 'ï', - '"I' => 'Ï', - '"o' => 'ö', - '"O' => 'Ö', - '"u' => 'ü', - '"U' => 'Ü', - '"s' => 'ß', - '"S' => 'SS', - '"z' => 'ß', - '"Z' => 'SZ', - '"ck' => 'ck', # old spelling: ck -> k-k - '"ff' => 'ff', # old spelling: ff -> ff-f - '"`' => '„', - "\"'" => '“', - '"<' => '«', - '">' => '»', - '"-' => '\x{00AD}', # soft hyphen - '""' => '\x{200B}', # zero width space - '"~' => '\x{2011}', # non-breaking hyphen - '"=' => '-', - '\glq' => '‚', # left german single quote - '\grq' => '‘', # right german single quote - '\flqq' => '«', - '\frqq' => '»', - '\dq' => '"', -); - -1; - -__END__ -=pod - -=encoding UTF-8 - -=head1 NAME - -LaTeX::ToUnicode::Tables - Character tables for LaTeX::ToUnicode - -=head1 VERSION - -version 0.54 - -=head1 CONSTANTS - -=head2 @LIGATURES - -Standard TeX character sequences (not \commands) which need to be -replaced: C<---> with U+2014 (em dash), etc. Includes: em dash, en -dash, inverted exclamation, inverted question, left double quote, right -double quote, left single quote, right single quote. They are replaced -in that order. - -=head2 %MARKUPS - -Hash where keys are the names of formatting commands like C<\tt>, -without the backslash, namely: C<bf cal em it rm sc sf sl small tt>. Values -are the obvious HTML equivalent where one exists, given as the tag name -without the angle brackets: C<b em i tt>. Otherwise the value is the empty -string. - -=head2 %ARGUMENT_COMMANDS - -Hash where keys are the names of TeX commands taking arguments that we -handle, without the backslash, such as C<enquote>. Each value is a -reference to a list of two strings, the first being the text to insert -before the argument, the second being the text to insert after. For -example, for C<enquote> the value is C<["`", "'"]>. The inserted text is -subject to further replacements. - -Only three such commands are currently handled: C<\emph>, C<\enquote>, -and C<\path>. - -=head2 %CONTROL_SYMBOLS - -A hash where the keys are non-alphabetic C<\command>s (without the -backslash), other than accents and special cases. These don't take -arguments. Although some of these have Unicode equivalents, such as the -C<\,> thin space, it seems better to keep the output as simple as -possible; small spacing tweaks in TeX aren't usually desirable in plain -text or HTML. - -The values are single-quoted strings C<'\x{...}'>, not double-quoted -literal characters <"\x{...}">, to ease future parsing of the -TeX/text/HTML. - -This hash is necessary because TeX's parsing rules for control symbols -are different from control words: no space or other token is needed to -terminate control symbols. - -=head2 %CONTROL_WORDS - -Keys are names of argument-less commands, such as C<\LaTeX> (without the -backslash). Values are the replacements, often the empty string. - -=head2 %SYMBOLS - -Keys are the commands for extended characters, such as C<\AA> (without -the backslash.) - -=head2 %ACCENT_SYMBOLS - -Two-level hash of accented characters like C<\'{a}>. The keys of this -hash are the accent symbols (without the backslash), such as C<`> and -C<'>. The corresponding values are hash references where the keys are -the base letters and the values are single-quoted C<'\x{....}'> strings. - -=head2 %ACCENT_LETTERS - -Same as %ACCENT_SYMBOLS, except the keys are accents that are -alphabetic, such as C<\c> (without the backslash as always). - -As with control sequences, it's necessary to distinguish symbols and -alphabetic commands because of the different parsing rules. - -=head2 %GERMAN - -Character sequences (not necessarily commands) as defined by the package -`german'/`ngerman', e.g. C<"a> (a with umlaut), C<"s> (german sharp s) -or C<"`"> (german left quote). Note the missing backslash. - -The keys of this hash are the literal character sequences. - -=head1 AUTHOR - -Gerhard Gossen <gerhard.gossen@googlemail.com>, -Boris Veytsman <boris@varphi.com>, -Karl Berry <karl@freefriends.org> - -L<https://github.com/borisveytsman/bibtexperllibs> - -=head1 COPYRIGHT AND LICENSE - -Copyright 2010-2023 Gerhard Gossen, Boris Veytsman, Karl Berry - -This is free software; you can redistribute it and/or modify it under -the same terms as the Perl5 programming language system itself. - -=cut diff --git a/support/bibtexperllibs/LaTeX-ToUnicode/ltx2unitxt.1 b/support/bibtexperllibs/LaTeX-ToUnicode/ltx2unitxt.1 deleted file mode 100644 index 8dc8e71426..0000000000 --- a/support/bibtexperllibs/LaTeX-ToUnicode/ltx2unitxt.1 +++ /dev/null @@ -1,73 +0,0 @@ -.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.49.3. -.TH LTX2UNITXT "1" "November 2023" "ltx2unitxt " "User Commands" -.SH NAME -ltx2unitxt \- convert LaTeX source fragment to plain (Unicode) text or simple html -.SH SYNOPSIS -.B ltx2unitxt -[\fI\,-c CONFIG\/\fR] [\fI\,-o OUTPUT\/\fR] [\fI\,--html\/\fR] [...] [\fI\,INFILE\/\fR]... -.SH DESCRIPTION -Convert the LaTeX source in INFILE (or standard input) to plain text -using Unicode code points for accents and other special characters; or, -optionally, output HTML with simple translations for font changes and url -commands. -.PP -Common accent sequences, special characters, and simple markup commands -are translated, but there is no attempt at completeness. Math, tables, -figures, sectioning, etc., are not handled in any way, and mostly left -in their TeX form in the output. The translations assume standard LaTeX -meanings for characters and control sequences; macros in the input are -not considered. -.PP -The input can be a fragment of text, not a full document, as the purpose -of this script was to handle bibliography entries and abstracts (for the -ltx2crossrefxml script that is part of the crossrefware package). -Patches to extend this script are welcome. It uses the LaTeX::ToUnicode -Perl library for the conversion; see its documentation for details. -.PP -Conversion is currently done line by line, so TeX constructs that cross -multiple lines are not handled properly. If it turns out to be useful, -conversion could be done by paragraph instead. -.PP -The config file is read as a Perl source file. It can define a function -`LaTeX_ToUnicode_convert_hook()' which will be called early; the value -it returns (which must be a string) will then be subject to the standard -conversion. -.PP -For an example of using this script and associated code, see the TUGboat -processing at -https://github.com/TeXUsersGroup/tugboat/tree/trunk/capsules/crossref. -.SH OPTIONS -.TP -\fB\-c\fR, \fB\-\-config\fR=\fI\,FILE\/\fR -read (Perl) config FILE for a hook, as explained above -.TP -\fB\-e\fR, \fB\-\-entities\fR -output entities &#xNNNN; instead of literal characters -.TP -\fB\-g\fR, \fB\-\-german\fR -handle some features of the german package -.TP -\fB\-h\fR, \fB\-\-html\fR -output simplistic HTML instead of plain text -.TP -\fB\-o\fR, \fB\-\-output\fR=\fI\,FILE\/\fR -output to FILE instead of stdout -.TP -\fB\-v\fR, \fB\-\-verbose\fR -be verbose -.TP -\fB\-V\fR, \fB\-\-version\fR -output version information and exit -.TP -\-?, \fB\-\-help\fR -display this help and exit -.PP -Options can be abbreviated unambiguously, and start with either \- or \fB\-\-\fR. -.PP -Dev sources, bug tracker: https://github.com/borisveytsman/bibtexperllibs -Releases: https://ctan.org/pkg/bibtexperllibs -.PP -ltx2unitxt (bibtexperllibs) 0.51 -Copyright 2023 Karl Berry. -This is free software: you can redistribute it and/or -modify it under the same terms as Perl itself. diff --git a/support/bibtexperllibs/LaTeX-ToUnicode/ltx2unitxt.pdf b/support/bibtexperllibs/LaTeX-ToUnicode/ltx2unitxt.pdf Binary files differdeleted file mode 100644 index 7dfae7f396..0000000000 --- a/support/bibtexperllibs/LaTeX-ToUnicode/ltx2unitxt.pdf +++ /dev/null diff --git a/support/bibtexperllibs/LaTeX-ToUnicode/script/convert.pl b/support/bibtexperllibs/LaTeX-ToUnicode/script/convert.pl deleted file mode 100644 index 70cc0bda84..0000000000 --- a/support/bibtexperllibs/LaTeX-ToUnicode/script/convert.pl +++ /dev/null @@ -1,156 +0,0 @@ -#!/usr/bin/perl - -use strict; -use warnings; -use utf8; - -use feature 'say'; -use FindBin; - -my $UNICODE_DATA_URL = "http://www.unicode.org/Public/UNIDATA/UnicodeData.txt"; - - -my $stream; -if ( -f "$FindBin::Bin/UnicodeData.txt" ) { - open $stream, "<", "$FindBin::Bin/UnicodeData.txt" or die; -} else { - open $stream, "-|", "curl $UNICODE_DATA_URL" or die; -} -my %data; - -my %chars = ( - 'ACUTE' => "'", - 'ACUTE AND DOT ABOVE' => '', - 'BAR' => '', - 'BELT' => '', - 'BREVE' => 'u', - 'BREVE AND ACUTE' => '', - 'BREVE AND DOT BELOW' => '', - 'BREVE AND GRAVE' => '', - 'BREVE AND HOOK ABOVE' => '', - 'BREVE AND TILDE' => '', - 'BREVE BELOW' => '', - 'CARON' => 'v', - 'CARON AND DOT ABOVE' => '', - 'CEDILLA' => 'c', - 'CEDILLA AND ACUTE' => '', - 'CEDILLA AND BREVE' => '', - 'CIRCUMFLEX' => '^', - 'CIRCUMFLEX AND ACUTE' => '', - 'CIRCUMFLEX AND DOT BELOW' => '', - 'CIRCUMFLEX AND GRAVE' => '', - 'CIRCUMFLEX AND HOOK ABOVE' => '', - 'CIRCUMFLEX AND TILDE' => '', - 'CIRCUMFLEX BELOW' => '', - 'COMMA' => '', - 'COMMA BELOW' => '', - 'CROSSED-TAIL' => '', - 'CURL' => '', - 'DESCENDER' => '', - 'DIAERESIS' => '"', - 'DIAERESIS AND ACUTE' => '', - 'DIAERESIS AND CARON' => '', - 'DIAERESIS AND GRAVE' => '', - 'DIAERESIS AND MACRON' => '', - 'DIAERESIS BELOW' => '', - 'DIAGONAL STROKE' => '', - 'DOT ABOVE' => '.', - 'DOT ABOVE AND MACRON' => '', - 'DOT BELOW' => 'd', - 'DOT BELOW AND DOT ABOVE' => '', - 'DOT BELOW AND MACRON' => '', - 'DOUBLE ACUTE' => 'H', - 'DOUBLE BAR' => '', - 'DOUBLE GRAVE' => '', - 'FISHHOOK' => '', - 'FISHHOOK AND MIDDLE TILDE' => '', - 'FLOURISH' => '', - 'GRAVE' => '`', - 'HIGH STROKE' => '', - 'HOOK' => '', - 'HOOK ABOVE' => 'h', - 'HOOK AND TAIL' => '', - 'HOOK TAIL' => '', - 'HORIZONTAL BAR' => '', - 'HORN' => '', - 'HORN AND ACUTE' => '', - 'HORN AND DOT BELOW' => '', - 'HORN AND GRAVE' => '', - 'HORN AND HOOK ABOVE' => '', - 'HORN AND TILDE' => '', - 'INVERTED BREVE' => '', - 'LEFT HOOK' => '', - 'LINE BELOW' => '', - 'LONG LEG' => '', - 'LONG RIGHT LEG' => '', - 'LONG STROKE OVERLAY' => '', - 'LOOP' => '', - 'LOW RING INSIDE' => '', - 'MACRON' => '=', - 'MACRON AND ACUTE' => '', - 'MACRON AND DIAERESIS' => '', - 'MACRON AND GRAVE' => '', - 'MIDDLE DOT' => '', - 'MIDDLE TILDE' => '', - 'NOTCH' => '', - 'OGONEK' => 'k', - 'OGONEK AND MACRON' => '', - 'PALATAL HOOK' => '', - 'RETROFLEX HOOK' => '', - 'RIGHT HALF RING' => '', - 'RIGHT HOOK' => '', - 'RING ABOVE' => 'r', - 'RING ABOVE AND ACUTE' => '', - 'RING BELOW' => '', - 'SMALL LETTER J' => '', - 'SMALL LETTER Z' => '', - 'SMALL LETTER Z WITH CARON' => '', - 'SQUIRREL TAIL' => '', - 'STRIKETHROUGH' => '', - 'STROKE' => '', - 'STROKE AND ACUTE' => '', - 'STROKE AND DIAGONAL STROKE' => '', - 'STROKE THROUGH DESCENDER' => '', - 'SWASH TAIL' => '', - 'TAIL' => '', - 'TILDE' => '~', - 'TILDE AND ACUTE' => '', - 'TILDE AND DIAERESIS' => '', - 'TILDE AND MACRON' => '', - 'TILDE BELOW' => '', - 'TOPBAR' => '', -); - -my %missing; - -while(<$stream>) { - chomp; - my @F = split /;/; - my $hex = $F[0]; - if ( $F[1] =~ /LATIN (SMALL|CAPITAL) LETTER ((?:\w+ )*\w{1,2}) WITH (.+)$/ ) { - my $case = $1; - my $letter = $2; - my $accent = $3; - - if ( $case eq 'SMALL' ) { - $letter = lc $letter; - } - if ( $chars{$accent} && $letter !~ / / ) { - my $char = chr( eval "0x$hex" ); - $data{ $chars{$accent} }->{ $letter } = $char; - if ( lc( $letter ) eq 'i' ) { - my $additional_letter = "\\$letter"; - $data{ $chars{$accent} }->{ $additional_letter } = $char; - } - } else { - push @{ $missing{$accent} }, $letter; - } - } -} - -use Data::Dumper::Concise; - -binmode(STDOUT, ":utf8"); - -say Dumper( \%data ); -#say Dumper( \%missing ); diff --git a/support/bibtexperllibs/LaTeX-ToUnicode/script/ltx2unitxt b/support/bibtexperllibs/LaTeX-ToUnicode/script/ltx2unitxt deleted file mode 100755 index 661ea40417..0000000000 --- a/support/bibtexperllibs/LaTeX-ToUnicode/script/ltx2unitxt +++ /dev/null @@ -1,169 +0,0 @@ -#!/usr/bin/env perl -# Use the LaTeX::ToUnicode module (also in the bibtexperllibs -# repository/package, like this script) to convert LaTeX to Unicode. -# -# We work on fragments of text, not whole documents, the goal being to -# replace LaTeX commands and syntax with obvious plain text equivalents, -# or remove them. - -use strict; -use warnings; - -use Cwd; -use File::Basename; -use File::Spec; - -BEGIN { - # find files relative to our installed location within TeX Live - chomp(my $TLMaster = `kpsewhich -var-value=SELFAUTOPARENT`); # TL root - if (length($TLMaster)) { - unshift @INC, "$TLMaster/texmf-dist/scripts/bibtexperllibs"; - } - # find development bibtexperllibs in sibling checkout to this script, - # even if $0 is a symlink. Irrelevant when using from an installation. - my $real0 = Cwd::abs_path($0); - my $scriptdir = File::Basename::dirname($real0); - my $dev_btxperllibs = Cwd::abs_path("$scriptdir/../.."); - - # we need the lib/ subdirectories inside ... - unshift (@INC, glob ("$dev_btxperllibs/*/lib")) if -d $dev_btxperllibs; - -} - -use LaTeX::ToUnicode; - -our %opts; -local *OUT; # output filehandle - -exit(main()); - -sub main { - init(); - - # by paragraph? - while (<>) { - print OUT (convert($_)); - } - - return 0; -} - -sub convert { - my ($in) = @_; - - my @args = (); # what we'll pass to the convert() fn. - # - if (defined(&{"LaTeX_ToUnicode_convert_hook"})) { - push (@args, "hook" => \&LaTeX_ToUnicode_convert_hook); } - if ($opts{e}) { push (@args, "entities" => 1); } - if ($opts{g}) { push (@args, "german" => 1); } - if ($opts{h}) { push (@args, "html" => 1); } - - LaTeX::ToUnicode::debuglevel($opts{v}); - my $out = LaTeX::ToUnicode::convert($in, @args); - - #warn "out=$out"; - return $out; -} - - -# Command line options, etc. -# -sub init { - my $USAGE = <<END; -Usage: $0 [-c CONFIG] [-o OUTPUT] [--html] [...] [INFILE]... - -Convert the LaTeX source in INFILE (or standard input) to plain text -using Unicode code points for accents and other special characters; or, -optionally, output HTML with simple translations for font changes and url -commands. - -Common accent sequences, special characters, and simple markup commands -are translated, but there is no attempt at completeness. Math, tables, -figures, sectioning, etc., are not handled in any way, and mostly left -in their TeX form in the output. The translations assume standard LaTeX -meanings for characters and control sequences; macros in the input are -not considered. - -The input can be a fragment of text, not a full document, as the purpose -of this script was to handle bibliography entries and abstracts (for the -ltx2crossrefxml script that is part of the crossrefware package). -Patches to extend this script are welcome. It uses the LaTeX::ToUnicode -Perl library for the conversion; see its documentation for details. - -Conversion is currently done line by line, so TeX constructs that cross -multiple lines are not handled properly. If it turns out to be useful, -conversion could be done by paragraph instead. - -The config file is read as a Perl source file. It can define a function -`LaTeX_ToUnicode_convert_hook()' which will be called early; the value -it returns (which must be a string) will then be subject to the standard -conversion. - -For an example of using this script and associated code, see the TUGboat -processing at -https://github.com/TeXUsersGroup/tugboat/tree/trunk/capsules/crossref. - -Options: - -c, --config=FILE read (Perl) config FILE for a hook, as explained above - -e, --entities output entities &#xNNNN; instead of literal characters - -g, --german handle some features of the german package - -h, --html output simplistic HTML instead of plain text - -o, --output=FILE output to FILE instead of stdout - -v, --verbose be verbose - -V, --version output version information and exit - -?, --help display this help and exit - -Options can be abbreviated unambiguously, and start with either - or --. - -Dev sources, bug tracker: https://github.com/borisveytsman/bibtexperllibs -Releases: https://ctan.org/pkg/bibtexperllibs -END - - my $VERSION = <<END; -ltx2unitxt (bibtexperllibs) 0.51 -Copyright 2023 Karl Berry. -This is free software: you can redistribute it and/or -modify it under the same terms as Perl itself. -END - - use Getopt::Long qw(:config no_ignore_case); # otherwise v|V is the same - - GetOptions( - "config|c=s" => \($opts{c}), - "entities|e" => \($opts{e}), - "german|g" => \($opts{g}), - "html|h" => \($opts{h}), - "output|o=s" => \($opts{o}), - "verbose|v" => \($opts{v}), - "version|V" => \($opts{V}), - "help|?" => \($opts{help})) - || die "Try $0 --help for more information.\n"; - - if ($opts{help}) { print "$USAGE\n$VERSION"; exit 0; } - if ($opts{V}) { print $VERSION; exit 0; } - - binmode(STDOUT, ":utf8"); - *OUT = *STDOUT; - - if (defined($opts{o})) { - open(OUT, ">$opts{o}") || die "open(>$opts{o}) failed: $!\n"; - binmode(OUT, ":utf8") - } - - if ($opts{c}) { - if (-r $opts{c}) { - # if config arg is absolute, fine; if not, prepend "./" as slightly - # less troublesome than putting "." in the @INC path. - my $rel = (File::Spec->file_name_is_absolute($opts{c}) ? "" : "./"); - my $cnffile = "$rel$opts{c}"; - verbose("requiring config file: $cnffile"); - require $cnffile; - } else { - die "open config file ($opts{c}) for reading failed: $!\n"; - } - } -} - - -sub verbose { print @_ if $::opts{v}; } diff --git a/support/bibtexperllibs/LaTeX-ToUnicode/t/convert.t b/support/bibtexperllibs/LaTeX-ToUnicode/t/convert.t deleted file mode 100644 index 9bd7a4f3d4..0000000000 --- a/support/bibtexperllibs/LaTeX-ToUnicode/t/convert.t +++ /dev/null @@ -1,136 +0,0 @@ -use strict; -use warnings; - -use Test::More; -use utf8; - -BEGIN{ use_ok( 'LaTeX::ToUnicode', qw( convert ) ); } - -binmode( STDOUT, ':utf8' ); -my @tests = ( - [ '\LaTeX' => 'LaTeX' ], - [ '\$ \% \& \_ \{ \} \#' => '$ % & _ { } #' ], - [ '{\"{a}}' => 'ä' ], - [ '{\"a}' => 'ä' ], - [ '{\`{a}}' => 'à' ], - [ '{\`a}' => 'à' ], - [ '\ae' => 'æ' ], - [ '\L' => 'Ł' ], - [ "{\\'e}" => 'é'], - ['\={a}' => 'ā'], - ['{\=a}' => 'ā'], -); - -foreach my $test ( @tests ) { - is( convert( $test->[0] ), $test->[1], "Convert $test->[0]" ); -} - -my @german_tests = ( - [ '"a' => 'ä' ], - ['"`' => '„' ], - ["\"'" => '“' ], -); - -foreach my $test ( @german_tests ) { - is( convert( $test->[0], german => 1 ), $test->[1], "Convert $test->[0], german => 1" ); -} - -binmode( DATA, ':utf8' ); -while (<DATA>) { - chomp; - my ( $tex, $result ) = split /\t/; - is( convert( $tex ), $result, "Convert $tex" ); -} -close DATA; - -done_testing; - -__DATA__ -\& & -{\`a} à -{\^a} â -{\~a} ã -{\'a} á -{\'{a}} á -{\"a} ä -{\`A} À -{\'A} Á -{\"A} Ä -{\aa} å -{\AA} Å -{\ae} æ -{\bf 12} 12 -{\'c} ć -{\cal P} P -{\c{c}} ç -{\c{C}} Ç -{\c{e}} ȩ -{\c{s}} ş -{\c{S}} Ş -{\c{t}} ţ -{\-d} d -{\`e} è -{\^e} ê -{\'e} é -{\"e} ë -{\'E} É -{\em bits} bits -{\H{o}} ő -{\`i} ì -{\^i} î -{\i} ı -{\`i} ì -{\'i} í -{\"i} ï -{\`\i} ì -{\'\i} í -{\"\i} ï -{\`{\i}} ì -{\'{\i}} í -{\"{\i}} ï -{\it Note} Note -{\k{e}} ę -{\l} ł -{\-l} l -{\log} log -{\~n} ñ -{\'n} ń -{\^o} ô -{\o} ø -{\'o} ó -{\"o} ö -{\"{o}} ö -{\'O} Ó -{\"O} Ö -{\"{O}} Ö -{\rm always} always -{\-s} s -{\'s} ś -{\sc JoiN} JoiN -{\sl bit\/ \bf 7} bit 7 -{\sl L'Informatique Nouvelle} L’Informatique Nouvelle -{\small and} and -{\ss} ß -{\TeX} TeX -{\TM} ™ -{\tt awk} awk -{\^u} û -{\'u} ú -{\"u} ü -{\"{u}} ü -{\'U} Ú -{\"U} Ü -{\u{a}} ă -{\u{g}} ğ -{\v{c}} č -{\v{C}} Č -{\v{e}} ě -{\v{n}} ň -{\v{r}} ř -{\v{s}} š -{\v{S}} Š -{\v{z}} ž -{\v{Z}} Ž -{\'y} ý -{\.{z}} ż -Herv{\`e} Br{\"o}nnimann Hervè Brönnimann diff --git a/support/bibtexperllibs/LaTeX-ToUnicode/t/release-pod-coverage.t b/support/bibtexperllibs/LaTeX-ToUnicode/t/release-pod-coverage.t deleted file mode 100644 index 3a818499f0..0000000000 --- a/support/bibtexperllibs/LaTeX-ToUnicode/t/release-pod-coverage.t +++ /dev/null @@ -1,21 +0,0 @@ -#!perl - -BEGIN { - unless ($ENV{RELEASE_TESTING}) { - require Test::More; - Test::More::plan(skip_all => 'these tests are for release candidate testing'); - } -} - - -use Test::More; - -eval "use Test::Pod::Coverage 1.08"; -plan skip_all => "Test::Pod::Coverage 1.08 required for testing POD coverage" - if $@; - -eval "use Pod::Coverage::TrustPod"; -plan skip_all => "Pod::Coverage::TrustPod required for testing POD coverage" - if $@; - -all_pod_coverage_ok({ coverage_class => 'Pod::Coverage::TrustPod' }); diff --git a/support/bibtexperllibs/LaTeX-ToUnicode/t/release-pod-syntax.t b/support/bibtexperllibs/LaTeX-ToUnicode/t/release-pod-syntax.t deleted file mode 100644 index d46a955694..0000000000 --- a/support/bibtexperllibs/LaTeX-ToUnicode/t/release-pod-syntax.t +++ /dev/null @@ -1,15 +0,0 @@ -#!perl - -BEGIN { - unless ($ENV{RELEASE_TESTING}) { - require Test::More; - Test::More::plan(skip_all => 'these tests are for release candidate testing'); - } -} - -use Test::More; - -eval "use Test::Pod 1.41"; -plan skip_all => "Test::Pod 1.41 required for testing POD" if $@; - -all_pod_files_ok(); diff --git a/support/bibtexperllibs/LaTeX-ToUnicode/t/release-synopsis.t b/support/bibtexperllibs/LaTeX-ToUnicode/t/release-synopsis.t deleted file mode 100644 index 7a83682539..0000000000 --- a/support/bibtexperllibs/LaTeX-ToUnicode/t/release-synopsis.t +++ /dev/null @@ -1,16 +0,0 @@ -#!perl - -BEGIN { - unless ($ENV{RELEASE_TESTING}) { - require Test::More; - Test::More::plan(skip_all => 'these tests are for release candidate testing'); - } -} - - -use Test::More; - -eval "use Test::Synopsis"; -plan skip_all => "Test::Synopsis required for testing synopses" - if $@; -all_synopsis_ok('lib'); diff --git a/support/bibtexperllibs/LaTeX-ToUnicode/weaver.ini b/support/bibtexperllibs/LaTeX-ToUnicode/weaver.ini deleted file mode 100644 index 1cc341ff23..0000000000 --- a/support/bibtexperllibs/LaTeX-ToUnicode/weaver.ini +++ /dev/null @@ -1,24 +0,0 @@ -[-Encoding] -[@CorePrep] - -[Name] -[Version] - -[Region / prelude] - -[Generic / SYNOPSIS] -[Generic / DESCRIPTION] -[Generic / OVERVIEW] - -[Collect / ATTRIBUTES] -command = attr - -[Collect / METHODS] -command = method - -[Leftovers] - -[Region / postlude] - -[Authors] -[Legal] diff --git a/support/bibtexperllibs/Makefile b/support/bibtexperllibs/Makefile deleted file mode 100644 index d1b0bdc84d..0000000000 --- a/support/bibtexperllibs/Makefile +++ /dev/null @@ -1,27 +0,0 @@ -# -# This is Makefile for TDS-compliant TeX distributions -# Written by Boris Veytsman, boris@varphi.com -# -# This file is in public domain -# - -PACKAGE = bibtexperllibs - -DIRS = BibTeX-Parser LaTeX-ToUnicode - -all: - -clean: - for dir in ${DIRS}; do (cd $$dir && ${MAKE} -f Makefile.TDS clean); done - - -distclean: clean - for dir in ${DIRS}; do (cd $$dir && ${MAKE} -f Makefile.TDS distclean); done - -install: - for dir in ${DIRS}; do (cd $$dir && ${MAKE} -f Makefile.TDS install); done - -archive: - for dir in ${DIRS}; do (cd $$dir && ${MAKE} -f Makefile.TDS docs); done - for dir in ${DIRS}; do (cd $$dir && ${MAKE} -f Makefile.TDS clean); done - COPYFILE_DISABLE=1 tar -czvf ../$(PACKAGE).tgz -C .. --exclude '*~' --exclude '*.tgz' --exclude CVS --exclude .git --exclude .gitignore --exclude blib --exclude "*.tar.gz" --exclude pm_to_blib $(PACKAGE) diff --git a/support/bibtexperllibs/README b/support/bibtexperllibs/README deleted file mode 100644 index fef3d0b276..0000000000 --- a/support/bibtexperllibs/README +++ /dev/null @@ -1,49 +0,0 @@ - BibTeX Perl Libs - Version 1.9 - Gerhard Gossen, Boris Veytsman, Karl Berry - -This package provides BibTeX-related Perl libraries by Gerhard Gossen, -maintained and repackaged by Boris Veytsman for TeX Live and other -TDS-compliant distributions. The libraries are written in pure Perl, -so shoud work out of the box on any architecture. - -To use them in your scripts, add to the @INC variable the directory -scripts/bibtexperllibs inside your TeX distribution. A script ltx2unitxt -packages the conversion libraries for use from the command line. - -Bug reports, source code: https://github.com/borisveytsman/bibtexperllibs -Releases: https://ctan.org/pkg/bibtexperllibs - -For an example of using the LaTeX::ToUnicode module, see the -crossrefware package (which is also the reason for continued development). - -Changes: - - version 1.9 2023-11-18 Now braces are rendered correctly by - LaTeX-ToUnicode - - version 1.8 2023-08-20 Tests updates, timestamp updates. - - version 1.7 2021-01-20 LaTeX::ToUnicode 0.51 for still more - ltx2crossrefxml support, including simple html output. - (No changes to BibTeX::Parser.) - - version 1.6 2020-12-10 LaTeX::ToUnicode 0.11 for more ltx2crossrefxml - support. (No changes to BibTeX::Parser.) - - version 1.5 Upgraded BibTeX::Parser to 1.02 (bugfixes) - - version 1.4 Upgraded BibTeX::Parser to 1.01 - - version 1.3 Upgraded BibTeX::Parser to 1.00 - - version 1.2 Upgraded BibTeX::Parser to v0.70 and LaTeX::ToUnicode to 0.05 - - version 1.1 Upgraded BibTeX::Parser to v0.69 - - version 1.0 Upgraded BibTeX::Parser to v0.68 and LaTeX::ToUnicode to 0.04 - - version 0.2 New upstream version for BibTeX::Parser (0.66) - -This is free software; you can redistribute it and/or modify it under -the same terms as the Perl 5 programming language system itself. |